@oneuptime/common 14.0.10 → 14.0.12

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.
Files changed (2124) hide show
  1. package/Models/AnalyticsModels/AuditLog.ts +63 -0
  2. package/Models/AnalyticsModels/Log.ts +26 -3
  3. package/Models/AnalyticsModels/Metric.ts +28 -3
  4. package/Models/AnalyticsModels/MetricItemAggMV1m.ts +21 -3
  5. package/Models/AnalyticsModels/SloHistory.ts +6 -4
  6. package/Models/DatabaseModels/AIConversation.ts +127 -1
  7. package/Models/DatabaseModels/AutoRemediationRule.ts +1 -1
  8. package/Models/DatabaseModels/CephCluster.ts +12 -0
  9. package/Models/DatabaseModels/CloudResource.ts +12 -0
  10. package/Models/DatabaseModels/CodeRepository.ts +1 -1
  11. package/Models/DatabaseModels/Dashboard.ts +148 -0
  12. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +11 -0
  13. package/Models/DatabaseModels/DatabaseServer.ts +12 -0
  14. package/Models/DatabaseModels/DatabaseServerEndpoint.ts +1 -0
  15. package/Models/DatabaseModels/DockerHost.ts +12 -0
  16. package/Models/DatabaseModels/DockerSwarmCluster.ts +12 -0
  17. package/Models/DatabaseModels/EnterpriseLicense.ts +2 -0
  18. package/Models/DatabaseModels/EnterpriseLicenseInstance.ts +1 -0
  19. package/Models/DatabaseModels/GlobalOidc.ts +0 -4
  20. package/Models/DatabaseModels/GlobalOidcProject.ts +0 -4
  21. package/Models/DatabaseModels/GlobalSso.ts +0 -4
  22. package/Models/DatabaseModels/GlobalSsoProject.ts +0 -4
  23. package/Models/DatabaseModels/Host.ts +12 -0
  24. package/Models/DatabaseModels/IncidentForm.ts +594 -0
  25. package/Models/DatabaseModels/IncidentFormSubmission.ts +283 -0
  26. package/Models/DatabaseModels/IncidentTemplate.ts +59 -0
  27. package/Models/DatabaseModels/IncomingCallLog.ts +13 -0
  28. package/Models/DatabaseModels/Index.ts +20 -0
  29. package/Models/DatabaseModels/IoTFleet.ts +12 -0
  30. package/Models/DatabaseModels/KubernetesCluster.ts +12 -0
  31. package/Models/DatabaseModels/LlmModelPrice.ts +1 -0
  32. package/Models/DatabaseModels/McpOAuthClient.ts +191 -0
  33. package/Models/DatabaseModels/McpOAuthGrant.ts +464 -0
  34. package/Models/DatabaseModels/McpOAuthToken.ts +228 -0
  35. package/Models/DatabaseModels/MessageQueue.ts +1102 -0
  36. package/Models/DatabaseModels/MessageQueueLabelRule.ts +553 -0
  37. package/Models/DatabaseModels/MessageQueueOwnerRule.ts +633 -0
  38. package/Models/DatabaseModels/MessageQueueOwnerTeam.ts +491 -0
  39. package/Models/DatabaseModels/MessageQueueOwnerUser.ts +490 -0
  40. package/Models/DatabaseModels/Monitor.ts +157 -0
  41. package/Models/DatabaseModels/MonitorSecret.ts +93 -1
  42. package/Models/DatabaseModels/NetworkEndpoint.ts +1 -0
  43. package/Models/DatabaseModels/OnCallDutyPolicy.ts +155 -0
  44. package/Models/DatabaseModels/PodmanHost.ts +12 -0
  45. package/Models/DatabaseModels/Project.ts +103 -101
  46. package/Models/DatabaseModels/ProjectOidc.ts +0 -4
  47. package/Models/DatabaseModels/ProjectSso.ts +0 -4
  48. package/Models/DatabaseModels/ProxmoxCluster.ts +12 -0
  49. package/Models/DatabaseModels/RumApplication.ts +12 -0
  50. package/Models/DatabaseModels/ServerlessFunction.ts +12 -0
  51. package/Models/DatabaseModels/Service.ts +12 -0
  52. package/Models/DatabaseModels/StatusPage.ts +155 -0
  53. package/Models/DatabaseModels/StatusPageOidc.ts +0 -4
  54. package/Models/DatabaseModels/StatusPageSso.ts +0 -4
  55. package/Models/DatabaseModels/TeamComplianceSetting.ts +47 -2
  56. package/Models/DatabaseModels/TelemetrySourceMap.ts +1 -0
  57. package/Models/DatabaseModels/VMwareVCenter.ts +12 -0
  58. package/Models/DatabaseModels/Workflow.ts +226 -7
  59. package/Server/API/AIAgentDataAPI.ts +1 -1
  60. package/Server/API/AIChatAPI.ts +13 -114
  61. package/Server/API/AIInvestigationAPI.ts +3 -3
  62. package/Server/API/AIInvestigationConversationAPI.ts +266 -0
  63. package/Server/API/AutoRemediationAPI.ts +9 -41
  64. package/Server/API/CommonAPI.ts +19 -0
  65. package/Server/API/DashboardAPI.ts +7 -3
  66. package/Server/API/IncidentFormAPI.ts +376 -0
  67. package/Server/API/ProjectOIDC.ts +16 -25
  68. package/Server/API/ProjectSSO.ts +16 -24
  69. package/Server/API/StatusPageAPI.ts +185 -166
  70. package/Server/Enterprise/EnterpriseEdition.ts +93 -28
  71. package/Server/Enterprise/EnterpriseFeature.ts +25 -3
  72. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +1 -1
  73. package/Server/Enterprise/EnterpriseServerModule.ts +4 -1
  74. package/Server/EnvironmentConfig.ts +28 -1
  75. package/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.ts +129 -0
  76. package/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.ts +52 -0
  77. package/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.ts +75 -0
  78. package/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.ts +477 -0
  79. package/Server/Infrastructure/Postgres/SchemaMigrations/1796800000000-FoldAiSwitchesIntoEnableAi.ts +105 -0
  80. package/Server/Infrastructure/Postgres/SchemaMigrations/1796900000000-AddMcpOAuthTables.ts +97 -0
  81. package/Server/Infrastructure/Postgres/SchemaMigrations/1797000000000-AddWorkflowIncomingEmailSecretKey.ts +36 -0
  82. package/Server/Infrastructure/Postgres/SchemaMigrations/1797100000000-AddMonitorSecretAccess.ts +55 -0
  83. package/Server/Infrastructure/Postgres/SchemaMigrations/1797200000000-AddArchiveToMoreResources.ts +167 -0
  84. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +18 -0
  85. package/Server/Middleware/IncidentFormRateLimit.ts +847 -0
  86. package/Server/Middleware/McpDelegationAuthorization.ts +204 -0
  87. package/Server/Middleware/McpOAuthRateLimit.ts +287 -0
  88. package/Server/Middleware/ProjectAuthorization.ts +23 -2
  89. package/Server/Middleware/UserAuthorization.ts +28 -38
  90. package/Server/Services/AIService.ts +11 -14
  91. package/Server/Services/AnalyticsDatabaseService.ts +22 -5
  92. package/Server/Services/ApiKeyService.ts +31 -7
  93. package/Server/Services/AutoRemediationRuleEngineService.ts +15 -27
  94. package/Server/Services/AutoRemediationRuleService.ts +1 -1
  95. package/Server/Services/DashboardService.ts +7 -2
  96. package/Server/Services/DatabaseServerService.ts +219 -0
  97. package/Server/Services/DatabaseService.ts +29 -32
  98. package/Server/Services/InboundEmail/InboundEmailProvider.ts +44 -0
  99. package/Server/Services/InboundEmail/Providers/SendGridInboundProvider.ts +57 -1
  100. package/Server/Services/IncidentCustomFieldService.ts +112 -2
  101. package/Server/Services/IncidentEpisodeMemberService.ts +24 -4
  102. package/Server/Services/IncidentEpisodeService.ts +10 -1
  103. package/Server/Services/IncidentFormService.ts +1566 -0
  104. package/Server/Services/IncidentFormSubmissionService.ts +97 -0
  105. package/Server/Services/IncidentGroupingEngineService.ts +45 -8
  106. package/Server/Services/IncidentService.ts +123 -5
  107. package/Server/Services/IncidentTemplateService.ts +22 -0
  108. package/Server/Services/IncomingCallMissedCallNotificationService.ts +280 -0
  109. package/Server/Services/IncomingCallPolicyService.ts +118 -0
  110. package/Server/Services/Index.ts +22 -0
  111. package/Server/Services/KubernetesClusterAiAccessService.ts +10 -47
  112. package/Server/Services/KubernetesClusterService.ts +3 -3
  113. package/Server/Services/LogAggregationService.ts +38 -5
  114. package/Server/Services/McpOAuthClientService.ts +148 -0
  115. package/Server/Services/McpOAuthGrantService.ts +275 -0
  116. package/Server/Services/McpOAuthTokenService.ts +213 -0
  117. package/Server/Services/MessageQueueLabelRuleEngineService.ts +321 -0
  118. package/Server/Services/MessageQueueLabelRuleService.ts +14 -0
  119. package/Server/Services/MessageQueueOwnerRuleEngineService.ts +412 -0
  120. package/Server/Services/MessageQueueOwnerRuleService.ts +14 -0
  121. package/Server/Services/MessageQueueOwnerTeamService.ts +62 -0
  122. package/Server/Services/MessageQueueOwnerUserService.ts +62 -0
  123. package/Server/Services/MessageQueueService.ts +1463 -0
  124. package/Server/Services/MetricAggregationService.ts +4 -4
  125. package/Server/Services/MonitorGroupService.ts +49 -28
  126. package/Server/Services/MonitorProbeService.ts +1 -0
  127. package/Server/Services/MonitorSecretService.ts +425 -0
  128. package/Server/Services/MonitorService.ts +15 -1
  129. package/Server/Services/OnCallDutyPolicyService.ts +36 -2
  130. package/Server/Services/OpenTelemetryIngestService.ts +37 -4
  131. package/Server/Services/ProjectService.ts +50 -80
  132. package/Server/Services/ResourceAiAccessService.ts +3 -14
  133. package/Server/Services/RunnerJobService.ts +2 -2
  134. package/Server/Services/RunnerService.ts +2 -2
  135. package/Server/Services/StatusPagePrivateUserService.ts +1 -4
  136. package/Server/Services/StatusPageService.ts +67 -59
  137. package/Server/Services/StatusPageSubscriberService.ts +23 -0
  138. package/Server/Services/TeamComplianceSettingService.ts +163 -42
  139. package/Server/Services/TeamMemberService.ts +352 -84
  140. package/Server/Services/UserNotificationRuleService.ts +8 -1
  141. package/Server/Services/UserNotificationSettingService.ts +20 -0
  142. package/Server/Services/WorkflowService.ts +31 -0
  143. package/Server/Services/WorkspaceNotificationSummaryService.ts +12 -3
  144. package/Server/Types/AnalyticsDatabase/ModelPermission.ts +6 -0
  145. package/Server/Types/Database/Permissions/CreatePermission.ts +17 -3
  146. package/Server/Types/Database/Permissions/EditionPermission.ts +140 -38
  147. package/Server/Types/Database/Permissions/Index.ts +10 -0
  148. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +16 -0
  149. package/Server/Types/Database/Permissions/TablePermission.ts +3 -3
  150. package/Server/Types/Database/Permissions/UpdatePermission.ts +20 -6
  151. package/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.ts +2 -0
  152. package/Server/Types/Workflow/Components/Conditions/IfElse.ts +36 -138
  153. package/Server/Types/Workflow/Components/IncomingEmail.ts +216 -0
  154. package/Server/Types/Workflow/Components/Index.ts +32 -18
  155. package/Server/Types/Workflow/Components/Schedule.ts +25 -4
  156. package/Server/Utils/AI/Chat/AgentContextCompactor.ts +200 -0
  157. package/Server/Utils/AI/Chat/ChatAgentRunner.ts +307 -48
  158. package/Server/Utils/AI/Chat/ChatRunCancellation.ts +156 -0
  159. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +78 -18
  160. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
  161. package/Server/Utils/AI/Chat/ToolOutputPager.ts +322 -0
  162. package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +88 -30
  163. package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +13 -1
  164. package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +1 -33
  165. package/Server/Utils/AI/CodeFix/CodeFixRunQueue.ts +1 -1
  166. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +56 -46
  167. package/Server/Utils/AI/CodeFix/OpenPullRequestCap.ts +25 -19
  168. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +7 -1
  169. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +49 -82
  170. package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +69 -24
  171. package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +9 -0
  172. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +53 -10
  173. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +64 -63
  174. package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +8 -8
  175. package/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.ts +1 -1
  176. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +39 -29
  177. package/Server/Utils/AI/SRE/IncidentPostmortemRunner.ts +6 -5
  178. package/Server/Utils/AI/SRE/Insights/FixRouting.ts +3 -3
  179. package/Server/Utils/AI/SRE/Insights/InsightScanner.ts +5 -5
  180. package/Server/Utils/AI/SRE/Insights/Triage.ts +6 -5
  181. package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +8 -7
  182. package/Server/Utils/AI/SRE/InvestigationEligibility.ts +1 -1
  183. package/Server/Utils/AI/SRE/InvestigationQueue.ts +77 -72
  184. package/Server/Utils/AI/SRE/InvestigationThread.ts +646 -0
  185. package/Server/Utils/AI/SRE/InvestigationThreadService.ts +715 -0
  186. package/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.ts +1 -1
  187. package/Server/Utils/AI/Toolbox/AIActionTools.ts +11 -1
  188. package/Server/Utils/AI/Toolbox/AIMetaTools.ts +14 -8
  189. package/Server/Utils/AI/Toolbox/MonitorTools.ts +21 -3
  190. package/Server/Utils/AI/Toolbox/OnCallTools.ts +43 -9
  191. package/Server/Utils/AI/Toolbox/Serializer.ts +10 -3
  192. package/Server/Utils/AI/Toolbox/StatusPageTools.ts +36 -7
  193. package/Server/Utils/AI/Toolbox/WorkflowProbeTools.ts +26 -7
  194. package/Server/Utils/AnalyticsDatabase/ClusterConfig.ts +3 -1
  195. package/Server/Utils/EditionEnforcement.ts +19 -202
  196. package/Server/Utils/Express.ts +23 -0
  197. package/Server/Utils/IncomingCall/MissedCallNotification.ts +322 -0
  198. package/Server/Utils/LLM/LLMService.ts +259 -63
  199. package/Server/Utils/Mcp/McpDelegationToken.ts +171 -0
  200. package/Server/Utils/Mcp/McpOAuthConfig.ts +191 -0
  201. package/Server/Utils/Mcp/McpOAuthGrantAccess.ts +303 -0
  202. package/Server/Utils/Mcp/McpOAuthSecret.ts +149 -0
  203. package/Server/Utils/Mcp/McpOAuthSignedToken.ts +225 -0
  204. package/Server/Utils/Mcp/McpOAuthSso.ts +274 -0
  205. package/Server/Utils/Monitor/MonitorPayloadRedaction.ts +43 -0
  206. package/Server/Utils/Monitor/MonitorResource.ts +16 -3
  207. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +5 -8
  208. package/Server/Utils/RelaxedScimTeamLocksReport.ts +245 -0
  209. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
  210. package/Server/Utils/SameOriginRequest.ts +203 -0
  211. package/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.ts +3 -3
  212. package/Server/Utils/Slo/SloMetricUtil.ts +3 -3
  213. package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
  214. package/Server/Utils/Telemetry/DatabaseEndpointDiscovery.ts +11 -3
  215. package/Server/Utils/Telemetry/EntityRegistry.ts +4 -1
  216. package/Server/Utils/Telemetry/MessageQueueDiscovery.ts +1409 -0
  217. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +4 -1
  218. package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +171 -17
  219. package/Server/Utils/VendorAssets.ts +3 -3
  220. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +2 -0
  221. package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +2 -0
  222. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +5 -1
  223. package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +5 -1
  224. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +10 -1
  225. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.ts +4 -0
  226. package/Server/Utils/Workspace/Slack/Actions/Alert.ts +2 -0
  227. package/Server/Utils/Workspace/Slack/Actions/AlertEpisode.ts +2 -0
  228. package/Server/Utils/Workspace/Slack/Actions/Incident.ts +4 -0
  229. package/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.ts +2 -0
  230. package/Tests/App/Accounts/IncidentFormPage.test.tsx +2036 -0
  231. package/Tests/App/Accounts/IncidentFormServerMessages.test.ts +119 -0
  232. package/Tests/App/Accounts/IncidentFormUtils.test.ts +1157 -0
  233. package/Tests/App/Accounts/LoginPasskey.test.tsx +33 -4
  234. package/Tests/App/Accounts/LoginSso.test.tsx +724 -0
  235. package/Tests/App/Accounts/McpAuthorizePage.test.tsx +2034 -0
  236. package/Tests/App/AdminDashboard/AdminAuthenticationRequireSso.test.tsx +338 -0
  237. package/Tests/App/AdminDashboard/AdminAuthenticationSsoCardLocales.test.tsx +331 -0
  238. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +47 -33
  239. package/Tests/App/AdminDashboard/GlobalSsoOidcPages.test.tsx +1021 -0
  240. package/Tests/App/AdvancedMenuSectionsCollapsed.test.tsx +446 -0
  241. package/Tests/App/Dashboard/AIFeaturesSettingsPointers.test.tsx +55 -19
  242. package/Tests/App/Dashboard/AIInvestigationSettingsLimits.test.tsx +451 -0
  243. package/Tests/App/Dashboard/AIInvestigationStage.test.ts +141 -0
  244. package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +876 -78
  245. package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +20 -3
  246. package/Tests/App/Dashboard/AiAccessModes.test.ts +261 -0
  247. package/Tests/App/Dashboard/AiAccessRow.test.tsx +401 -0
  248. package/Tests/App/Dashboard/AlertEpisodeViewFields.test.tsx +19 -6
  249. package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +76 -33
  250. package/Tests/App/Dashboard/AnswerSources.test.tsx +359 -0
  251. package/Tests/App/Dashboard/ArchivableResourceListPages.test.tsx +655 -0
  252. package/Tests/App/Dashboard/ArchivedResourceBanner.test.tsx +543 -0
  253. package/Tests/App/Dashboard/ArchivedResourceNavigation.test.tsx +634 -0
  254. package/Tests/App/Dashboard/ArchivedResourceViewLayouts.test.tsx +321 -0
  255. package/Tests/App/Dashboard/BulkChangeStateModalSteps.test.ts +109 -0
  256. package/Tests/App/Dashboard/CephProxmoxVMwareDocumentationCards.test.tsx +359 -0
  257. package/Tests/App/Dashboard/CephSetupGuide.test.ts +961 -0
  258. package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +381 -95
  259. package/Tests/App/Dashboard/CloudSetupGuide.test.ts +1463 -0
  260. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +174 -12
  261. package/Tests/App/Dashboard/CodeProduct.test.tsx +194 -0
  262. package/Tests/App/Dashboard/ContainerSetupGuideCards.test.tsx +345 -0
  263. package/Tests/App/Dashboard/ConversationComposer.test.tsx +439 -0
  264. package/Tests/App/Dashboard/CoreListEmptyStates.test.tsx +503 -0
  265. package/Tests/App/Dashboard/CorrelateResultSummary.test.tsx +15 -3
  266. package/Tests/App/Dashboard/CreateOAuthWorkflowVariableFormSteps.test.tsx +925 -0
  267. package/Tests/App/Dashboard/CreateOAuthWorkflowVariableModal.test.tsx +267 -20
  268. package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +493 -100
  269. package/Tests/App/Dashboard/DangerZone.test.tsx +146 -3
  270. package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +0 -4
  271. package/Tests/App/Dashboard/DatabaseDocumentationCard.test.tsx +400 -0
  272. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +5 -0
  273. package/Tests/App/Dashboard/DatabaseSetupGuide.test.ts +1869 -0
  274. package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +44 -0
  275. package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +50 -9
  276. package/Tests/App/Dashboard/DeleteDialogsNameTheResource.test.tsx +257 -0
  277. package/Tests/App/Dashboard/DeveloperDocsGuides.test.ts +458 -0
  278. package/Tests/App/Dashboard/DeveloperDocsLocales.test.ts +124 -0
  279. package/Tests/App/Dashboard/DeveloperDocsPage.test.tsx +471 -0
  280. package/Tests/App/Dashboard/DeveloperMenuSections.test.tsx +657 -0
  281. package/Tests/App/Dashboard/DisabledWarningArchived.test.tsx +196 -0
  282. package/Tests/App/Dashboard/DiscoveryScanEditForm.test.tsx +52 -82
  283. package/Tests/App/Dashboard/DockerSetupGuide.test.ts +899 -0
  284. package/Tests/App/Dashboard/DockerSwarmSetupGuide.test.ts +964 -0
  285. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +208 -7
  286. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +52 -39
  287. package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +47 -0
  288. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +7 -1
  289. package/Tests/App/Dashboard/EventStatusPanel.test.tsx +2 -1
  290. package/Tests/App/Dashboard/GettingStartedTaskRoutes.test.tsx +331 -0
  291. package/Tests/App/Dashboard/HomeOverviewStatsFirstRun.test.tsx +942 -0
  292. package/Tests/App/Dashboard/HostDocumentationCard.test.tsx +225 -0
  293. package/Tests/App/Dashboard/HostSetupGuide.test.ts +1183 -0
  294. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +69 -45
  295. package/Tests/App/Dashboard/IncidentAlertLinkSideMenus.test.tsx +3 -1
  296. package/Tests/App/Dashboard/IncidentCreateTemplateCustomFieldSettings.test.tsx +745 -0
  297. package/Tests/App/Dashboard/IncidentCreateTemplateOwners.test.tsx +414 -0
  298. package/Tests/App/Dashboard/IncidentCustomFieldCreateSettingsForm.test.ts +1042 -0
  299. package/Tests/App/Dashboard/IncidentCustomFieldSettingsCard.test.tsx +1816 -0
  300. package/Tests/App/Dashboard/IncidentEpisodeViewFields.test.tsx +19 -6
  301. package/Tests/App/Dashboard/IncidentFormPlan.test.ts +89 -0
  302. package/Tests/App/Dashboard/IncidentFormShareLinkCard.test.tsx +846 -0
  303. package/Tests/App/Dashboard/IncidentFormsPages.test.tsx +1324 -0
  304. package/Tests/App/Dashboard/IncidentTemplateCustomFieldSettings.test.tsx +630 -0
  305. package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +95 -49
  306. package/Tests/App/Dashboard/IncomingEmailMonitorLinkVerifyHint.test.tsx +104 -0
  307. package/Tests/App/Dashboard/InventoryItemSideMenu.test.tsx +1 -0
  308. package/Tests/App/Dashboard/InvestigationConversation.test.tsx +2465 -0
  309. package/Tests/App/Dashboard/InvestigationConversationData.test.ts +998 -0
  310. package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +170 -5
  311. package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +341 -3
  312. package/Tests/App/Dashboard/InvestigationNotice.test.tsx +300 -0
  313. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1201 -34
  314. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +9 -21
  315. package/Tests/App/Dashboard/InvestigationReportView.test.tsx +274 -37
  316. package/Tests/App/Dashboard/InvestigationStatusBadge.test.tsx +130 -0
  317. package/Tests/App/Dashboard/IoTDocumentationCard.test.tsx +218 -0
  318. package/Tests/App/Dashboard/IoTSetupGuide.test.ts +1124 -0
  319. package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +126 -36
  320. package/Tests/App/Dashboard/KubernetesClusterAiAgentStatus.test.ts +743 -9
  321. package/Tests/App/Dashboard/KubernetesClusterAiDocumentationMarkdown.test.ts +107 -83
  322. package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +838 -81
  323. package/Tests/App/Dashboard/KubernetesClusterAiPageServerParity.test.ts +958 -7
  324. package/Tests/App/Dashboard/KubernetesSetupGuide.test.ts +787 -0
  325. package/Tests/App/Dashboard/McpAuthorizationResume.test.tsx +495 -0
  326. package/Tests/App/Dashboard/McpServerPage.test.tsx +1106 -0
  327. package/Tests/App/Dashboard/MessageQueueBreadcrumbs.test.tsx +228 -0
  328. package/Tests/App/Dashboard/MessageQueueBrokerHealth.test.tsx +1538 -0
  329. package/Tests/App/Dashboard/MessageQueueBrokerHealthMetricChart.test.tsx +969 -0
  330. package/Tests/App/Dashboard/MessageQueueBrokerHealthReads.test.ts +889 -0
  331. package/Tests/App/Dashboard/MessageQueueBrokerMetricsReach.test.ts +236 -0
  332. package/Tests/App/Dashboard/MessageQueueDocumentationCard.test.tsx +479 -0
  333. package/Tests/App/Dashboard/MessageQueueListPages.test.tsx +1232 -0
  334. package/Tests/App/Dashboard/MessageQueueMetricDescriptions.test.ts +244 -0
  335. package/Tests/App/Dashboard/MessageQueueMonitorLink.test.ts +952 -0
  336. package/Tests/App/Dashboard/MessageQueueMonitorLinkMonitorCreate.test.tsx +859 -0
  337. package/Tests/App/Dashboard/MessageQueueOverview.test.tsx +1773 -0
  338. package/Tests/App/Dashboard/MessageQueueOverviewPresentation.test.ts +196 -0
  339. package/Tests/App/Dashboard/MessageQueuePresentation.test.ts +799 -0
  340. package/Tests/App/Dashboard/MessageQueueProducersConsumers.test.tsx +680 -0
  341. package/Tests/App/Dashboard/MessageQueueRoutes.test.tsx +383 -0
  342. package/Tests/App/Dashboard/MessageQueueRulePages.test.tsx +278 -0
  343. package/Tests/App/Dashboard/MessageQueueSetupGuide.test.ts +2778 -0
  344. package/Tests/App/Dashboard/MessageQueueSideMenus.test.tsx +285 -0
  345. package/Tests/App/Dashboard/MessageQueueSpanPopulations.test.ts +930 -0
  346. package/Tests/App/Dashboard/MessageQueueSpanStore.ts +351 -0
  347. package/Tests/App/Dashboard/MessageQueueTelemetryScope.test.ts +375 -0
  348. package/Tests/App/Dashboard/MessageQueueTelemetryScopeTabs.test.tsx +668 -0
  349. package/Tests/App/Dashboard/MessageQueueViewPages.test.tsx +685 -0
  350. package/Tests/App/Dashboard/MonitorAndHomeNotOperationalMenus.test.tsx +342 -0
  351. package/Tests/App/Dashboard/MonitorCreateFirstRunDefaults.test.tsx +623 -0
  352. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +442 -0
  353. package/Tests/App/Dashboard/MonitorCriteriaAdvancedOptions.test.tsx +267 -0
  354. package/Tests/App/Dashboard/MonitorLogsPageViewSummary.test.tsx +814 -0
  355. package/Tests/App/Dashboard/MonitorOverviewInput.test.ts +3 -0
  356. package/Tests/App/Dashboard/MonitorSecretsAccessForm.test.tsx +727 -0
  357. package/Tests/App/Dashboard/MonitorSetupCardBodies.test.tsx +246 -0
  358. package/Tests/App/Dashboard/MonitorViewLayout.test.tsx +37 -0
  359. package/Tests/App/Dashboard/MovedRunnerSettingsRedirects.test.tsx +345 -0
  360. package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +12 -1
  361. package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +36 -4
  362. package/Tests/App/Dashboard/NotificationRuleFormParts.test.tsx +247 -0
  363. package/Tests/App/Dashboard/OAuthIdentityProviders.test.tsx +589 -0
  364. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +12 -1
  365. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +27 -12
  366. package/Tests/App/Dashboard/PermissionModePicker.test.tsx +316 -0
  367. package/Tests/App/Dashboard/PlanGatedPage.test.tsx +292 -0
  368. package/Tests/App/Dashboard/PodmanSetupGuide.test.ts +948 -0
  369. package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +83 -39
  370. package/Tests/App/Dashboard/ProductOrientation.test.tsx +35 -1
  371. package/Tests/App/Dashboard/ProductSettingsSectionCollapsed.test.tsx +266 -0
  372. package/Tests/App/Dashboard/ProjectAISettingsPages.test.tsx +244 -76
  373. package/Tests/App/Dashboard/ProxmoxSetupGuide.test.ts +1318 -0
  374. package/Tests/App/Dashboard/RecommendationsLoadedContext.test.tsx +57 -1
  375. package/Tests/App/Dashboard/ResourceAiAccessSettingsUtil.test.ts +190 -23
  376. package/Tests/App/Dashboard/ResourceAiAgentAttentionServerParity.test.ts +549 -0
  377. package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +755 -111
  378. package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +457 -0
  379. package/Tests/App/Dashboard/ResourceArchiveCopy.test.ts +218 -0
  380. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +16 -0
  381. package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +16 -2
  382. package/Tests/App/Dashboard/ResourceConnectionGuideCard.test.tsx +444 -0
  383. package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsInfra.test.tsx +798 -0
  384. package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsPlatforms.test.tsx +717 -0
  385. package/Tests/App/Dashboard/ResourceConnectionGuides.test.ts +981 -0
  386. package/Tests/App/Dashboard/ResourceConnectionState.test.ts +132 -0
  387. package/Tests/App/Dashboard/RumDocumentationCard.test.tsx +293 -0
  388. package/Tests/App/Dashboard/RumSessionReplayRetentionSettings.test.tsx +467 -0
  389. package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +1 -0
  390. package/Tests/App/Dashboard/RumSetupGuide.test.ts +758 -0
  391. package/Tests/App/Dashboard/RunbookRunnerRoutes.test.tsx +403 -0
  392. package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +26 -17
  393. package/Tests/App/Dashboard/RunnerNavigation.test.tsx +577 -0
  394. package/Tests/App/Dashboard/RunnerPagesInRunbooksFlow.test.tsx +581 -0
  395. package/Tests/App/Dashboard/RunnerProductSearch.test.tsx +195 -0
  396. package/Tests/App/Dashboard/RunnerSupersededByAiAgentNote.test.tsx +19 -6
  397. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +25 -0
  398. package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +2 -1
  399. package/Tests/App/Dashboard/SecurityEventSeverityPill.test.tsx +39 -15
  400. package/Tests/App/Dashboard/ServerlessDocumentationCard.test.tsx +254 -0
  401. package/Tests/App/Dashboard/ServerlessSetupGuide.test.ts +1074 -0
  402. package/Tests/App/Dashboard/SetupGuide.test.ts +246 -0
  403. package/Tests/App/Dashboard/SetupGuideCard.test.tsx +756 -0
  404. package/Tests/App/Dashboard/SloListSideMenu.test.tsx +121 -0
  405. package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +20 -1
  406. package/Tests/App/Dashboard/SloViewSideMenu.test.tsx +14 -2
  407. package/Tests/App/Dashboard/SsoPages.test.tsx +833 -0
  408. package/Tests/App/Dashboard/TelemetryDocumentation.test.tsx +253 -0
  409. package/Tests/App/Dashboard/TelemetryIngestionKeyEdit.test.tsx +107 -13
  410. package/Tests/App/Dashboard/TelemetryRetentionShells.test.tsx +730 -0
  411. package/Tests/App/Dashboard/UserElementEmail.test.tsx +50 -0
  412. package/Tests/App/Dashboard/UserSettingsEmailPreferences.test.tsx +42 -8
  413. package/Tests/App/Dashboard/UserSettingsNotificationSettings.test.tsx +51 -1
  414. package/Tests/App/Dashboard/VMwareSetupGuide.test.ts +1033 -0
  415. package/Tests/App/Dashboard/WorkflowBuilderArchived.test.tsx +490 -0
  416. package/Tests/App/Dashboard/WorkflowBuilderIncomingEmailSecretKey.test.tsx +436 -0
  417. package/Tests/App/Dashboard/WorkflowBuilderRunDownload.test.tsx +416 -0
  418. package/Tests/App/Dashboard/WorkflowBuilderTurnOn.test.tsx +828 -0
  419. package/Tests/App/Dashboard/WorkflowBuilderWebhookSecretKey.test.tsx +499 -0
  420. package/Tests/App/Dashboard/WorkflowRunsLogsMenus.test.tsx +758 -0
  421. package/Tests/App/Dashboard/WorkflowRunsPages.test.tsx +507 -0
  422. package/Tests/App/Dashboard/WorkflowSettingsPage.test.tsx +172 -0
  423. package/Tests/App/Dashboard/WorkflowTemplatePicker.test.tsx +1425 -0
  424. package/Tests/App/Dashboard/WorkflowVariableCreateFormSteps.test.tsx +473 -0
  425. package/Tests/App/Dashboard/WorkflowVariableOAuthSettingsEditSteps.test.tsx +390 -0
  426. package/Tests/App/Dashboard/WorkflowVariableUtil.test.ts +357 -30
  427. package/Tests/App/Dashboard/WorkflowVariableView.test.tsx +49 -0
  428. package/Tests/App/Dashboard/WorkflowVariablesTable.test.tsx +72 -2
  429. package/Tests/App/Dashboard/WorkspaceNotificationRuleFormSteps.test.tsx +499 -0
  430. package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +31 -0
  431. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +87 -7
  432. package/Tests/DialogActionRules.ts +1696 -0
  433. package/Tests/Helpers/FormStepsScan.ts +1917 -0
  434. package/Tests/Helpers/ToggleUsageScan.ts +302 -0
  435. package/Tests/Models/AnalyticsModels/TelemetryTtlSettings.test.ts +164 -0
  436. package/Tests/Models/DatabaseModels/ArchivableResourceModels.test.ts +475 -0
  437. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +28 -9
  438. package/Tests/Models/DatabaseModels/IncidentFormModel.test.ts +1250 -0
  439. package/Tests/Models/DatabaseModels/IncomingCallLogWorkflow.test.ts +130 -0
  440. package/Tests/Models/DatabaseModels/MessageQueueModels.test.ts +1983 -0
  441. package/Tests/Models/DatabaseModels/PermissionCatalogueCoverage.test.ts +0 -1
  442. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  443. package/Tests/Models/DatabaseModels/TeamComplianceSettingModel.test.ts +190 -14
  444. package/Tests/Models/DatabaseModels/WorkflowIncomingEmailSecretKeyAccessControl.test.ts +252 -0
  445. package/Tests/Models/DatabaseModels/WorkflowWebhookSecretKeyAccessControl.test.ts +223 -0
  446. package/Tests/Models/IncidentTemplateCustomFieldSettingsColumn.test.ts +291 -0
  447. package/Tests/Models/McpOAuthModels.test.ts +951 -0
  448. package/Tests/Server/API/AIInvestigationAPI.test.ts +6 -4
  449. package/Tests/Server/API/AIInvestigationConversationAPI.test.ts +412 -0
  450. package/Tests/Server/API/ArchivedPublicRoutes.test.ts +481 -0
  451. package/Tests/Server/API/AutoRemediationApproveClusterRound.test.ts +144 -105
  452. package/Tests/Server/API/AutoRemediationApproveEnableAiGate.test.ts +816 -0
  453. package/Tests/Server/API/AutoRemediationApproveKubectlRecheck.test.ts +37 -5
  454. package/Tests/Server/API/AutoRemediationApproveResourceRound.test.ts +68 -57
  455. package/Tests/Server/API/CommonAPIAuditIdentityProps.test.ts +468 -0
  456. package/Tests/Server/API/GlobalConfigLicense.test.ts +38 -9
  457. package/Tests/Server/API/IncidentFormAPI.test.ts +942 -0
  458. package/Tests/Server/API/IncidentFormPublicRoutes.test.ts +1653 -0
  459. package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +2 -1
  460. package/Tests/Server/API/ResourceAiAccessAPI.test.ts +0 -4
  461. package/Tests/Server/API/{SsoProviderListingsEdition.test.ts → SsoProviderListings.test.ts} +164 -110
  462. package/Tests/Server/API/StatusPagePublicReadsLeaveOutArchivedMonitors.test.ts +126 -0
  463. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +76 -54
  464. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +125 -42
  465. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +36 -10
  466. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +51 -9
  467. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +13 -8
  468. package/Tests/Server/Enterprise/SsoInCommunityEdition.test.ts +540 -0
  469. package/Tests/Server/Infrastructure/Postgres/AddArchiveToMoreResourcesMigration.test.ts +200 -0
  470. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  471. package/Tests/Server/Infrastructure/Postgres/AddIncidentFormsMigration.test.ts +438 -0
  472. package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleNotificationChannelsMigration.test.ts +255 -0
  473. package/Tests/Server/Infrastructure/Postgres/FoldAiSwitchesIntoEnableAiMigration.test.ts +543 -0
  474. package/Tests/Server/Infrastructure/Postgres/FoldAiSwitchesIntoEnableAiPostgres.test.ts +862 -0
  475. package/Tests/Server/Infrastructure/Postgres/MessageQueueTablesMigration.test.ts +637 -0
  476. package/Tests/Server/Middleware/IncidentFormRateLimit.test.ts +1630 -0
  477. package/Tests/Server/Middleware/McpDelegationAuthorization.test.ts +862 -0
  478. package/Tests/Server/Middleware/McpOAuthRateLimit.test.ts +959 -0
  479. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyIdentity.test.ts +361 -0
  480. package/Tests/Server/Middleware/UserAuthorization.test.ts +16 -17
  481. package/Tests/Server/Middleware/UserAuthorizationMcpDelegation.test.ts +568 -0
  482. package/Tests/Server/Middleware/UserAuthorizationSsoEnforcement.test.ts +544 -0
  483. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +97 -8
  484. package/Tests/Server/Services/AddMcpOAuthTablesMigration.test.ts +616 -0
  485. package/Tests/Server/Services/AiAccessEnableAiMasterSwitch.test.ts +761 -0
  486. package/Tests/Server/Services/AnalyticsDatabaseServiceReadOnlyCredentialBeforeHooks.test.ts +224 -0
  487. package/Tests/Server/Services/ApiKeyServiceResolvedName.test.ts +307 -0
  488. package/Tests/Server/Services/ArchivedStatusPageAndDashboardAccess.test.ts +505 -0
  489. package/Tests/Server/Services/AutoRemediationClusterRuleEngine.test.ts +61 -4
  490. package/Tests/Server/Services/AutoRemediationCommandRuleEngine.test.ts +64 -13
  491. package/Tests/Server/Services/AutoRemediationEnableAiMasterSwitch.test.ts +767 -0
  492. package/Tests/Server/Services/AutoRemediationResourceRuleEngine.test.ts +47 -8
  493. package/Tests/Server/Services/AutoRemediationRuleCommandRunners.test.ts +1 -1
  494. package/Tests/Server/Services/AutoRemediationRuleEngineService.test.ts +48 -6
  495. package/Tests/Server/Services/DatabaseServerService.test.ts +420 -0
  496. package/Tests/Server/Services/DatabaseServerSqlPostgres.test.ts +296 -2
  497. package/Tests/Server/Services/DatabaseServiceReadOnlyCredentialBeforeHooks.test.ts +396 -0
  498. package/Tests/Server/Services/InboundEmail/SendGridInboundProviderRecipients.test.ts +172 -0
  499. package/Tests/Server/Services/IncidentCreatedFeedTitle.test.ts +212 -0
  500. package/Tests/Server/Services/IncidentCustomFieldDeleteFormQuestions.test.ts +297 -0
  501. package/Tests/Server/Services/IncidentFormOwnersCreatedNotification.test.ts +497 -0
  502. package/Tests/Server/Services/IncidentFormPostgres.test.ts +958 -0
  503. package/Tests/Server/Services/IncidentFormPublicForm.test.ts +1260 -0
  504. package/Tests/Server/Services/IncidentFormPublicSubmission.test.ts +2520 -0
  505. package/Tests/Server/Services/IncidentFormRegistration.test.ts +159 -0
  506. package/Tests/Server/Services/IncidentFormService.test.ts +663 -0
  507. package/Tests/Server/Services/IncidentFormSubmissionService.test.ts +430 -0
  508. package/Tests/Server/Services/IncidentFormSubmissionTemplateBranch.test.ts +473 -0
  509. package/Tests/Server/Services/IncidentGroupingTemplateSubstitution.test.ts +81 -0
  510. package/Tests/Server/Services/IncidentTemplateCustomFieldSettings.test.ts +262 -0
  511. package/Tests/Server/Services/IncidentTemplateOwnersOnDeclare.test.ts +566 -0
  512. package/Tests/Server/Services/IncidentTitleMarkdownSinks.test.ts +640 -0
  513. package/Tests/Server/Services/IncomingCallMissedCallNotificationService.test.ts +690 -0
  514. package/Tests/Server/Services/IncomingCallPolicyFindOwners.test.ts +287 -0
  515. package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +4 -3
  516. package/Tests/Server/Services/KubernetesClusterAiAccessAgentRunnerAssignments.test.ts +1 -1
  517. package/Tests/Server/Services/KubernetesClusterAiAccessDeletedRunnerRemedy.test.ts +2 -4
  518. package/Tests/Server/Services/KubernetesClusterAiAccessGapNextSteps.test.ts +26 -13
  519. package/Tests/Server/Services/KubernetesClusterAiAccessService.test.ts +180 -44
  520. package/Tests/Server/Services/KubernetesClusterAiAccessTarget.test.ts +14 -10
  521. package/Tests/Server/Services/LlmLogServiceTokenAggregateParams.test.ts +3 -3
  522. package/Tests/Server/Services/LogAggregationService.test.ts +101 -1
  523. package/Tests/Server/Services/McpOAuthClientService.test.ts +562 -0
  524. package/Tests/Server/Services/McpOAuthGrantService.test.ts +899 -0
  525. package/Tests/Server/Services/McpOAuthPostgres.test.ts +942 -0
  526. package/Tests/Server/Services/McpOAuthTokenService.test.ts +782 -0
  527. package/Tests/Server/Services/MessageQueueOwnerServices.test.ts +440 -0
  528. package/Tests/Server/Services/MessageQueueRegistries.test.ts +577 -0
  529. package/Tests/Server/Services/MessageQueueRuleEngines.test.ts +900 -0
  530. package/Tests/Server/Services/MessageQueueService.test.ts +2210 -0
  531. package/Tests/Server/Services/MessageQueueSqlPostgres.test.ts +1271 -0
  532. package/Tests/Server/Services/MonitorGroupServiceBatchedStatuses.test.ts +35 -1
  533. package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +35 -0
  534. package/Tests/Server/Services/MonitorSecretAccessPostgres.test.ts +883 -0
  535. package/Tests/Server/Services/MonitorSecretService.test.ts +1097 -0
  536. package/Tests/Server/Services/OnCallDutyPolicyArchive.test.ts +157 -0
  537. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +28 -1
  538. package/Tests/Server/Services/OpenTelemetryRetentionOverrideEdition.test.ts +474 -0
  539. package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +21 -0
  540. package/Tests/Server/Services/OwnerRowUniqueness.test.ts +3 -0
  541. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +0 -1
  542. package/Tests/Server/Services/ProjectServiceNewProjectAiDefaults.test.ts +132 -82
  543. package/Tests/Server/Services/ResourceAiAccessService.test.ts +28 -14
  544. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +56 -6
  545. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -1
  546. package/Tests/Server/Services/RunnerJobEnqueueKubectlAiAgent.test.ts +0 -2
  547. package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +5 -0
  548. package/Tests/Server/Services/SsoRequirementReads.test.ts +454 -0
  549. package/Tests/Server/Services/SsoRequirementWrites.test.ts +529 -0
  550. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
  551. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +107 -89
  552. package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +1068 -176
  553. package/Tests/Server/Services/TeamComplianceSettingService.test.ts +1962 -200
  554. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +13 -1
  555. package/Tests/Server/Services/TeamMemberInvitationAcceptancePostgres.test.ts +942 -0
  556. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +6 -1
  557. package/Tests/Server/Services/TeamMemberProjectInvitationAcceptance.test.ts +1256 -0
  558. package/Tests/Server/Services/TeamMemberSeatLimitExistingMember.test.ts +498 -0
  559. package/Tests/Server/Services/UserNotificationSettingIncomingCallDefaults.test.ts +190 -0
  560. package/Tests/Server/Services/WorkflowIncomingEmailSecretKeyPostgres.test.ts +323 -0
  561. package/Tests/Server/Services/WorkflowService.test.ts +188 -0
  562. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +654 -297
  563. package/Tests/Server/Types/Database/Permissions/RetentionOverrideColumns.test.ts +784 -0
  564. package/Tests/Server/Types/Database/Permissions/SsoScalePlanGate.test.ts +418 -0
  565. package/Tests/Server/Types/Workflow/Components/CustomCodeScriptError.test.ts +19 -20
  566. package/Tests/Server/Types/Workflow/Components/IfElse.test.ts +357 -66
  567. package/Tests/Server/Types/Workflow/Components/IncomingEmailTrigger.test.ts +670 -0
  568. package/Tests/Server/Types/Workflow/Components/TriggersSkipArchivedWorkflows.test.ts +257 -0
  569. package/Tests/Server/Utils/AI/AIAlertGating.test.ts +317 -185
  570. package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +47 -23
  571. package/Tests/Server/Utils/AI/AIInvestigationEngineRunLimits.test.ts +136 -0
  572. package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +148 -17
  573. package/Tests/Server/Utils/AI/AIMetaTools.test.ts +31 -0
  574. package/Tests/Server/Utils/AI/AgentContextCompactor.test.ts +351 -0
  575. package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +2 -0
  576. package/Tests/Server/Utils/AI/ArchivedResourcesInAITools.test.ts +622 -0
  577. package/Tests/Server/Utils/AI/ChatAgentRunnerSharedThread.test.ts +842 -0
  578. package/Tests/Server/Utils/AI/ChatRunCancellation.test.ts +195 -0
  579. package/Tests/Server/Utils/AI/CodeFixReadiness.test.ts +10 -57
  580. package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +30 -1
  581. package/Tests/Server/Utils/AI/FixFromIncidentAutoTrigger.test.ts +5 -4
  582. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +202 -102
  583. package/Tests/Server/Utils/AI/Insights/InsightFixRouting.test.ts +1 -1
  584. package/Tests/Server/Utils/AI/Insights/InsightTriage.test.ts +1 -1
  585. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +101 -80
  586. package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +225 -29
  587. package/Tests/Server/Utils/AI/InvestigationEligibility.test.ts +24 -0
  588. package/Tests/Server/Utils/AI/InvestigationInfrastructureAccessWiring.test.ts +266 -25
  589. package/Tests/Server/Utils/AI/InvestigationQueueRemediationExecution.test.ts +41 -5
  590. package/Tests/Server/Utils/AI/InvestigationThread.test.ts +580 -0
  591. package/Tests/Server/Utils/AI/InvestigationThreadService.test.ts +801 -0
  592. package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +525 -43
  593. package/Tests/Server/Utils/AI/KubectlJobRunner.test.ts +4 -2
  594. package/Tests/Server/Utils/AI/LLMServiceUnreachableProvider.test.ts +435 -0
  595. package/Tests/Server/Utils/AI/ObservabilityAssistantLimits.test.ts +462 -0
  596. package/Tests/Server/Utils/AI/OpenPullRequestCap.test.ts +62 -22
  597. package/Tests/Server/Utils/AI/RemediationCommandToolsLiveCluster.test.ts +14 -10
  598. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +219 -129
  599. package/Tests/Server/Utils/AI/RemediationExecutionRunnerEnableAiGate.test.ts +598 -0
  600. package/Tests/Server/Utils/AI/RemediationExecutionRunnerProjectGates.test.ts +94 -158
  601. package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +50 -66
  602. package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +297 -15
  603. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAccessContext.test.ts +0 -4
  604. package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +10 -6
  605. package/Tests/Server/Utils/AI/ToolOutputPager.test.ts +382 -0
  606. package/Tests/Server/Utils/AI/ToolResultSerializer.test.ts +23 -4
  607. package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +25 -6
  608. package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +14 -3
  609. package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +8 -1
  610. package/Tests/Server/Utils/EditionEnforcement.test.ts +107 -147
  611. package/Tests/Server/Utils/IncomingCall/MissedCallNotification.test.ts +555 -0
  612. package/Tests/Server/Utils/Mcp/McpDelegationToken.test.ts +677 -0
  613. package/Tests/Server/Utils/Mcp/McpOAuthConfig.test.ts +549 -0
  614. package/Tests/Server/Utils/Mcp/McpOAuthGrantAccess.test.ts +1476 -0
  615. package/Tests/Server/Utils/Mcp/McpOAuthSecret.test.ts +721 -0
  616. package/Tests/Server/Utils/Mcp/McpOAuthSignedToken.test.ts +1042 -0
  617. package/Tests/Server/Utils/Mcp/McpOAuthSso.test.ts +1399 -0
  618. package/Tests/Server/Utils/Monitor/GeneratedInboundAddressRedaction.test.ts +109 -0
  619. package/Tests/Server/Utils/Monitor/MonitorPauseFlagsGuard.test.ts +237 -0
  620. package/Tests/Server/Utils/Monitor/MonitorResourceArchived.test.ts +165 -0
  621. package/Tests/Server/Utils/{CommunityEditionSsoReport.test.ts → RelaxedScimTeamLocksReport.test.ts} +212 -208
  622. package/Tests/Server/Utils/SameOriginRequest.test.ts +372 -0
  623. package/Tests/Server/Utils/Telemetry/DatabaseEndpointDiscovery.test.ts +262 -0
  624. package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +20 -0
  625. package/Tests/Server/Utils/Telemetry/MessageQueueDiscovery.test.ts +2590 -0
  626. package/Tests/Server/Utils/Telemetry/MessageQueueSpanQueryTwin.ts +246 -0
  627. package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +976 -77
  628. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +23 -0
  629. package/Tests/Server/Utils/Topology/TopologyConcurrencyLimiter.test.ts +94 -39
  630. package/Tests/Server/Utils/Workspace/ArchivedOnCallPoliciesNotOffered.test.ts +133 -0
  631. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.test.ts +10 -3
  632. package/Tests/Types/AI/AIAgentRunLimits.test.ts +255 -0
  633. package/Tests/Types/AI/AIWorkloadLimits.test.ts +101 -0
  634. package/Tests/Types/BaseDatabase/ReadOnlyCredential.test.ts +931 -0
  635. package/Tests/Types/Call/CallProvider.test.ts +54 -1
  636. package/Tests/Types/Code/JsonSyntax.test.ts +1300 -0
  637. package/Tests/Types/CustomField/CustomFieldCreateSettings.test.ts +1113 -0
  638. package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +91 -0
  639. package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +30 -0
  640. package/Tests/Types/DatabaseServer/DatabaseEndpoint.test.ts +227 -1
  641. package/Tests/Types/Incident/IncidentFormIpAllowlist.test.ts +227 -0
  642. package/Tests/Types/Incident/IncidentFormPublic.test.ts +1916 -0
  643. package/Tests/Types/IncomingCall/MissedIncomingCall.test.ts +137 -0
  644. package/Tests/Types/Kubernetes/KubernetesAiAgentAccessContract.test.ts +23 -0
  645. package/Tests/Types/Mcp/McpOAuthScope.test.ts +491 -0
  646. package/Tests/Types/MessageQueue/MessageQueueEntityKey.test.ts +916 -0
  647. package/Tests/Types/MessageQueue/MessageQueueIdentity.test.ts +567 -0
  648. package/Tests/Types/MessageQueue/MessageQueueManualIdentity.test.ts +686 -0
  649. package/Tests/Types/MessageQueue/MessageQueueMetricCatalog.test.ts +1726 -0
  650. package/Tests/Types/MessageQueue/MessageQueueMetricResolution.test.ts +1758 -0
  651. package/Tests/Types/MessageQueue/MessagingInstrumentationFixtures.test.ts +4686 -0
  652. package/Tests/Types/MessageQueue/MessagingSystem.test.ts +840 -0
  653. package/Tests/Types/MessageQueue/MessagingTelemetryFixtures.ts +3287 -0
  654. package/Tests/Types/MessageQueue/MessagingTelemetryResolver.test.ts +2966 -0
  655. package/Tests/Types/Monitor/MessageQueueAlertTemplates.test.ts +5401 -0
  656. package/Tests/Types/Monitor/MetricEngineFold.ts +154 -0
  657. package/Tests/Types/Monitor/MonitorSecretAccess.test.ts +347 -0
  658. package/Tests/Types/NotificationSetting/IncomingCallMissedNotificationEvent.test.ts +77 -0
  659. package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +5 -5
  660. package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +5 -3
  661. package/Tests/Types/Team/ComplianceRule.test.ts +588 -37
  662. package/Tests/Types/Team/TeamComplianceStatus.test.ts +64 -11
  663. package/Tests/Types/Workflow/BaseModelComponents.test.ts +56 -50
  664. package/Tests/Types/Workflow/ComponentDocumentation.test.ts +1396 -0
  665. package/Tests/Types/Workflow/Components/BaseModelWriteSteps.test.ts +158 -0
  666. package/Tests/Types/Workflow/Components/JSON.test.ts +6 -2
  667. package/Tests/Types/Workflow/ConditionEvaluation.test.ts +793 -0
  668. package/Tests/Types/Workflow/DocumentationText.test.ts +169 -0
  669. package/Tests/Types/Workflow/IncomingEmailTrigger.test.ts +446 -0
  670. package/Tests/Types/Workflow/IncomingEmailTriggerDocumentation.test.ts +174 -0
  671. package/Tests/Types/Workflow/StepSamples.test.ts +846 -0
  672. package/Tests/Types/Workflow/StepTrace.test.ts +128 -0
  673. package/Tests/Types/Workflow/StepTraceValueSample.test.ts +205 -0
  674. package/Tests/Types/Workflow/SystemColumns.test.ts +114 -0
  675. package/Tests/Types/Workflow/Templates.test.ts +345 -0
  676. package/Tests/Types/Workflow/WebhookTrigger.test.ts +221 -0
  677. package/Tests/Types/Workflow/WorkflowEnabled.test.ts +107 -0
  678. package/Tests/Types/Workspace/NotificationRuleValidationHalves.test.ts +217 -0
  679. package/Tests/Types/XML.test.ts +51 -0
  680. package/Tests/UI/Components/ActionButton/RowActionsTrigger.test.tsx +748 -0
  681. package/Tests/UI/Components/BasicFormModalSteps.test.tsx +113 -0
  682. package/Tests/UI/Components/BulkUpdateFormConfirmDetails.test.tsx +148 -0
  683. package/Tests/UI/Components/Button.test.tsx +52 -13
  684. package/Tests/UI/Components/Card.test.tsx +211 -2
  685. package/Tests/UI/Components/CodeEditor/CodeEditor.test.tsx +2362 -0
  686. package/Tests/UI/Components/CodeEditor/CodeEditorCommands.test.ts +810 -0
  687. package/Tests/UI/Components/CodeEditor/CodeEditorHighlight.test.ts +338 -0
  688. package/Tests/UI/Components/CodeEditor/CodeEditorLanguages.test.ts +222 -0
  689. package/Tests/UI/Components/CodeEditor/CodeEditorStyles.test.ts +807 -0
  690. package/Tests/UI/Components/CodeEditor/CodeEditorToolbarActions.test.tsx +121 -0
  691. package/Tests/UI/Components/CodeEditor/NoMonaco.test.ts +245 -0
  692. package/Tests/UI/Components/CodeEditor/YamlEditor.test.tsx +729 -0
  693. package/Tests/UI/Components/CollapsibleSection.test.tsx +152 -0
  694. package/Tests/UI/Components/ComponentsModal.test.tsx +555 -930
  695. package/Tests/UI/Components/ComponentsModalUsability.test.tsx +279 -401
  696. package/Tests/UI/Components/ConfirmModal.test.tsx +195 -0
  697. package/Tests/UI/Components/CopyTextButton.test.tsx +76 -0
  698. package/Tests/UI/Components/DeleteConfirmation/DeleteConfirmation.test.tsx +524 -0
  699. package/Tests/UI/Components/Detail/DropdownColors.test.tsx +11 -9
  700. package/Tests/UI/Components/Detail/EntityFields.test.tsx +10 -4
  701. package/Tests/UI/Components/DictionaryRenderTextValueInput.test.tsx +94 -0
  702. package/Tests/UI/Components/Dropdown/DropdownValueBadge.test.tsx +79 -10
  703. package/Tests/UI/Components/EditionLabelLapseCopy.ts +51 -14
  704. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +131 -23
  705. package/Tests/UI/Components/ErrorMessageAction.test.tsx +142 -0
  706. package/Tests/UI/Components/FacetSidebarInScope.test.tsx +459 -0
  707. package/Tests/UI/Components/FacetValuesInScope.test.ts +270 -0
  708. package/Tests/UI/Components/Forms/BasicFormSubmitAllSteps.test.tsx +293 -0
  709. package/Tests/UI/Components/Forms/FormFieldCheckboxTranslation.test.tsx +14 -12
  710. package/Tests/UI/Components/Forms/FormFieldCodeEditors.test.tsx +294 -0
  711. package/Tests/UI/Components/Forms/FormFieldCustomElementLabel.test.tsx +156 -0
  712. package/Tests/UI/Components/Forms/FormFieldDictionaryError.test.tsx +198 -0
  713. package/Tests/UI/Components/Forms/FormFieldLongText.test.tsx +200 -0
  714. package/Tests/UI/Components/Forms/FormFieldMarkdown.test.tsx +126 -0
  715. package/Tests/UI/Components/Forms/FormFieldToggleRow.test.tsx +388 -0
  716. package/Tests/UI/Components/Forms/FormFieldYaml.test.tsx +22 -75
  717. package/Tests/UI/Components/Forms/LongFormStepsGuard.test.ts +586 -0
  718. package/Tests/UI/Components/Forms/ModelFormFormOnlyFields.test.tsx +254 -0
  719. package/Tests/UI/Components/Forms/ModelFormOnBeforeCreateMiscData.test.tsx +254 -0
  720. package/Tests/UI/Components/Forms/OverloadedFormStepsGuard.test.ts +505 -0
  721. package/Tests/UI/Components/Forms/ValidationRequiredWhen.test.ts +122 -0
  722. package/Tests/UI/Components/Icon.test.tsx +75 -0
  723. package/Tests/UI/Components/Input.test.tsx +31 -0
  724. package/Tests/UI/Components/LockedFilterChipScope.test.tsx +501 -0
  725. package/Tests/UI/Components/MarkdownConverters.test.ts +253 -1
  726. package/Tests/UI/Components/MarkdownEditor.test.tsx +2785 -2
  727. package/Tests/UI/Components/MarkdownEditorHistory.test.ts +243 -0
  728. package/Tests/UI/Components/MarkdownListEditing.test.ts +1118 -0
  729. package/Tests/UI/Components/MarkdownPaste.test.ts +1180 -0
  730. package/Tests/UI/Components/MarkdownViewerCopy.test.tsx +466 -0
  731. package/Tests/UI/Components/MarkdownVisualEditing.test.ts +1089 -0
  732. package/Tests/UI/Components/Modal.test.tsx +495 -1
  733. package/Tests/UI/Components/ModalSecondaryButton.test.tsx +122 -0
  734. package/Tests/UI/Components/ModelCardPermissionGating.test.tsx +13 -9
  735. package/Tests/UI/Components/ModelDelete.test.tsx +7 -0
  736. package/Tests/UI/Components/ModelDeleteNames.test.tsx +784 -0
  737. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +9 -2
  738. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteConfirmation.test.tsx +4 -1
  739. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteNames.test.tsx +573 -0
  740. package/Tests/UI/Components/ModelTable/BaseModelTableEmptyStateAction.test.tsx +644 -0
  741. package/Tests/UI/Components/ModelTable/BaseModelTableRowActions.test.tsx +6 -3
  742. package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +20 -14
  743. package/Tests/UI/Components/NavBar.test.tsx +45 -0
  744. package/Tests/UI/Components/Pill.test.tsx +369 -50
  745. package/Tests/UI/Components/PillColors.test.ts +524 -0
  746. package/Tests/UI/Components/ResetObjectID.test.tsx +282 -0
  747. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  748. package/Tests/UI/Components/SideMenu.test.tsx +461 -0
  749. package/Tests/UI/Components/SideMenuSection.test.tsx +200 -0
  750. package/Tests/UI/Components/SideMenuSectionState.test.tsx +362 -0
  751. package/Tests/UI/Components/SteppedEditFormSave.test.tsx +499 -0
  752. package/Tests/UI/Components/Table/EmptyTableMessage.test.ts +439 -0
  753. package/Tests/UI/Components/Table/TableEmptyState.test.tsx +352 -0
  754. package/Tests/UI/Components/TableRowActions.test.tsx +110 -0
  755. package/Tests/UI/Components/TableRowMobileTitles.test.tsx +78 -0
  756. package/Tests/UI/Components/TextArea.test.tsx +19 -0
  757. package/Tests/UI/Components/TextAreaAutoGrow.test.tsx +387 -0
  758. package/Tests/UI/Components/Toggle.test.tsx +846 -6
  759. package/Tests/UI/Components/ToggleUsageGuard.test.ts +274 -0
  760. package/Tests/UI/Components/Workflow/ArgumentInputTypes.test.ts +710 -0
  761. package/Tests/UI/Components/Workflow/ArgumentsForm.test.tsx +934 -0
  762. package/Tests/UI/Components/Workflow/ArgumentsFormAdvancedSettings.test.tsx +207 -0
  763. package/Tests/UI/Components/Workflow/BreakableCode.test.tsx +153 -0
  764. package/Tests/UI/Components/Workflow/ColumnEditor/AddColumnPicker.test.tsx +685 -0
  765. package/Tests/UI/Components/Workflow/ColumnEditor/AddColumnPickerDarkMode.test.ts +252 -0
  766. package/Tests/UI/Components/Workflow/ColumnEditor/ColumnControl.test.ts +207 -5
  767. package/Tests/UI/Components/Workflow/ColumnEditor/ColumnPickerOptions.test.ts +570 -0
  768. package/Tests/UI/Components/Workflow/ColumnEditor/ColumnUse.test.ts +248 -0
  769. package/Tests/UI/Components/Workflow/ColumnEditor/ColumnValueInputLongText.test.tsx +90 -0
  770. package/Tests/UI/Components/Workflow/ColumnEditor/ColumnValueInputValuePicker.test.tsx +282 -0
  771. package/Tests/UI/Components/Workflow/Component.test.tsx +465 -0
  772. package/Tests/UI/Components/Workflow/ComponentPicker/ComponentPickerDarkMode.test.ts +239 -0
  773. package/Tests/UI/Components/Workflow/ComponentPicker/ComponentPickerRealCatalog.test.tsx +399 -0
  774. package/Tests/UI/Components/Workflow/ComponentPicker/ComponentSearch.test.ts +660 -0
  775. package/Tests/UI/Components/Workflow/ComponentPicker/PickerCatalog.test.ts +352 -0
  776. package/Tests/UI/Components/Workflow/ComponentPicker/PickerFixtures.ts +240 -0
  777. package/Tests/UI/Components/Workflow/ComponentPortViewer.test.tsx +91 -0
  778. package/Tests/UI/Components/Workflow/ComponentReturnValueViewer.test.tsx +248 -0
  779. package/Tests/UI/Components/Workflow/ComponentSettingsDeleteConfirmation.test.tsx +245 -0
  780. package/Tests/UI/Components/Workflow/ComponentSettingsModal.test.tsx +1033 -0
  781. package/Tests/UI/Components/Workflow/ComponentSettingsModalDarkMode.test.ts +276 -0
  782. package/Tests/UI/Components/Workflow/ComponentSettingsModalDocumentation.test.tsx +478 -0
  783. package/Tests/UI/Components/Workflow/ComponentSettingsModalIncomingEmail.test.tsx +606 -0
  784. package/Tests/UI/Components/Workflow/ComponentSettingsModalLayout.test.tsx +478 -0
  785. package/Tests/UI/Components/Workflow/ComponentSettingsModalStepSamples.test.tsx +343 -0
  786. package/Tests/UI/Components/Workflow/ComponentSettingsModalValidity.test.tsx +223 -0
  787. package/Tests/UI/Components/Workflow/ComponentSettingsRunStepConfirmation.test.tsx +286 -0
  788. package/Tests/UI/Components/Workflow/Condition/ConditionCanvasCard.test.tsx +208 -0
  789. package/Tests/UI/Components/Workflow/Condition/ConditionEditor.test.tsx +906 -0
  790. package/Tests/UI/Components/Workflow/Condition/ConditionGraphLint.test.ts +204 -0
  791. package/Tests/UI/Components/Workflow/Condition/ConditionModel.test.ts +986 -0
  792. package/Tests/UI/Components/Workflow/CronScheduleFieldVariable.test.tsx +115 -0
  793. package/Tests/UI/Components/Workflow/DocumentationViewer.test.tsx +592 -0
  794. package/Tests/UI/Components/Workflow/GraphLintSummary.test.ts +467 -0
  795. package/Tests/UI/Components/Workflow/IncomingEmailTriggerPanel.test.tsx +865 -0
  796. package/Tests/UI/Components/Workflow/IncomingEmailTriggerPanelI18n.test.ts +164 -0
  797. package/Tests/UI/Components/Workflow/ModelColumnEditor.render.test.tsx +47 -48
  798. package/Tests/UI/Components/Workflow/ModelColumnEditorFieldLists.render.test.tsx +660 -0
  799. package/Tests/UI/Components/Workflow/ModelFieldPicker.test.tsx +230 -0
  800. package/Tests/UI/Components/Workflow/NodePlacement.test.ts +379 -1
  801. package/Tests/UI/Components/Workflow/StepTracePresentation.test.ts +705 -0
  802. package/Tests/UI/Components/Workflow/StepTraceViewer.test.tsx +1039 -35
  803. package/Tests/UI/Components/Workflow/StepTraceViewerDarkMode.test.ts +275 -0
  804. package/Tests/UI/Components/Workflow/UseRunWatch.test.tsx +131 -0
  805. package/Tests/UI/Components/Workflow/UseWorkflowEnabled.test.tsx +612 -0
  806. package/Tests/UI/Components/Workflow/ValuePicker/ArgumentControl.test.ts +80 -0
  807. package/Tests/UI/Components/Workflow/ValuePicker/InsertValueButton.test.tsx +114 -0
  808. package/Tests/UI/Components/Workflow/ValuePicker/NoPickThisValueLinks.test.ts +111 -0
  809. package/Tests/UI/Components/Workflow/ValuePicker/ReferenceDescription.test.ts +257 -0
  810. package/Tests/UI/Components/Workflow/ValuePicker/StepGraph.test.ts +271 -0
  811. package/Tests/UI/Components/Workflow/ValuePicker/StepSampleSource.test.ts +763 -0
  812. package/Tests/UI/Components/Workflow/ValuePicker/StepSampleSourceIncomingEmail.test.ts +234 -0
  813. package/Tests/UI/Components/Workflow/ValuePicker/StepValueSource.test.ts +366 -0
  814. package/Tests/UI/Components/Workflow/ValuePicker/TemplateText.test.ts +256 -0
  815. package/Tests/UI/Components/Workflow/ValuePicker/TemplateTextDom.test.ts +264 -0
  816. package/Tests/UI/Components/Workflow/ValuePicker/TemplateTextEditor.test.tsx +740 -0
  817. package/Tests/UI/Components/Workflow/ValuePicker/TemplateTextHistory.test.ts +139 -0
  818. package/Tests/UI/Components/Workflow/ValuePicker/ValuePickerContext.test.tsx +473 -0
  819. package/Tests/UI/Components/Workflow/ValuePicker/ValuePickerContextRefresh.test.tsx +444 -0
  820. package/Tests/UI/Components/Workflow/ValuePicker/ValuePickerDarkMode.test.ts +231 -0
  821. package/Tests/UI/Components/Workflow/ValuePicker/ValuePickerMenu.test.tsx +612 -0
  822. package/Tests/UI/Components/Workflow/ValuePicker/ValuePickerMenuSamples.test.tsx +784 -0
  823. package/Tests/UI/Components/Workflow/ValuePicker/ValuePickerPopupPosition.test.ts +113 -0
  824. package/Tests/UI/Components/Workflow/ValuePicker/ValuePickerTestUtils.tsx +171 -0
  825. package/Tests/UI/Components/Workflow/ValuePicker/ValueSingleField.test.tsx +350 -0
  826. package/Tests/UI/Components/Workflow/ValuePicker/ValueSuggestion.test.ts +377 -0
  827. package/Tests/UI/Components/Workflow/ValuePicker/ValueSuggestionSamples.test.ts +357 -0
  828. package/Tests/UI/Components/Workflow/ValuePicker/ValueTextField.test.tsx +430 -0
  829. package/Tests/UI/Components/Workflow/ValuePicker/VariableValueSource.test.ts +101 -0
  830. package/Tests/UI/Components/Workflow/WebhookTriggerPanel.test.tsx +833 -0
  831. package/Tests/UI/Components/Workflow/WebhookTriggerPanelI18n.test.ts +193 -0
  832. package/Tests/UI/Components/Workflow/Workflow.test.tsx +716 -86
  833. package/Tests/UI/Components/Workflow/WorkflowEnabledDarkMode.test.ts +178 -0
  834. package/Tests/UI/Components/Workflow/WorkflowEnabledI18n.test.tsx +319 -0
  835. package/Tests/UI/Components/Workflow/WorkflowEnabledSwitch.test.tsx +144 -0
  836. package/Tests/UI/Components/Workflow/WorkflowIncomingEmailSecretKey.test.ts +393 -0
  837. package/Tests/UI/Components/Workflow/WorkflowLogModal.test.tsx +598 -1
  838. package/Tests/UI/Components/Workflow/WorkflowRunExport.test.ts +750 -0
  839. package/Tests/UI/Components/Workflow/WorkflowRunExportActions.test.tsx +556 -0
  840. package/Tests/UI/Components/Workflow/WorkflowRunExportI18n.test.ts +200 -0
  841. package/Tests/UI/Components/Workflow/WorkflowStatusLabel.test.tsx +75 -0
  842. package/Tests/UI/Components/Workflow/WorkflowTurnOnModal.test.tsx +256 -0
  843. package/Tests/UI/Components/Workflow/WorkflowTurnedOffNotice.test.tsx +99 -0
  844. package/Tests/UI/Components/Workflow/WorkflowWebhookSecretKey.test.ts +422 -0
  845. package/Tests/UI/Components/fixtures/MarkdownPasteFixtures.ts +460 -0
  846. package/Tests/UI/DeleteConfirmationNamesGuard.test.ts +643 -0
  847. package/Tests/UI/DialogActionRules.test.ts +716 -0
  848. package/Tests/UI/DialogPrimaryActionGuard.test.ts +528 -0
  849. package/Tests/UI/EsbuildConfig.test.ts +115 -39
  850. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +4 -4
  851. package/Tests/UI/Monitor/MonitorLogSummaryRender.test.tsx +377 -0
  852. package/Tests/UI/Styles/PillDarkTheme.test.tsx +177 -0
  853. package/Tests/UI/Styles/ToggleTheme.test.ts +685 -0
  854. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +98 -3
  855. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +20 -2
  856. package/Tests/UI/Utils/McpOAuthPendingAuthorization.test.ts +825 -0
  857. package/Tests/UI/Utils/McpOAuthPendingAuthorizationHttps.test.ts +88 -0
  858. package/Tests/UI/Utils/ModelDisplayName.test.ts +450 -0
  859. package/Tests/UI/Utils/TranslateTemplate.test.ts +149 -0
  860. package/Tests/Utils/AiRemediation/KubectlWriteScopeParityCases.ts +1 -1
  861. package/Tests/Utils/DeveloperDocs/AiAssistantExamples.test.ts +228 -0
  862. package/Tests/Utils/DeveloperDocs/ApiExamples.test.ts +252 -0
  863. package/Tests/Utils/DeveloperDocs/Hcl.test.ts +358 -0
  864. package/Tests/Utils/DeveloperDocs/HclTestValue.ts +56 -0
  865. package/Tests/Utils/DeveloperDocs/TerraformConfig.test.ts +590 -0
  866. package/Tests/Utils/DeveloperDocs/TerraformMonitorSteps.test.ts +608 -0
  867. package/Tests/Utils/DeveloperDocs/TerraformProviderSchemaContract.test.ts +250 -0
  868. package/Tests/Utils/DeveloperDocs/TerraformSchema.test.ts +284 -0
  869. package/Tests/Utils/Email/EmailAddressList.test.ts +149 -0
  870. package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
  871. package/Tests/Utils/Markdown/DashboardMarkdownRenderer.ts +81 -0
  872. package/Tests/Utils/Markdown/UntrustedMarkdown.test.ts +1339 -0
  873. package/Tests/Utils/Monitor/IncomingEmailMonitorAddress.test.ts +131 -0
  874. package/Tests/Utils/Monitor/MonitorLogSummaryUtil.test.ts +862 -0
  875. package/Tests/Utils/Monitor/MonitorOverviewArchived.test.ts +266 -0
  876. package/Tests/Utils/Monitor/MonitorPauseState.test.ts +143 -0
  877. package/Tests/Utils/Rum/SessionIdentity.test.ts +146 -0
  878. package/Tests/Utils/StatusPage/ArchivedMonitorResources.test.ts +99 -0
  879. package/Types/AI/AIAgentRunLimits.ts +146 -0
  880. package/Types/AI/AIRunType.ts +7 -6
  881. package/Types/AI/AIWorkloadLimits.ts +82 -0
  882. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +2 -2
  883. package/Types/AnalyticsDatabase/RetentionTtl.ts +57 -0
  884. package/Types/BaseDatabase/DatabaseCommonInteractionProps.ts +21 -0
  885. package/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.ts +24 -0
  886. package/Types/BaseDatabase/EnableWorkflowOn.ts +8 -0
  887. package/Types/Call/CallProvider.ts +7 -0
  888. package/Types/Code/CodeType.ts +2 -0
  889. package/Types/Code/JsonSyntax.ts +923 -0
  890. package/Types/CustomField/CustomFieldCreateSettings.ts +549 -0
  891. package/Types/CustomField/CustomFieldMappingCatalog.ts +77 -0
  892. package/Types/CustomField/CustomFieldValueValidator.ts +10 -7
  893. package/Types/Database/TableMetadata.ts +10 -0
  894. package/Types/DatabaseServer/DatabaseEndpoint.ts +43 -0
  895. package/Types/Email/EmailTemplateType.ts +2 -0
  896. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +1 -1
  897. package/Types/Exception/ExceptionMessages.ts +1 -0
  898. package/Types/Icon/IconProp.ts +2 -0
  899. package/Types/Incident/IncidentFormIpAllowlist.ts +206 -0
  900. package/Types/Incident/IncidentFormPublic.ts +1145 -0
  901. package/Types/IncomingCall/MissedIncomingCall.ts +72 -0
  902. package/Types/Kubernetes/KubernetesClusterAiAccess.ts +15 -3
  903. package/Types/Mcp/McpOAuthClientAuthMethod.ts +17 -0
  904. package/Types/Mcp/McpOAuthScope.ts +180 -0
  905. package/Types/Mcp/McpOAuthTicket.ts +21 -0
  906. package/Types/Mcp/McpOAuthTokenType.ts +18 -0
  907. package/Types/MessageQueue/MessageQueueIdentity.ts +256 -0
  908. package/Types/MessageQueue/MessageQueueManualIdentity.ts +325 -0
  909. package/Types/MessageQueue/MessageQueueMetricCatalog.ts +1357 -0
  910. package/Types/MessageQueue/MessagingSystem.ts +518 -0
  911. package/Types/MessageQueue/MessagingTelemetryResolver.ts +2311 -0
  912. package/Types/Monitor/MessageQueueAlertTemplates.ts +2128 -0
  913. package/Types/Monitor/MonitorSecretAccess.ts +185 -0
  914. package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +13 -2
  915. package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +1 -1
  916. package/Types/NotificationSetting/NotificationSettingEventType.ts +3 -0
  917. package/Types/OnCallDutyPolicy/OnCallDutyPolicyArchive.ts +19 -0
  918. package/Types/Permission.ts +354 -0
  919. package/Types/ResourceAiAgent/ResourceAiAccess.ts +17 -6
  920. package/Types/Rules/RuleCriteriaFieldRegistry.ts +12 -0
  921. package/Types/Rules/RuleRun.ts +4 -0
  922. package/Types/StatusPage/StatusPageArchive.ts +20 -0
  923. package/Types/Team/ComplianceNotificationChannel.ts +4 -3
  924. package/Types/Team/ComplianceRule.ts +71 -18
  925. package/Types/Team/ComplianceRuleType.ts +2 -2
  926. package/Types/Team/TeamComplianceStatus.ts +6 -2
  927. package/Types/Telemetry/EntityType.ts +16 -0
  928. package/Types/Telemetry/LockedFilterDetail.ts +22 -0
  929. package/Types/Workflow/Component.ts +61 -2
  930. package/Types/Workflow/ComponentID.ts +1 -0
  931. package/Types/Workflow/Components/AI.ts +2 -4
  932. package/Types/Workflow/Components/API.ts +46 -26
  933. package/Types/Workflow/Components/BaseModel.ts +28 -37
  934. package/Types/Workflow/Components/Condition.ts +82 -30
  935. package/Types/Workflow/Components/ConditionComparison.ts +348 -0
  936. package/Types/Workflow/Components/ConditionEvaluation.ts +438 -0
  937. package/Types/Workflow/Components/Email.ts +1 -1
  938. package/Types/Workflow/Components/IncomingEmail.ts +140 -0
  939. package/Types/Workflow/Components/JSON.ts +11 -3
  940. package/Types/Workflow/Components/JavaScript.ts +0 -2
  941. package/Types/Workflow/Components/Manual.ts +2 -3
  942. package/Types/Workflow/Components/Schedule.ts +1 -2
  943. package/Types/Workflow/Components/Slack.ts +12 -4
  944. package/Types/Workflow/Components/Sleep.ts +4 -4
  945. package/Types/Workflow/Components/Webhook.ts +5 -7
  946. package/Types/Workflow/Components.ts +4 -2
  947. package/Types/Workflow/DatabaseOperation.ts +67 -0
  948. package/Types/Workflow/Documentation/AIDocumentation.ts +94 -0
  949. package/Types/Workflow/Documentation/APIDocumentation.ts +94 -0
  950. package/Types/Workflow/Documentation/ComponentDocumentation.ts +92 -0
  951. package/Types/Workflow/Documentation/DatabaseDocumentation.ts +666 -0
  952. package/Types/Workflow/Documentation/DocumentationContext.ts +245 -0
  953. package/Types/Workflow/Documentation/DocumentationLinks.ts +117 -0
  954. package/Types/Workflow/Documentation/DocumentationText.ts +141 -0
  955. package/Types/Workflow/Documentation/Index.ts +114 -0
  956. package/Types/Workflow/Documentation/MessagingDocumentation.ts +316 -0
  957. package/Types/Workflow/Documentation/ModelExamples.ts +333 -0
  958. package/Types/Workflow/Documentation/TriggerDocumentation.ts +217 -0
  959. package/Types/Workflow/Documentation/UtilityDocumentation.ts +338 -0
  960. package/Types/Workflow/IncomingEmailTrigger.ts +384 -0
  961. package/Types/Workflow/StepSamples.ts +965 -0
  962. package/Types/Workflow/StepTrace.ts +311 -6
  963. package/Types/Workflow/SystemColumns.ts +84 -0
  964. package/Types/Workflow/Templates.ts +279 -2
  965. package/Types/Workflow/WebhookTrigger.ts +87 -0
  966. package/Types/Workflow/WorkflowArchive.ts +45 -0
  967. package/Types/Workflow/WorkflowEnabled.ts +51 -0
  968. package/Types/Workflow/WorkflowStatus.ts +36 -0
  969. package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +32 -2
  970. package/Types/XML.ts +26 -0
  971. package/UI/Components/ActionButton/RowActions.tsx +8 -5
  972. package/UI/Components/ActionCard/ActionCard.tsx +22 -2
  973. package/UI/Components/BulkUpdate/BulkLabelActions.tsx +1 -0
  974. package/UI/Components/BulkUpdate/BulkOwnerActions.tsx +1 -0
  975. package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +6 -0
  976. package/UI/Components/Button/Button.tsx +19 -11
  977. package/UI/Components/Card/Card.tsx +64 -19
  978. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +1 -4
  979. package/UI/Components/CodeEditor/CodeEditor.css +379 -0
  980. package/UI/Components/CodeEditor/CodeEditor.tsx +1197 -294
  981. package/UI/Components/CodeEditor/CodeEditorCommands.ts +774 -0
  982. package/UI/Components/CodeEditor/CodeEditorHighlight.ts +106 -0
  983. package/UI/Components/CodeEditor/CodeEditorLanguages.ts +164 -0
  984. package/UI/Components/CodeEditor/YamlEditor.tsx +28 -326
  985. package/UI/Components/CollapsibleSection/CollapsibleSection.tsx +19 -3
  986. package/UI/Components/CopyTextButton/CopyTextButton.tsx +5 -1
  987. package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +6 -25
  988. package/UI/Components/DeleteConfirmation/DeleteConfirmationMessage.tsx +175 -0
  989. package/UI/Components/DeleteConfirmation/DeleteItemNames.tsx +71 -0
  990. package/UI/Components/DeleteConfirmation/NamedSentence.tsx +55 -0
  991. package/UI/Components/DeleteConfirmation/TypeToConfirmDelete.tsx +90 -0
  992. package/UI/Components/Dictionary/Dictionary.tsx +31 -1
  993. package/UI/Components/Dropdown/DropdownValueBadge.tsx +21 -13
  994. package/UI/Components/EditionLabel/EditionLabel.tsx +20 -14
  995. package/UI/Components/Error/PageError.tsx +1 -1
  996. package/UI/Components/ErrorMessage/ErrorMessage.tsx +11 -1
  997. package/UI/Components/EventItem/EventItem.tsx +1 -11
  998. package/UI/Components/FormModal/BasicFormModal.tsx +23 -0
  999. package/UI/Components/Forms/BasicForm.tsx +188 -78
  1000. package/UI/Components/Forms/BasicModelForm.tsx +2 -0
  1001. package/UI/Components/Forms/Fields/FormField.tsx +78 -5
  1002. package/UI/Components/Forms/ModelForm.tsx +8 -0
  1003. package/UI/Components/Forms/Steps/Step.tsx +29 -6
  1004. package/UI/Components/Forms/Steps/Steps.tsx +10 -0
  1005. package/UI/Components/Forms/Types/Field.ts +49 -1
  1006. package/UI/Components/Forms/Validation.ts +18 -4
  1007. package/UI/Components/Icon/Icon.tsx +25 -2
  1008. package/UI/Components/Input/Input.tsx +11 -4
  1009. package/UI/Components/Label/Label.tsx +0 -2
  1010. package/UI/Components/LabelRule/ImportLabelRulesModal.tsx +1 -2
  1011. package/UI/Components/LogsViewer/LogsViewer.tsx +4 -0
  1012. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +21 -3
  1013. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  1014. package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +877 -79
  1015. package/UI/Components/Markdown.tsx/MarkdownEditorHistory.ts +284 -0
  1016. package/UI/Components/Markdown.tsx/MarkdownListEditing.ts +1362 -0
  1017. package/UI/Components/Markdown.tsx/MarkdownPaste.ts +1326 -0
  1018. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +114 -10
  1019. package/UI/Components/Markdown.tsx/MarkdownVisualEditing.ts +1032 -0
  1020. package/UI/Components/Modal/ConfirmModal.tsx +39 -8
  1021. package/UI/Components/Modal/Modal.tsx +136 -10
  1022. package/UI/Components/Modal/ModalFooter.tsx +28 -10
  1023. package/UI/Components/ModelDelete/ModelDelete.tsx +168 -6
  1024. package/UI/Components/ModelFormModal/ModelFormModal.tsx +47 -9
  1025. package/UI/Components/ModelTable/BaseModelTable.tsx +140 -95
  1026. package/UI/Components/ModelTable/TableView.tsx +14 -2
  1027. package/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.tsx +1 -2
  1028. package/UI/Components/Navbar/NavBar.tsx +3 -2
  1029. package/UI/Components/Pill/Pill.tsx +53 -43
  1030. package/UI/Components/Pill/PillColors.ts +464 -0
  1031. package/UI/Components/ResetObjectID/ResetObjectID.tsx +35 -9
  1032. package/UI/Components/RuleRun/RunRuleNowModal.tsx +6 -0
  1033. package/UI/Components/SideMenu/SideMenu.tsx +136 -12
  1034. package/UI/Components/SideMenu/SideMenuSection.tsx +43 -4
  1035. package/UI/Components/SideMenu/SideMenuSectionState.ts +200 -0
  1036. package/UI/Components/Table/EmptyTableMessage.ts +81 -0
  1037. package/UI/Components/Table/Table.tsx +50 -21
  1038. package/UI/Components/Table/TableRow.tsx +9 -1
  1039. package/UI/Components/TelemetryViewer/FacetVisibility.ts +97 -2
  1040. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +13 -0
  1041. package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +214 -7
  1042. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +21 -3
  1043. package/UI/Components/TextArea/TextArea.tsx +183 -5
  1044. package/UI/Components/Toggle/Toggle.tsx +256 -43
  1045. package/UI/Components/Workflow/ArgumentsForm.tsx +496 -359
  1046. package/UI/Components/Workflow/BreakableCode.tsx +88 -0
  1047. package/UI/Components/Workflow/ColumnEditor/AddColumnPicker.tsx +577 -0
  1048. package/UI/Components/Workflow/ColumnEditor/ColumnConditionRow.tsx +20 -5
  1049. package/UI/Components/Workflow/ColumnEditor/ColumnControl.ts +63 -4
  1050. package/UI/Components/Workflow/ColumnEditor/ColumnFieldRow.tsx +21 -4
  1051. package/UI/Components/Workflow/ColumnEditor/ColumnPickerOptions.ts +387 -0
  1052. package/UI/Components/Workflow/ColumnEditor/ColumnUse.ts +126 -0
  1053. package/UI/Components/Workflow/ColumnEditor/ColumnValueInput.tsx +151 -84
  1054. package/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.tsx +13 -9
  1055. package/UI/Components/Workflow/ColumnEditor/ModelRecordForm.tsx +36 -27
  1056. package/UI/Components/Workflow/Component.tsx +129 -12
  1057. package/UI/Components/Workflow/ComponentPicker/ComponentSearch.ts +1259 -0
  1058. package/UI/Components/Workflow/ComponentPicker/PickerCatalog.ts +419 -0
  1059. package/UI/Components/Workflow/ComponentPicker/PickerItems.tsx +300 -0
  1060. package/UI/Components/Workflow/ComponentPortViewer.tsx +24 -60
  1061. package/UI/Components/Workflow/ComponentPrimaryPanel.tsx +171 -0
  1062. package/UI/Components/Workflow/ComponentReturnValueViewer.tsx +67 -88
  1063. package/UI/Components/Workflow/ComponentSettingsModal.tsx +345 -105
  1064. package/UI/Components/Workflow/ComponentSettingsSection.tsx +103 -0
  1065. package/UI/Components/Workflow/ComponentsModal.tsx +958 -601
  1066. package/UI/Components/Workflow/Condition/ConditionEditor.tsx +484 -0
  1067. package/UI/Components/Workflow/Condition/ConditionModel.ts +785 -0
  1068. package/UI/Components/Workflow/CronScheduleField.tsx +53 -37
  1069. package/UI/Components/Workflow/DocumentationViewer.tsx +399 -118
  1070. package/UI/Components/Workflow/DownloadWorkflowRun.ts +137 -0
  1071. package/UI/Components/Workflow/GraphLint.ts +9 -1
  1072. package/UI/Components/Workflow/GraphLintSummary.ts +142 -2
  1073. package/UI/Components/Workflow/IncomingEmailTriggerPanel.tsx +502 -0
  1074. package/UI/Components/Workflow/ManualTriggerPanel.tsx +41 -0
  1075. package/UI/Components/Workflow/ModelColumnEditor.tsx +7 -10
  1076. package/UI/Components/Workflow/ModelFieldPicker.tsx +76 -14
  1077. package/UI/Components/Workflow/ModelSchema.ts +19 -24
  1078. package/UI/Components/Workflow/NodePlacement.ts +235 -1
  1079. package/UI/Components/Workflow/RunModal.tsx +1 -1
  1080. package/UI/Components/Workflow/StepTracePresentation.ts +537 -0
  1081. package/UI/Components/Workflow/StepTraceViewer.tsx +644 -83
  1082. package/UI/Components/Workflow/UseRunWatch.ts +17 -0
  1083. package/UI/Components/Workflow/UseWorkflowEnabled.ts +275 -0
  1084. package/UI/Components/Workflow/Utils.ts +119 -103
  1085. package/UI/Components/Workflow/ValuePicker/ArgumentControl.ts +146 -0
  1086. package/UI/Components/Workflow/ValuePicker/DefaultValueSources.ts +148 -0
  1087. package/UI/Components/Workflow/ValuePicker/InsertValueButton.tsx +116 -0
  1088. package/UI/Components/Workflow/ValuePicker/ReferenceChip.tsx +162 -0
  1089. package/UI/Components/Workflow/ValuePicker/ReferenceDescription.ts +303 -0
  1090. package/UI/Components/Workflow/ValuePicker/StepGraph.ts +240 -0
  1091. package/UI/Components/Workflow/ValuePicker/StepSampleSource.ts +537 -0
  1092. package/UI/Components/Workflow/ValuePicker/StepValueSource.ts +291 -0
  1093. package/UI/Components/Workflow/ValuePicker/TemplateText.ts +303 -0
  1094. package/UI/Components/Workflow/ValuePicker/TemplateTextDom.ts +563 -0
  1095. package/UI/Components/Workflow/ValuePicker/TemplateTextEditor.tsx +1233 -0
  1096. package/UI/Components/Workflow/ValuePicker/TemplateTextHistory.ts +138 -0
  1097. package/UI/Components/Workflow/ValuePicker/ValuePickerContext.tsx +529 -0
  1098. package/UI/Components/Workflow/ValuePicker/ValuePickerMenu.tsx +1003 -0
  1099. package/UI/Components/Workflow/ValuePicker/ValuePickerPopup.tsx +310 -0
  1100. package/UI/Components/Workflow/ValuePicker/ValueSingleField.tsx +274 -0
  1101. package/UI/Components/Workflow/ValuePicker/ValueSuggestion.ts +694 -0
  1102. package/UI/Components/Workflow/ValuePicker/ValueTextField.tsx +334 -0
  1103. package/UI/Components/Workflow/ValuePicker/VariableValueSource.ts +132 -0
  1104. package/UI/Components/Workflow/WebhookTriggerPanel.tsx +522 -0
  1105. package/UI/Components/Workflow/Workflow.tsx +381 -36
  1106. package/UI/Components/Workflow/WorkflowEnabledCopy.ts +55 -0
  1107. package/UI/Components/Workflow/WorkflowEnabledSwitch.tsx +44 -0
  1108. package/UI/Components/Workflow/WorkflowIncomingEmailSecretKey.ts +156 -0
  1109. package/UI/Components/Workflow/WorkflowLogModal.tsx +98 -17
  1110. package/UI/Components/Workflow/WorkflowRunExport.ts +435 -0
  1111. package/UI/Components/Workflow/WorkflowRunExportActions.tsx +242 -0
  1112. package/UI/Components/Workflow/WorkflowStatus.tsx +25 -26
  1113. package/UI/Components/Workflow/WorkflowTurnOnModal.tsx +119 -0
  1114. package/UI/Components/Workflow/WorkflowTurnedOffNotice.tsx +91 -0
  1115. package/UI/Components/Workflow/WorkflowWebhookSecretKey.ts +184 -0
  1116. package/UI/Styles/Theme.css +82 -3
  1117. package/UI/Utils/McpOAuthPendingAuthorization.ts +132 -0
  1118. package/UI/Utils/ModelDisplayName.ts +294 -0
  1119. package/UI/Utils/TranslateTemplate.ts +123 -0
  1120. package/UI/esbuild-config.js +2 -32
  1121. package/Utils/DeveloperDocs/AiAssistantExamples.ts +383 -0
  1122. package/Utils/DeveloperDocs/ApiExamples.ts +355 -0
  1123. package/Utils/DeveloperDocs/ExampleValues.ts +111 -0
  1124. package/Utils/DeveloperDocs/Hcl.ts +697 -0
  1125. package/Utils/DeveloperDocs/TerraformConfig.ts +805 -0
  1126. package/Utils/DeveloperDocs/TerraformMonitorSteps.ts +583 -0
  1127. package/Utils/DeveloperDocs/TerraformSchema.ts +565 -0
  1128. package/Utils/DeveloperDocs/TerraformValues.ts +375 -0
  1129. package/Utils/Email/EmailAddressList.ts +165 -0
  1130. package/Utils/LabelRuleImportExport.ts +2 -0
  1131. package/Utils/Markdown/UntrustedMarkdown.ts +1513 -0
  1132. package/Utils/ModelImportExport.ts +17 -0
  1133. package/Utils/Monitor/IncomingEmailMonitorAddress.ts +73 -4
  1134. package/Utils/Monitor/IncomingEmailMonitorRequestUtil.ts +41 -0
  1135. package/Utils/Monitor/MonitorLogSummaryUtil.ts +212 -0
  1136. package/Utils/Monitor/MonitorOverviewPresentationUtil.ts +27 -1
  1137. package/Utils/Monitor/MonitorPauseState.ts +90 -0
  1138. package/Utils/Rum/SessionIdentity.ts +88 -0
  1139. package/Utils/StatusPage/ArchivedMonitorResources.ts +38 -0
  1140. package/Utils/Telemetry/EntityKey.ts +48 -0
  1141. package/build/dist/Models/AnalyticsModels/AuditLog.js +56 -0
  1142. package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
  1143. package/build/dist/Models/AnalyticsModels/Log.js +26 -2
  1144. package/build/dist/Models/AnalyticsModels/Log.js.map +1 -1
  1145. package/build/dist/Models/AnalyticsModels/Metric.js +28 -2
  1146. package/build/dist/Models/AnalyticsModels/Metric.js.map +1 -1
  1147. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1m.js +21 -2
  1148. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1m.js.map +1 -1
  1149. package/build/dist/Models/AnalyticsModels/SloHistory.js +6 -4
  1150. package/build/dist/Models/AnalyticsModels/SloHistory.js.map +1 -1
  1151. package/build/dist/Models/DatabaseModels/AIConversation.js +125 -1
  1152. package/build/dist/Models/DatabaseModels/AIConversation.js.map +1 -1
  1153. package/build/dist/Models/DatabaseModels/AutoRemediationRule.js +1 -1
  1154. package/build/dist/Models/DatabaseModels/AutoRemediationRule.js.map +1 -1
  1155. package/build/dist/Models/DatabaseModels/CephCluster.js +12 -0
  1156. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
  1157. package/build/dist/Models/DatabaseModels/CloudResource.js +12 -0
  1158. package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
  1159. package/build/dist/Models/DatabaseModels/CodeRepository.js +1 -1
  1160. package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
  1161. package/build/dist/Models/DatabaseModels/Dashboard.js +151 -1
  1162. package/build/dist/Models/DatabaseModels/Dashboard.js.map +1 -1
  1163. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +8 -0
  1164. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  1165. package/build/dist/Models/DatabaseModels/DatabaseServer.js +12 -0
  1166. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
  1167. package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js +1 -0
  1168. package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js.map +1 -1
  1169. package/build/dist/Models/DatabaseModels/DockerHost.js +12 -0
  1170. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  1171. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +12 -0
  1172. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
  1173. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +2 -0
  1174. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
  1175. package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js +1 -0
  1176. package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js.map +1 -1
  1177. package/build/dist/Models/DatabaseModels/GlobalOidc.js +0 -4
  1178. package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -1
  1179. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +0 -4
  1180. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -1
  1181. package/build/dist/Models/DatabaseModels/GlobalSso.js +0 -4
  1182. package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -1
  1183. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +0 -4
  1184. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -1
  1185. package/build/dist/Models/DatabaseModels/Host.js +12 -0
  1186. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  1187. package/build/dist/Models/DatabaseModels/IncidentForm.js +605 -0
  1188. package/build/dist/Models/DatabaseModels/IncidentForm.js.map +1 -0
  1189. package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js +299 -0
  1190. package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js.map +1 -0
  1191. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +60 -0
  1192. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  1193. package/build/dist/Models/DatabaseModels/IncomingCallLog.js +15 -1
  1194. package/build/dist/Models/DatabaseModels/IncomingCallLog.js.map +1 -1
  1195. package/build/dist/Models/DatabaseModels/Index.js +20 -0
  1196. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  1197. package/build/dist/Models/DatabaseModels/IoTFleet.js +12 -0
  1198. package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -1
  1199. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +12 -0
  1200. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  1201. package/build/dist/Models/DatabaseModels/LlmModelPrice.js +1 -0
  1202. package/build/dist/Models/DatabaseModels/LlmModelPrice.js.map +1 -1
  1203. package/build/dist/Models/DatabaseModels/McpOAuthClient.js +215 -0
  1204. package/build/dist/Models/DatabaseModels/McpOAuthClient.js.map +1 -0
  1205. package/build/dist/Models/DatabaseModels/McpOAuthGrant.js +494 -0
  1206. package/build/dist/Models/DatabaseModels/McpOAuthGrant.js.map +1 -0
  1207. package/build/dist/Models/DatabaseModels/McpOAuthToken.js +256 -0
  1208. package/build/dist/Models/DatabaseModels/McpOAuthToken.js.map +1 -0
  1209. package/build/dist/Models/DatabaseModels/MessageQueue.js +1106 -0
  1210. package/build/dist/Models/DatabaseModels/MessageQueue.js.map +1 -0
  1211. package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js +562 -0
  1212. package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js.map +1 -0
  1213. package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js +643 -0
  1214. package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js.map +1 -0
  1215. package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js +506 -0
  1216. package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js.map +1 -0
  1217. package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js +505 -0
  1218. package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js.map +1 -0
  1219. package/build/dist/Models/DatabaseModels/Monitor.js +160 -1
  1220. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  1221. package/build/dist/Models/DatabaseModels/MonitorSecret.js +89 -1
  1222. package/build/dist/Models/DatabaseModels/MonitorSecret.js.map +1 -1
  1223. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js +1 -0
  1224. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js.map +1 -1
  1225. package/build/dist/Models/DatabaseModels/OnCallDutyPolicy.js +158 -1
  1226. package/build/dist/Models/DatabaseModels/OnCallDutyPolicy.js.map +1 -1
  1227. package/build/dist/Models/DatabaseModels/PodmanHost.js +12 -0
  1228. package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
  1229. package/build/dist/Models/DatabaseModels/Project.js +103 -102
  1230. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  1231. package/build/dist/Models/DatabaseModels/ProjectOidc.js +0 -4
  1232. package/build/dist/Models/DatabaseModels/ProjectOidc.js.map +1 -1
  1233. package/build/dist/Models/DatabaseModels/ProjectSso.js +0 -4
  1234. package/build/dist/Models/DatabaseModels/ProjectSso.js.map +1 -1
  1235. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +12 -0
  1236. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
  1237. package/build/dist/Models/DatabaseModels/RumApplication.js +12 -0
  1238. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  1239. package/build/dist/Models/DatabaseModels/ServerlessFunction.js +12 -0
  1240. package/build/dist/Models/DatabaseModels/ServerlessFunction.js.map +1 -1
  1241. package/build/dist/Models/DatabaseModels/Service.js +12 -0
  1242. package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
  1243. package/build/dist/Models/DatabaseModels/StatusPage.js +158 -1
  1244. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  1245. package/build/dist/Models/DatabaseModels/StatusPageOidc.js +0 -4
  1246. package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
  1247. package/build/dist/Models/DatabaseModels/StatusPageSso.js +0 -4
  1248. package/build/dist/Models/DatabaseModels/StatusPageSso.js.map +1 -1
  1249. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +49 -3
  1250. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
  1251. package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js +1 -0
  1252. package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js.map +1 -1
  1253. package/build/dist/Models/DatabaseModels/VMwareVCenter.js +12 -0
  1254. package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -1
  1255. package/build/dist/Models/DatabaseModels/Workflow.js +230 -8
  1256. package/build/dist/Models/DatabaseModels/Workflow.js.map +1 -1
  1257. package/build/dist/Server/API/AIAgentDataAPI.js +1 -1
  1258. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  1259. package/build/dist/Server/API/AIChatAPI.js +9 -103
  1260. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  1261. package/build/dist/Server/API/AIInvestigationAPI.js +3 -3
  1262. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  1263. package/build/dist/Server/API/AIInvestigationConversationAPI.js +162 -0
  1264. package/build/dist/Server/API/AIInvestigationConversationAPI.js.map +1 -0
  1265. package/build/dist/Server/API/AutoRemediationAPI.js +9 -31
  1266. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  1267. package/build/dist/Server/API/CommonAPI.js +15 -0
  1268. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  1269. package/build/dist/Server/API/DashboardAPI.js +7 -3
  1270. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  1271. package/build/dist/Server/API/IncidentFormAPI.js +245 -0
  1272. package/build/dist/Server/API/IncidentFormAPI.js.map +1 -0
  1273. package/build/dist/Server/API/ProjectOIDC.js +16 -24
  1274. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  1275. package/build/dist/Server/API/ProjectSSO.js +16 -24
  1276. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  1277. package/build/dist/Server/API/StatusPageAPI.js +96 -88
  1278. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  1279. package/build/dist/Server/Enterprise/EnterpriseEdition.js +79 -25
  1280. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -1
  1281. package/build/dist/Server/Enterprise/EnterpriseFeature.js +24 -3
  1282. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -1
  1283. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +1 -1
  1284. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -1
  1285. package/build/dist/Server/EnvironmentConfig.js +24 -1
  1286. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  1287. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js +63 -0
  1288. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js.map +1 -0
  1289. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js +41 -0
  1290. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js.map +1 -0
  1291. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js +40 -0
  1292. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js.map +1 -0
  1293. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js +183 -0
  1294. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js.map +1 -0
  1295. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796800000000-FoldAiSwitchesIntoEnableAi.js +79 -0
  1296. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796800000000-FoldAiSwitchesIntoEnableAi.js.map +1 -0
  1297. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796900000000-AddMcpOAuthTables.js +50 -0
  1298. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796900000000-AddMcpOAuthTables.js.map +1 -0
  1299. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797000000000-AddWorkflowIncomingEmailSecretKey.js +25 -0
  1300. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797000000000-AddWorkflowIncomingEmailSecretKey.js.map +1 -0
  1301. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797100000000-AddMonitorSecretAccess.js +32 -0
  1302. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797100000000-AddMonitorSecretAccess.js.map +1 -0
  1303. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797200000000-AddArchiveToMoreResources.js +76 -0
  1304. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797200000000-AddArchiveToMoreResources.js.map +1 -0
  1305. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +18 -0
  1306. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  1307. package/build/dist/Server/Middleware/IncidentFormRateLimit.js +559 -0
  1308. package/build/dist/Server/Middleware/IncidentFormRateLimit.js.map +1 -0
  1309. package/build/dist/Server/Middleware/McpDelegationAuthorization.js +138 -0
  1310. package/build/dist/Server/Middleware/McpDelegationAuthorization.js.map +1 -0
  1311. package/build/dist/Server/Middleware/McpOAuthRateLimit.js +191 -0
  1312. package/build/dist/Server/Middleware/McpOAuthRateLimit.js.map +1 -0
  1313. package/build/dist/Server/Middleware/ProjectAuthorization.js +20 -1
  1314. package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
  1315. package/build/dist/Server/Middleware/UserAuthorization.js +22 -30
  1316. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  1317. package/build/dist/Server/Services/AIService.js +11 -14
  1318. package/build/dist/Server/Services/AIService.js.map +1 -1
  1319. package/build/dist/Server/Services/AnalyticsDatabaseService.js +15 -5
  1320. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  1321. package/build/dist/Server/Services/ApiKeyService.js +11 -8
  1322. package/build/dist/Server/Services/ApiKeyService.js.map +1 -1
  1323. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +19 -27
  1324. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  1325. package/build/dist/Server/Services/AutoRemediationRuleService.js +1 -1
  1326. package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -1
  1327. package/build/dist/Server/Services/DashboardService.js +7 -2
  1328. package/build/dist/Server/Services/DashboardService.js.map +1 -1
  1329. package/build/dist/Server/Services/DatabaseServerService.js +161 -1
  1330. package/build/dist/Server/Services/DatabaseServerService.js.map +1 -1
  1331. package/build/dist/Server/Services/DatabaseService.js +28 -17
  1332. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  1333. package/build/dist/Server/Services/InboundEmail/InboundEmailProvider.js +17 -0
  1334. package/build/dist/Server/Services/InboundEmail/InboundEmailProvider.js.map +1 -1
  1335. package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js +45 -5
  1336. package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js.map +1 -1
  1337. package/build/dist/Server/Services/IncidentCustomFieldService.js +83 -0
  1338. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  1339. package/build/dist/Server/Services/IncidentEpisodeMemberService.js +8 -4
  1340. package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
  1341. package/build/dist/Server/Services/IncidentEpisodeService.js +10 -1
  1342. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  1343. package/build/dist/Server/Services/IncidentFormService.js +1202 -0
  1344. package/build/dist/Server/Services/IncidentFormService.js.map +1 -0
  1345. package/build/dist/Server/Services/IncidentFormSubmissionService.js +91 -0
  1346. package/build/dist/Server/Services/IncidentFormSubmissionService.js.map +1 -0
  1347. package/build/dist/Server/Services/IncidentGroupingEngineService.js +20 -8
  1348. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  1349. package/build/dist/Server/Services/IncidentService.js +106 -4
  1350. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  1351. package/build/dist/Server/Services/IncidentTemplateService.js +18 -0
  1352. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  1353. package/build/dist/Server/Services/IncomingCallMissedCallNotificationService.js +227 -0
  1354. package/build/dist/Server/Services/IncomingCallMissedCallNotificationService.js.map +1 -0
  1355. package/build/dist/Server/Services/IncomingCallPolicyService.js +97 -0
  1356. package/build/dist/Server/Services/IncomingCallPolicyService.js.map +1 -1
  1357. package/build/dist/Server/Services/Index.js +22 -0
  1358. package/build/dist/Server/Services/Index.js.map +1 -1
  1359. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js +5 -36
  1360. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js.map +1 -1
  1361. package/build/dist/Server/Services/KubernetesClusterService.js +3 -3
  1362. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  1363. package/build/dist/Server/Services/LogAggregationService.js +31 -5
  1364. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  1365. package/build/dist/Server/Services/McpOAuthClientService.js +134 -0
  1366. package/build/dist/Server/Services/McpOAuthClientService.js.map +1 -0
  1367. package/build/dist/Server/Services/McpOAuthGrantService.js +256 -0
  1368. package/build/dist/Server/Services/McpOAuthGrantService.js.map +1 -0
  1369. package/build/dist/Server/Services/McpOAuthTokenService.js +175 -0
  1370. package/build/dist/Server/Services/McpOAuthTokenService.js.map +1 -0
  1371. package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js +262 -0
  1372. package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js.map +1 -0
  1373. package/build/dist/Server/Services/MessageQueueLabelRuleService.js +13 -0
  1374. package/build/dist/Server/Services/MessageQueueLabelRuleService.js.map +1 -0
  1375. package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js +334 -0
  1376. package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js.map +1 -0
  1377. package/build/dist/Server/Services/MessageQueueOwnerRuleService.js +13 -0
  1378. package/build/dist/Server/Services/MessageQueueOwnerRuleService.js.map +1 -0
  1379. package/build/dist/Server/Services/MessageQueueOwnerTeamService.js +62 -0
  1380. package/build/dist/Server/Services/MessageQueueOwnerTeamService.js.map +1 -0
  1381. package/build/dist/Server/Services/MessageQueueOwnerUserService.js +62 -0
  1382. package/build/dist/Server/Services/MessageQueueOwnerUserService.js.map +1 -0
  1383. package/build/dist/Server/Services/MessageQueueService.js +1140 -0
  1384. package/build/dist/Server/Services/MessageQueueService.js.map +1 -0
  1385. package/build/dist/Server/Services/MetricAggregationService.js +4 -4
  1386. package/build/dist/Server/Services/MonitorGroupService.js +20 -5
  1387. package/build/dist/Server/Services/MonitorGroupService.js.map +1 -1
  1388. package/build/dist/Server/Services/MonitorProbeService.js +1 -0
  1389. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  1390. package/build/dist/Server/Services/MonitorSecretService.js +346 -0
  1391. package/build/dist/Server/Services/MonitorSecretService.js.map +1 -1
  1392. package/build/dist/Server/Services/MonitorService.js +15 -1
  1393. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  1394. package/build/dist/Server/Services/OnCallDutyPolicyService.js +29 -2
  1395. package/build/dist/Server/Services/OnCallDutyPolicyService.js.map +1 -1
  1396. package/build/dist/Server/Services/OpenTelemetryIngestService.js +25 -4
  1397. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  1398. package/build/dist/Server/Services/ProjectService.js +25 -68
  1399. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  1400. package/build/dist/Server/Services/ResourceAiAccessService.js +0 -9
  1401. package/build/dist/Server/Services/ResourceAiAccessService.js.map +1 -1
  1402. package/build/dist/Server/Services/RunnerJobService.js +2 -2
  1403. package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
  1404. package/build/dist/Server/Services/RunnerService.js +2 -2
  1405. package/build/dist/Server/Services/RunnerService.js.map +1 -1
  1406. package/build/dist/Server/Services/StatusPagePrivateUserService.js +1 -4
  1407. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  1408. package/build/dist/Server/Services/StatusPageService.js +55 -44
  1409. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  1410. package/build/dist/Server/Services/StatusPageSubscriberService.js +17 -0
  1411. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  1412. package/build/dist/Server/Services/TeamComplianceSettingService.js +120 -31
  1413. package/build/dist/Server/Services/TeamComplianceSettingService.js.map +1 -1
  1414. package/build/dist/Server/Services/TeamMemberService.js +306 -72
  1415. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  1416. package/build/dist/Server/Services/UserNotificationRuleService.js +8 -1
  1417. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  1418. package/build/dist/Server/Services/UserNotificationSettingService.js +18 -0
  1419. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  1420. package/build/dist/Server/Services/WorkflowService.js +27 -0
  1421. package/build/dist/Server/Services/WorkflowService.js.map +1 -1
  1422. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js +12 -3
  1423. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js.map +1 -1
  1424. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +3 -0
  1425. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
  1426. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +6 -3
  1427. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  1428. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +109 -37
  1429. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  1430. package/build/dist/Server/Types/Database/Permissions/Index.js +5 -0
  1431. package/build/dist/Server/Types/Database/Permissions/Index.js.map +1 -1
  1432. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +16 -0
  1433. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  1434. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +3 -3
  1435. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +9 -6
  1436. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  1437. package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js +2 -0
  1438. package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js.map +1 -1
  1439. package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js +28 -106
  1440. package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js.map +1 -1
  1441. package/build/dist/Server/Types/Workflow/Components/IncomingEmail.js +166 -0
  1442. package/build/dist/Server/Types/Workflow/Components/IncomingEmail.js.map +1 -0
  1443. package/build/dist/Server/Types/Workflow/Components/Index.js +16 -6
  1444. package/build/dist/Server/Types/Workflow/Components/Index.js.map +1 -1
  1445. package/build/dist/Server/Types/Workflow/Components/Schedule.js +20 -4
  1446. package/build/dist/Server/Types/Workflow/Components/Schedule.js.map +1 -1
  1447. package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js +128 -0
  1448. package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js.map +1 -0
  1449. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +192 -50
  1450. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
  1451. package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js +133 -0
  1452. package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js.map +1 -0
  1453. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +53 -13
  1454. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  1455. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
  1456. package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js +206 -0
  1457. package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js.map +1 -0
  1458. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +53 -26
  1459. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -1
  1460. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +4 -2
  1461. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -1
  1462. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +2 -30
  1463. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
  1464. package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js +1 -1
  1465. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +42 -56
  1466. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
  1467. package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js +17 -28
  1468. package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js.map +1 -1
  1469. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +7 -2
  1470. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  1471. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +47 -64
  1472. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  1473. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +38 -14
  1474. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -1
  1475. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +2 -0
  1476. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -1
  1477. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +40 -10
  1478. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  1479. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +46 -59
  1480. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  1481. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +4 -4
  1482. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -1
  1483. package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js +1 -1
  1484. package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js.map +1 -1
  1485. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +27 -31
  1486. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  1487. package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js +6 -5
  1488. package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js.map +1 -1
  1489. package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js +2 -2
  1490. package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js +5 -5
  1491. package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js +4 -3
  1492. package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js.map +1 -1
  1493. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +4 -4
  1494. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -1
  1495. package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js +1 -1
  1496. package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js.map +1 -1
  1497. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +63 -59
  1498. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
  1499. package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js +412 -0
  1500. package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js.map +1 -0
  1501. package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js +495 -0
  1502. package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js.map +1 -0
  1503. package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js +1 -1
  1504. package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js.map +1 -1
  1505. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js +9 -1
  1506. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -1
  1507. package/build/dist/Server/Utils/AI/Toolbox/AIMetaTools.js +13 -8
  1508. package/build/dist/Server/Utils/AI/Toolbox/AIMetaTools.js.map +1 -1
  1509. package/build/dist/Server/Utils/AI/Toolbox/MonitorTools.js +18 -3
  1510. package/build/dist/Server/Utils/AI/Toolbox/MonitorTools.js.map +1 -1
  1511. package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js +45 -14
  1512. package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js.map +1 -1
  1513. package/build/dist/Server/Utils/AI/Toolbox/Serializer.js +10 -3
  1514. package/build/dist/Server/Utils/AI/Toolbox/Serializer.js.map +1 -1
  1515. package/build/dist/Server/Utils/AI/Toolbox/StatusPageTools.js +31 -7
  1516. package/build/dist/Server/Utils/AI/Toolbox/StatusPageTools.js.map +1 -1
  1517. package/build/dist/Server/Utils/AI/Toolbox/WorkflowProbeTools.js +22 -7
  1518. package/build/dist/Server/Utils/AI/Toolbox/WorkflowProbeTools.js.map +1 -1
  1519. package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js +3 -1
  1520. package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js.map +1 -1
  1521. package/build/dist/Server/Utils/EditionEnforcement.js +20 -158
  1522. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -1
  1523. package/build/dist/Server/Utils/Express.js.map +1 -1
  1524. package/build/dist/Server/Utils/IncomingCall/MissedCallNotification.js +204 -0
  1525. package/build/dist/Server/Utils/IncomingCall/MissedCallNotification.js.map +1 -0
  1526. package/build/dist/Server/Utils/LLM/LLMService.js +193 -54
  1527. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  1528. package/build/dist/Server/Utils/Mcp/McpDelegationToken.js +92 -0
  1529. package/build/dist/Server/Utils/Mcp/McpDelegationToken.js.map +1 -0
  1530. package/build/dist/Server/Utils/Mcp/McpOAuthConfig.js +159 -0
  1531. package/build/dist/Server/Utils/Mcp/McpOAuthConfig.js.map +1 -0
  1532. package/build/dist/Server/Utils/Mcp/McpOAuthGrantAccess.js +204 -0
  1533. package/build/dist/Server/Utils/Mcp/McpOAuthGrantAccess.js.map +1 -0
  1534. package/build/dist/Server/Utils/Mcp/McpOAuthSecret.js +118 -0
  1535. package/build/dist/Server/Utils/Mcp/McpOAuthSecret.js.map +1 -0
  1536. package/build/dist/Server/Utils/Mcp/McpOAuthSignedToken.js +126 -0
  1537. package/build/dist/Server/Utils/Mcp/McpOAuthSignedToken.js.map +1 -0
  1538. package/build/dist/Server/Utils/Mcp/McpOAuthSso.js +159 -0
  1539. package/build/dist/Server/Utils/Mcp/McpOAuthSso.js.map +1 -0
  1540. package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js +25 -0
  1541. package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js.map +1 -1
  1542. package/build/dist/Server/Utils/Monitor/MonitorResource.js +16 -18
  1543. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  1544. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +3 -11
  1545. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  1546. package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js +160 -0
  1547. package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js.map +1 -0
  1548. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
  1549. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  1550. package/build/dist/Server/Utils/SameOriginRequest.js +151 -0
  1551. package/build/dist/Server/Utils/SameOriginRequest.js.map +1 -0
  1552. package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js +3 -3
  1553. package/build/dist/Server/Utils/Slo/SloMetricUtil.js +3 -3
  1554. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
  1555. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
  1556. package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js +11 -4
  1557. package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js.map +1 -1
  1558. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +4 -1
  1559. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  1560. package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js +1022 -0
  1561. package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js.map +1 -0
  1562. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +4 -1
  1563. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
  1564. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +133 -16
  1565. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -1
  1566. package/build/dist/Server/Utils/VendorAssets.js +3 -3
  1567. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +2 -0
  1568. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
  1569. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +2 -0
  1570. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
  1571. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +5 -1
  1572. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  1573. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +5 -1
  1574. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
  1575. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +10 -1
  1576. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  1577. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js +4 -0
  1578. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js.map +1 -1
  1579. package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js +2 -0
  1580. package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js.map +1 -1
  1581. package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js +2 -0
  1582. package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js.map +1 -1
  1583. package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js +4 -0
  1584. package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js.map +1 -1
  1585. package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js +2 -0
  1586. package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js.map +1 -1
  1587. package/build/dist/Types/AI/AIAgentRunLimits.js +91 -0
  1588. package/build/dist/Types/AI/AIAgentRunLimits.js.map +1 -0
  1589. package/build/dist/Types/AI/AIRunType.js +7 -6
  1590. package/build/dist/Types/AI/AIRunType.js.map +1 -1
  1591. package/build/dist/Types/AI/AIWorkloadLimits.js +59 -0
  1592. package/build/dist/Types/AI/AIWorkloadLimits.js.map +1 -0
  1593. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +2 -2
  1594. package/build/dist/Types/AnalyticsDatabase/RetentionTtl.js +55 -0
  1595. package/build/dist/Types/AnalyticsDatabase/RetentionTtl.js.map +1 -0
  1596. package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js +17 -0
  1597. package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js.map +1 -1
  1598. package/build/dist/Types/Code/CodeType.js +2 -0
  1599. package/build/dist/Types/Code/CodeType.js.map +1 -1
  1600. package/build/dist/Types/Code/JsonSyntax.js +604 -0
  1601. package/build/dist/Types/Code/JsonSyntax.js.map +1 -0
  1602. package/build/dist/Types/CustomField/CustomFieldCreateSettings.js +310 -0
  1603. package/build/dist/Types/CustomField/CustomFieldCreateSettings.js.map +1 -0
  1604. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +38 -0
  1605. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -1
  1606. package/build/dist/Types/CustomField/CustomFieldValueValidator.js +10 -7
  1607. package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -1
  1608. package/build/dist/Types/Database/TableMetadata.js +3 -0
  1609. package/build/dist/Types/Database/TableMetadata.js.map +1 -1
  1610. package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js +36 -0
  1611. package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js.map +1 -1
  1612. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  1613. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  1614. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +1 -1
  1615. package/build/dist/Types/Exception/ExceptionMessages.js +1 -0
  1616. package/build/dist/Types/Exception/ExceptionMessages.js.map +1 -1
  1617. package/build/dist/Types/Icon/IconProp.js +2 -0
  1618. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  1619. package/build/dist/Types/Incident/IncidentFormIpAllowlist.js +119 -0
  1620. package/build/dist/Types/Incident/IncidentFormIpAllowlist.js.map +1 -0
  1621. package/build/dist/Types/Incident/IncidentFormPublic.js +678 -0
  1622. package/build/dist/Types/Incident/IncidentFormPublic.js.map +1 -0
  1623. package/build/dist/Types/IncomingCall/MissedIncomingCall.js +61 -0
  1624. package/build/dist/Types/IncomingCall/MissedIncomingCall.js.map +1 -0
  1625. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +10 -3
  1626. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -1
  1627. package/build/dist/Types/Mcp/McpOAuthClientAuthMethod.js +18 -0
  1628. package/build/dist/Types/Mcp/McpOAuthClientAuthMethod.js.map +1 -0
  1629. package/build/dist/Types/Mcp/McpOAuthScope.js +140 -0
  1630. package/build/dist/Types/Mcp/McpOAuthScope.js.map +1 -0
  1631. package/build/dist/Types/Mcp/McpOAuthTicket.js +20 -0
  1632. package/build/dist/Types/Mcp/McpOAuthTicket.js.map +1 -0
  1633. package/build/dist/Types/Mcp/McpOAuthTokenType.js +17 -0
  1634. package/build/dist/Types/Mcp/McpOAuthTokenType.js.map +1 -0
  1635. package/build/dist/Types/MessageQueue/MessageQueueIdentity.js +184 -0
  1636. package/build/dist/Types/MessageQueue/MessageQueueIdentity.js.map +1 -0
  1637. package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js +190 -0
  1638. package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js.map +1 -0
  1639. package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js +1057 -0
  1640. package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js.map +1 -0
  1641. package/build/dist/Types/MessageQueue/MessagingSystem.js +394 -0
  1642. package/build/dist/Types/MessageQueue/MessagingSystem.js.map +1 -0
  1643. package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js +1768 -0
  1644. package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js.map +1 -0
  1645. package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js +1207 -0
  1646. package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js.map +1 -0
  1647. package/build/dist/Types/Monitor/MonitorSecretAccess.js +111 -0
  1648. package/build/dist/Types/Monitor/MonitorSecretAccess.js.map +1 -0
  1649. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +11 -2
  1650. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -1
  1651. package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +1 -1
  1652. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +2 -0
  1653. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  1654. package/build/dist/Types/OnCallDutyPolicy/OnCallDutyPolicyArchive.js +16 -0
  1655. package/build/dist/Types/OnCallDutyPolicy/OnCallDutyPolicyArchive.js.map +1 -0
  1656. package/build/dist/Types/Permission.js +314 -0
  1657. package/build/dist/Types/Permission.js.map +1 -1
  1658. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +10 -4
  1659. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -1
  1660. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +12 -0
  1661. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  1662. package/build/dist/Types/Rules/RuleRun.js +4 -0
  1663. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  1664. package/build/dist/Types/StatusPage/StatusPageArchive.js +16 -0
  1665. package/build/dist/Types/StatusPage/StatusPageArchive.js.map +1 -0
  1666. package/build/dist/Types/Team/ComplianceNotificationChannel.js +4 -3
  1667. package/build/dist/Types/Team/ComplianceNotificationChannel.js.map +1 -1
  1668. package/build/dist/Types/Team/ComplianceRule.js +48 -14
  1669. package/build/dist/Types/Team/ComplianceRule.js.map +1 -1
  1670. package/build/dist/Types/Team/ComplianceRuleType.js +2 -2
  1671. package/build/dist/Types/Telemetry/EntityType.js +16 -0
  1672. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  1673. package/build/dist/Types/Workflow/Component.js +19 -0
  1674. package/build/dist/Types/Workflow/Component.js.map +1 -1
  1675. package/build/dist/Types/Workflow/ComponentID.js +1 -0
  1676. package/build/dist/Types/Workflow/ComponentID.js.map +1 -1
  1677. package/build/dist/Types/Workflow/Components/AI.js +2 -4
  1678. package/build/dist/Types/Workflow/Components/AI.js.map +1 -1
  1679. package/build/dist/Types/Workflow/Components/API.js +26 -26
  1680. package/build/dist/Types/Workflow/Components/API.js.map +1 -1
  1681. package/build/dist/Types/Workflow/Components/BaseModel.js +22 -28
  1682. package/build/dist/Types/Workflow/Components/BaseModel.js.map +1 -1
  1683. package/build/dist/Types/Workflow/Components/Condition.js +70 -29
  1684. package/build/dist/Types/Workflow/Components/Condition.js.map +1 -1
  1685. package/build/dist/Types/Workflow/Components/ConditionComparison.js +256 -0
  1686. package/build/dist/Types/Workflow/Components/ConditionComparison.js.map +1 -0
  1687. package/build/dist/Types/Workflow/Components/ConditionEvaluation.js +279 -0
  1688. package/build/dist/Types/Workflow/Components/ConditionEvaluation.js.map +1 -0
  1689. package/build/dist/Types/Workflow/Components/Email.js +1 -1
  1690. package/build/dist/Types/Workflow/Components/Email.js.map +1 -1
  1691. package/build/dist/Types/Workflow/Components/IncomingEmail.js +129 -0
  1692. package/build/dist/Types/Workflow/Components/IncomingEmail.js.map +1 -0
  1693. package/build/dist/Types/Workflow/Components/JSON.js +10 -3
  1694. package/build/dist/Types/Workflow/Components/JSON.js.map +1 -1
  1695. package/build/dist/Types/Workflow/Components/JavaScript.js +0 -2
  1696. package/build/dist/Types/Workflow/Components/JavaScript.js.map +1 -1
  1697. package/build/dist/Types/Workflow/Components/Manual.js +2 -2
  1698. package/build/dist/Types/Workflow/Components/Manual.js.map +1 -1
  1699. package/build/dist/Types/Workflow/Components/Schedule.js +1 -1
  1700. package/build/dist/Types/Workflow/Components/Schedule.js.map +1 -1
  1701. package/build/dist/Types/Workflow/Components/Slack.js +11 -3
  1702. package/build/dist/Types/Workflow/Components/Slack.js.map +1 -1
  1703. package/build/dist/Types/Workflow/Components/Sleep.js +4 -4
  1704. package/build/dist/Types/Workflow/Components/Sleep.js.map +1 -1
  1705. package/build/dist/Types/Workflow/Components/Webhook.js +4 -6
  1706. package/build/dist/Types/Workflow/Components/Webhook.js.map +1 -1
  1707. package/build/dist/Types/Workflow/Components.js +4 -2
  1708. package/build/dist/Types/Workflow/Components.js.map +1 -1
  1709. package/build/dist/Types/Workflow/DatabaseOperation.js +50 -0
  1710. package/build/dist/Types/Workflow/DatabaseOperation.js.map +1 -0
  1711. package/build/dist/Types/Workflow/Documentation/AIDocumentation.js +78 -0
  1712. package/build/dist/Types/Workflow/Documentation/AIDocumentation.js.map +1 -0
  1713. package/build/dist/Types/Workflow/Documentation/APIDocumentation.js +69 -0
  1714. package/build/dist/Types/Workflow/Documentation/APIDocumentation.js.map +1 -0
  1715. package/build/dist/Types/Workflow/Documentation/ComponentDocumentation.js +44 -0
  1716. package/build/dist/Types/Workflow/Documentation/ComponentDocumentation.js.map +1 -0
  1717. package/build/dist/Types/Workflow/Documentation/DatabaseDocumentation.js +488 -0
  1718. package/build/dist/Types/Workflow/Documentation/DatabaseDocumentation.js.map +1 -0
  1719. package/build/dist/Types/Workflow/Documentation/DocumentationContext.js +139 -0
  1720. package/build/dist/Types/Workflow/Documentation/DocumentationContext.js.map +1 -0
  1721. package/build/dist/Types/Workflow/Documentation/DocumentationLinks.js +62 -0
  1722. package/build/dist/Types/Workflow/Documentation/DocumentationLinks.js.map +1 -0
  1723. package/build/dist/Types/Workflow/Documentation/DocumentationText.js +104 -0
  1724. package/build/dist/Types/Workflow/Documentation/DocumentationText.js.map +1 -0
  1725. package/build/dist/Types/Workflow/Documentation/Index.js +58 -0
  1726. package/build/dist/Types/Workflow/Documentation/Index.js.map +1 -0
  1727. package/build/dist/Types/Workflow/Documentation/MessagingDocumentation.js +247 -0
  1728. package/build/dist/Types/Workflow/Documentation/MessagingDocumentation.js.map +1 -0
  1729. package/build/dist/Types/Workflow/Documentation/ModelExamples.js +210 -0
  1730. package/build/dist/Types/Workflow/Documentation/ModelExamples.js.map +1 -0
  1731. package/build/dist/Types/Workflow/Documentation/TriggerDocumentation.js +184 -0
  1732. package/build/dist/Types/Workflow/Documentation/TriggerDocumentation.js.map +1 -0
  1733. package/build/dist/Types/Workflow/Documentation/UtilityDocumentation.js +290 -0
  1734. package/build/dist/Types/Workflow/Documentation/UtilityDocumentation.js.map +1 -0
  1735. package/build/dist/Types/Workflow/IncomingEmailTrigger.js +275 -0
  1736. package/build/dist/Types/Workflow/IncomingEmailTrigger.js.map +1 -0
  1737. package/build/dist/Types/Workflow/StepSamples.js +601 -0
  1738. package/build/dist/Types/Workflow/StepSamples.js.map +1 -0
  1739. package/build/dist/Types/Workflow/StepTrace.js +135 -4
  1740. package/build/dist/Types/Workflow/StepTrace.js.map +1 -1
  1741. package/build/dist/Types/Workflow/SystemColumns.js +65 -0
  1742. package/build/dist/Types/Workflow/SystemColumns.js.map +1 -0
  1743. package/build/dist/Types/Workflow/Templates.js +178 -2
  1744. package/build/dist/Types/Workflow/Templates.js.map +1 -1
  1745. package/build/dist/Types/Workflow/WebhookTrigger.js +55 -0
  1746. package/build/dist/Types/Workflow/WebhookTrigger.js.map +1 -0
  1747. package/build/dist/Types/Workflow/WorkflowArchive.js +29 -0
  1748. package/build/dist/Types/Workflow/WorkflowArchive.js.map +1 -0
  1749. package/build/dist/Types/Workflow/WorkflowEnabled.js +39 -0
  1750. package/build/dist/Types/Workflow/WorkflowEnabled.js.map +1 -0
  1751. package/build/dist/Types/Workflow/WorkflowStatus.js +24 -0
  1752. package/build/dist/Types/Workflow/WorkflowStatus.js.map +1 -1
  1753. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +23 -3
  1754. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
  1755. package/build/dist/Types/XML.js +23 -0
  1756. package/build/dist/Types/XML.js.map +1 -1
  1757. package/build/dist/UI/Components/ActionButton/RowActions.js +8 -5
  1758. package/build/dist/UI/Components/ActionButton/RowActions.js.map +1 -1
  1759. package/build/dist/UI/Components/ActionCard/ActionCard.js +20 -2
  1760. package/build/dist/UI/Components/ActionCard/ActionCard.js.map +1 -1
  1761. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +1 -1
  1762. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
  1763. package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js +1 -1
  1764. package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js.map +1 -1
  1765. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +2 -0
  1766. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
  1767. package/build/dist/UI/Components/Button/Button.js +19 -11
  1768. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  1769. package/build/dist/UI/Components/Card/Card.js +23 -3
  1770. package/build/dist/UI/Components/Card/Card.js.map +1 -1
  1771. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +1 -3
  1772. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  1773. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +676 -264
  1774. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  1775. package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js +464 -0
  1776. package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js.map +1 -0
  1777. package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js +69 -0
  1778. package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js.map +1 -0
  1779. package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js +108 -0
  1780. package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js.map +1 -0
  1781. package/build/dist/UI/Components/CodeEditor/YamlEditor.js +14 -186
  1782. package/build/dist/UI/Components/CodeEditor/YamlEditor.js.map +1 -1
  1783. package/build/dist/UI/Components/CollapsibleSection/CollapsibleSection.js +7 -3
  1784. package/build/dist/UI/Components/CollapsibleSection/CollapsibleSection.js.map +1 -1
  1785. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js +5 -1
  1786. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js.map +1 -1
  1787. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +5 -14
  1788. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -1
  1789. package/build/dist/UI/Components/DeleteConfirmation/DeleteConfirmationMessage.js +97 -0
  1790. package/build/dist/UI/Components/DeleteConfirmation/DeleteConfirmationMessage.js.map +1 -0
  1791. package/build/dist/UI/Components/DeleteConfirmation/DeleteItemNames.js +34 -0
  1792. package/build/dist/UI/Components/DeleteConfirmation/DeleteItemNames.js.map +1 -0
  1793. package/build/dist/UI/Components/DeleteConfirmation/NamedSentence.js +11 -0
  1794. package/build/dist/UI/Components/DeleteConfirmation/NamedSentence.js.map +1 -0
  1795. package/build/dist/UI/Components/DeleteConfirmation/TypeToConfirmDelete.js +44 -0
  1796. package/build/dist/UI/Components/DeleteConfirmation/TypeToConfirmDelete.js.map +1 -0
  1797. package/build/dist/UI/Components/Dictionary/Dictionary.js +17 -1
  1798. package/build/dist/UI/Components/Dictionary/Dictionary.js.map +1 -1
  1799. package/build/dist/UI/Components/Dropdown/DropdownValueBadge.js +12 -10
  1800. package/build/dist/UI/Components/Dropdown/DropdownValueBadge.js.map +1 -1
  1801. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +15 -14
  1802. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  1803. package/build/dist/UI/Components/Error/PageError.js +1 -1
  1804. package/build/dist/UI/Components/Error/PageError.js.map +1 -1
  1805. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +1 -1
  1806. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  1807. package/build/dist/UI/Components/EventItem/EventItem.js +1 -4
  1808. package/build/dist/UI/Components/EventItem/EventItem.js.map +1 -1
  1809. package/build/dist/UI/Components/FormModal/BasicFormModal.js +17 -3
  1810. package/build/dist/UI/Components/FormModal/BasicFormModal.js.map +1 -1
  1811. package/build/dist/UI/Components/Forms/BasicForm.js +115 -54
  1812. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  1813. package/build/dist/UI/Components/Forms/BasicModelForm.js +1 -1
  1814. package/build/dist/UI/Components/Forms/BasicModelForm.js.map +1 -1
  1815. package/build/dist/UI/Components/Forms/Fields/FormField.js +47 -11
  1816. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  1817. package/build/dist/UI/Components/Forms/ModelForm.js +5 -1
  1818. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  1819. package/build/dist/UI/Components/Forms/Steps/Step.js +16 -5
  1820. package/build/dist/UI/Components/Forms/Steps/Step.js.map +1 -1
  1821. package/build/dist/UI/Components/Forms/Steps/Steps.js +3 -1
  1822. package/build/dist/UI/Components/Forms/Steps/Steps.js.map +1 -1
  1823. package/build/dist/UI/Components/Forms/Types/Field.js.map +1 -1
  1824. package/build/dist/UI/Components/Forms/Validation.js +13 -4
  1825. package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
  1826. package/build/dist/UI/Components/Icon/Icon.js +15 -2
  1827. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  1828. package/build/dist/UI/Components/Input/Input.js +11 -3
  1829. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  1830. package/build/dist/UI/Components/Label/Label.js +0 -2
  1831. package/build/dist/UI/Components/Label/Label.js.map +1 -1
  1832. package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js +1 -1
  1833. package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js.map +1 -1
  1834. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +2 -1
  1835. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  1836. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +14 -4
  1837. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  1838. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  1839. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  1840. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +710 -65
  1841. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
  1842. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js +238 -0
  1843. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js.map +1 -0
  1844. package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js +1028 -0
  1845. package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js.map +1 -0
  1846. package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js +1088 -0
  1847. package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js.map +1 -0
  1848. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +78 -10
  1849. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  1850. package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js +887 -0
  1851. package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js.map +1 -0
  1852. package/build/dist/UI/Components/Modal/ConfirmModal.js +22 -3
  1853. package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
  1854. package/build/dist/UI/Components/Modal/Modal.js +76 -9
  1855. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  1856. package/build/dist/UI/Components/Modal/ModalFooter.js +22 -6
  1857. package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
  1858. package/build/dist/UI/Components/ModelDelete/ModelDelete.js +84 -7
  1859. package/build/dist/UI/Components/ModelDelete/ModelDelete.js.map +1 -1
  1860. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js +38 -13
  1861. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
  1862. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +95 -72
  1863. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  1864. package/build/dist/UI/Components/ModelTable/TableView.js +13 -1
  1865. package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
  1866. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.js +1 -1
  1867. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.js.map +1 -1
  1868. package/build/dist/UI/Components/Navbar/NavBar.js +3 -2
  1869. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  1870. package/build/dist/UI/Components/Pill/Pill.js +25 -22
  1871. package/build/dist/UI/Components/Pill/Pill.js.map +1 -1
  1872. package/build/dist/UI/Components/Pill/PillColors.js +297 -0
  1873. package/build/dist/UI/Components/Pill/PillColors.js.map +1 -0
  1874. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js +7 -5
  1875. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js.map +1 -1
  1876. package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js +7 -1
  1877. package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js.map +1 -1
  1878. package/build/dist/UI/Components/SideMenu/SideMenu.js +81 -9
  1879. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  1880. package/build/dist/UI/Components/SideMenu/SideMenuSection.js +21 -4
  1881. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  1882. package/build/dist/UI/Components/SideMenu/SideMenuSectionState.js +150 -0
  1883. package/build/dist/UI/Components/SideMenu/SideMenuSectionState.js.map +1 -0
  1884. package/build/dist/UI/Components/Table/EmptyTableMessage.js +51 -0
  1885. package/build/dist/UI/Components/Table/EmptyTableMessage.js.map +1 -0
  1886. package/build/dist/UI/Components/Table/Table.js +30 -11
  1887. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  1888. package/build/dist/UI/Components/Table/TableRow.js +9 -2
  1889. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  1890. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js +63 -1
  1891. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js.map +1 -1
  1892. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +4 -2
  1893. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  1894. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +91 -10
  1895. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -1
  1896. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +14 -4
  1897. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  1898. package/build/dist/UI/Components/TextArea/TextArea.js +129 -5
  1899. package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
  1900. package/build/dist/UI/Components/Toggle/Toggle.js +115 -22
  1901. package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
  1902. package/build/dist/UI/Components/Workflow/ArgumentsForm.js +272 -257
  1903. package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
  1904. package/build/dist/UI/Components/Workflow/BreakableCode.js +33 -0
  1905. package/build/dist/UI/Components/Workflow/BreakableCode.js.map +1 -0
  1906. package/build/dist/UI/Components/Workflow/ColumnEditor/AddColumnPicker.js +293 -0
  1907. package/build/dist/UI/Components/Workflow/ColumnEditor/AddColumnPicker.js.map +1 -0
  1908. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnConditionRow.js +17 -2
  1909. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnConditionRow.js.map +1 -1
  1910. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnControl.js +42 -4
  1911. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnControl.js.map +1 -1
  1912. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnFieldRow.js +9 -4
  1913. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnFieldRow.js.map +1 -1
  1914. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnPickerOptions.js +252 -0
  1915. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnPickerOptions.js.map +1 -0
  1916. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnUse.js +88 -0
  1917. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnUse.js.map +1 -0
  1918. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnValueInput.js +79 -44
  1919. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnValueInput.js.map +1 -1
  1920. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js +13 -8
  1921. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js.map +1 -1
  1922. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelRecordForm.js +19 -21
  1923. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelRecordForm.js.map +1 -1
  1924. package/build/dist/UI/Components/Workflow/Component.js +74 -8
  1925. package/build/dist/UI/Components/Workflow/Component.js.map +1 -1
  1926. package/build/dist/UI/Components/Workflow/ComponentPicker/ComponentSearch.js +864 -0
  1927. package/build/dist/UI/Components/Workflow/ComponentPicker/ComponentSearch.js.map +1 -0
  1928. package/build/dist/UI/Components/Workflow/ComponentPicker/PickerCatalog.js +254 -0
  1929. package/build/dist/UI/Components/Workflow/ComponentPicker/PickerCatalog.js.map +1 -0
  1930. package/build/dist/UI/Components/Workflow/ComponentPicker/PickerItems.js +105 -0
  1931. package/build/dist/UI/Components/Workflow/ComponentPicker/PickerItems.js.map +1 -0
  1932. package/build/dist/UI/Components/Workflow/ComponentPortViewer.js +15 -45
  1933. package/build/dist/UI/Components/Workflow/ComponentPortViewer.js.map +1 -1
  1934. package/build/dist/UI/Components/Workflow/ComponentPrimaryPanel.js +88 -0
  1935. package/build/dist/UI/Components/Workflow/ComponentPrimaryPanel.js.map +1 -0
  1936. package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js +24 -57
  1937. package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js.map +1 -1
  1938. package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js +196 -55
  1939. package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js.map +1 -1
  1940. package/build/dist/UI/Components/Workflow/ComponentSettingsSection.js +34 -0
  1941. package/build/dist/UI/Components/Workflow/ComponentSettingsSection.js.map +1 -0
  1942. package/build/dist/UI/Components/Workflow/ComponentsModal.js +523 -329
  1943. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  1944. package/build/dist/UI/Components/Workflow/Condition/ConditionEditor.js +199 -0
  1945. package/build/dist/UI/Components/Workflow/Condition/ConditionEditor.js.map +1 -0
  1946. package/build/dist/UI/Components/Workflow/Condition/ConditionModel.js +458 -0
  1947. package/build/dist/UI/Components/Workflow/Condition/ConditionModel.js.map +1 -0
  1948. package/build/dist/UI/Components/Workflow/CronScheduleField.js +25 -19
  1949. package/build/dist/UI/Components/Workflow/CronScheduleField.js.map +1 -1
  1950. package/build/dist/UI/Components/Workflow/DocumentationViewer.js +107 -61
  1951. package/build/dist/UI/Components/Workflow/DocumentationViewer.js.map +1 -1
  1952. package/build/dist/UI/Components/Workflow/DownloadWorkflowRun.js +78 -0
  1953. package/build/dist/UI/Components/Workflow/DownloadWorkflowRun.js.map +1 -0
  1954. package/build/dist/UI/Components/Workflow/GraphLint.js +7 -2
  1955. package/build/dist/UI/Components/Workflow/GraphLint.js.map +1 -1
  1956. package/build/dist/UI/Components/Workflow/GraphLintSummary.js +59 -1
  1957. package/build/dist/UI/Components/Workflow/GraphLintSummary.js.map +1 -1
  1958. package/build/dist/UI/Components/Workflow/IncomingEmailTriggerPanel.js +215 -0
  1959. package/build/dist/UI/Components/Workflow/IncomingEmailTriggerPanel.js.map +1 -0
  1960. package/build/dist/UI/Components/Workflow/ManualTriggerPanel.js +27 -0
  1961. package/build/dist/UI/Components/Workflow/ManualTriggerPanel.js.map +1 -0
  1962. package/build/dist/UI/Components/Workflow/ModelColumnEditor.js +5 -1
  1963. package/build/dist/UI/Components/Workflow/ModelColumnEditor.js.map +1 -1
  1964. package/build/dist/UI/Components/Workflow/ModelFieldPicker.js +45 -4
  1965. package/build/dist/UI/Components/Workflow/ModelFieldPicker.js.map +1 -1
  1966. package/build/dist/UI/Components/Workflow/ModelSchema.js +7 -8
  1967. package/build/dist/UI/Components/Workflow/ModelSchema.js.map +1 -1
  1968. package/build/dist/UI/Components/Workflow/NodePlacement.js +123 -1
  1969. package/build/dist/UI/Components/Workflow/NodePlacement.js.map +1 -1
  1970. package/build/dist/UI/Components/Workflow/RunModal.js +1 -1
  1971. package/build/dist/UI/Components/Workflow/StepTracePresentation.js +318 -0
  1972. package/build/dist/UI/Components/Workflow/StepTracePresentation.js.map +1 -0
  1973. package/build/dist/UI/Components/Workflow/StepTraceViewer.js +282 -42
  1974. package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -1
  1975. package/build/dist/UI/Components/Workflow/UseRunWatch.js +4 -0
  1976. package/build/dist/UI/Components/Workflow/UseRunWatch.js.map +1 -1
  1977. package/build/dist/UI/Components/Workflow/UseWorkflowEnabled.js +171 -0
  1978. package/build/dist/UI/Components/Workflow/UseWorkflowEnabled.js.map +1 -0
  1979. package/build/dist/UI/Components/Workflow/Utils.js +95 -88
  1980. package/build/dist/UI/Components/Workflow/Utils.js.map +1 -1
  1981. package/build/dist/UI/Components/Workflow/ValuePicker/ArgumentControl.js +113 -0
  1982. package/build/dist/UI/Components/Workflow/ValuePicker/ArgumentControl.js.map +1 -0
  1983. package/build/dist/UI/Components/Workflow/ValuePicker/DefaultValueSources.js +95 -0
  1984. package/build/dist/UI/Components/Workflow/ValuePicker/DefaultValueSources.js.map +1 -0
  1985. package/build/dist/UI/Components/Workflow/ValuePicker/InsertValueButton.js +46 -0
  1986. package/build/dist/UI/Components/Workflow/ValuePicker/InsertValueButton.js.map +1 -0
  1987. package/build/dist/UI/Components/Workflow/ValuePicker/ReferenceChip.js +88 -0
  1988. package/build/dist/UI/Components/Workflow/ValuePicker/ReferenceChip.js.map +1 -0
  1989. package/build/dist/UI/Components/Workflow/ValuePicker/ReferenceDescription.js +187 -0
  1990. package/build/dist/UI/Components/Workflow/ValuePicker/ReferenceDescription.js.map +1 -0
  1991. package/build/dist/UI/Components/Workflow/ValuePicker/StepGraph.js +147 -0
  1992. package/build/dist/UI/Components/Workflow/ValuePicker/StepGraph.js.map +1 -0
  1993. package/build/dist/UI/Components/Workflow/ValuePicker/StepSampleSource.js +345 -0
  1994. package/build/dist/UI/Components/Workflow/ValuePicker/StepSampleSource.js.map +1 -0
  1995. package/build/dist/UI/Components/Workflow/ValuePicker/StepValueSource.js +181 -0
  1996. package/build/dist/UI/Components/Workflow/ValuePicker/StepValueSource.js.map +1 -0
  1997. package/build/dist/UI/Components/Workflow/ValuePicker/TemplateText.js +172 -0
  1998. package/build/dist/UI/Components/Workflow/ValuePicker/TemplateText.js.map +1 -0
  1999. package/build/dist/UI/Components/Workflow/ValuePicker/TemplateTextDom.js +342 -0
  2000. package/build/dist/UI/Components/Workflow/ValuePicker/TemplateTextDom.js.map +1 -0
  2001. package/build/dist/UI/Components/Workflow/ValuePicker/TemplateTextEditor.js +701 -0
  2002. package/build/dist/UI/Components/Workflow/ValuePicker/TemplateTextEditor.js.map +1 -0
  2003. package/build/dist/UI/Components/Workflow/ValuePicker/TemplateTextHistory.js +104 -0
  2004. package/build/dist/UI/Components/Workflow/ValuePicker/TemplateTextHistory.js.map +1 -0
  2005. package/build/dist/UI/Components/Workflow/ValuePicker/ValuePickerContext.js +319 -0
  2006. package/build/dist/UI/Components/Workflow/ValuePicker/ValuePickerContext.js.map +1 -0
  2007. package/build/dist/UI/Components/Workflow/ValuePicker/ValuePickerMenu.js +502 -0
  2008. package/build/dist/UI/Components/Workflow/ValuePicker/ValuePickerMenu.js.map +1 -0
  2009. package/build/dist/UI/Components/Workflow/ValuePicker/ValuePickerPopup.js +176 -0
  2010. package/build/dist/UI/Components/Workflow/ValuePicker/ValuePickerPopup.js.map +1 -0
  2011. package/build/dist/UI/Components/Workflow/ValuePicker/ValueSingleField.js +111 -0
  2012. package/build/dist/UI/Components/Workflow/ValuePicker/ValueSingleField.js.map +1 -0
  2013. package/build/dist/UI/Components/Workflow/ValuePicker/ValueSuggestion.js +356 -0
  2014. package/build/dist/UI/Components/Workflow/ValuePicker/ValueSuggestion.js.map +1 -0
  2015. package/build/dist/UI/Components/Workflow/ValuePicker/ValueTextField.js +168 -0
  2016. package/build/dist/UI/Components/Workflow/ValuePicker/ValueTextField.js.map +1 -0
  2017. package/build/dist/UI/Components/Workflow/ValuePicker/VariableValueSource.js +80 -0
  2018. package/build/dist/UI/Components/Workflow/ValuePicker/VariableValueSource.js.map +1 -0
  2019. package/build/dist/UI/Components/Workflow/WebhookTriggerPanel.js +225 -0
  2020. package/build/dist/UI/Components/Workflow/WebhookTriggerPanel.js.map +1 -0
  2021. package/build/dist/UI/Components/Workflow/Workflow.js +256 -39
  2022. package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
  2023. package/build/dist/UI/Components/Workflow/WorkflowEnabledCopy.js +33 -0
  2024. package/build/dist/UI/Components/Workflow/WorkflowEnabledCopy.js.map +1 -0
  2025. package/build/dist/UI/Components/Workflow/WorkflowEnabledSwitch.js +18 -0
  2026. package/build/dist/UI/Components/Workflow/WorkflowEnabledSwitch.js.map +1 -0
  2027. package/build/dist/UI/Components/Workflow/WorkflowIncomingEmailSecretKey.js +97 -0
  2028. package/build/dist/UI/Components/Workflow/WorkflowIncomingEmailSecretKey.js.map +1 -0
  2029. package/build/dist/UI/Components/Workflow/WorkflowLogModal.js +41 -7
  2030. package/build/dist/UI/Components/Workflow/WorkflowLogModal.js.map +1 -1
  2031. package/build/dist/UI/Components/Workflow/WorkflowRunExport.js +258 -0
  2032. package/build/dist/UI/Components/Workflow/WorkflowRunExport.js.map +1 -0
  2033. package/build/dist/UI/Components/Workflow/WorkflowRunExportActions.js +124 -0
  2034. package/build/dist/UI/Components/Workflow/WorkflowRunExportActions.js.map +1 -0
  2035. package/build/dist/UI/Components/Workflow/WorkflowStatus.js +16 -23
  2036. package/build/dist/UI/Components/Workflow/WorkflowStatus.js.map +1 -1
  2037. package/build/dist/UI/Components/Workflow/WorkflowTurnOnModal.js +60 -0
  2038. package/build/dist/UI/Components/Workflow/WorkflowTurnOnModal.js.map +1 -0
  2039. package/build/dist/UI/Components/Workflow/WorkflowTurnedOffNotice.js +34 -0
  2040. package/build/dist/UI/Components/Workflow/WorkflowTurnedOffNotice.js.map +1 -0
  2041. package/build/dist/UI/Components/Workflow/WorkflowWebhookSecretKey.js +112 -0
  2042. package/build/dist/UI/Components/Workflow/WorkflowWebhookSecretKey.js.map +1 -0
  2043. package/build/dist/UI/Utils/McpOAuthPendingAuthorization.js +111 -0
  2044. package/build/dist/UI/Utils/McpOAuthPendingAuthorization.js.map +1 -0
  2045. package/build/dist/UI/Utils/ModelDisplayName.js +197 -0
  2046. package/build/dist/UI/Utils/ModelDisplayName.js.map +1 -0
  2047. package/build/dist/UI/Utils/TranslateTemplate.js +63 -0
  2048. package/build/dist/UI/Utils/TranslateTemplate.js.map +1 -0
  2049. package/build/dist/Utils/DeveloperDocs/AiAssistantExamples.js +278 -0
  2050. package/build/dist/Utils/DeveloperDocs/AiAssistantExamples.js.map +1 -0
  2051. package/build/dist/Utils/DeveloperDocs/ApiExamples.js +225 -0
  2052. package/build/dist/Utils/DeveloperDocs/ApiExamples.js.map +1 -0
  2053. package/build/dist/Utils/DeveloperDocs/ExampleValues.js +90 -0
  2054. package/build/dist/Utils/DeveloperDocs/ExampleValues.js.map +1 -0
  2055. package/build/dist/Utils/DeveloperDocs/Hcl.js +449 -0
  2056. package/build/dist/Utils/DeveloperDocs/Hcl.js.map +1 -0
  2057. package/build/dist/Utils/DeveloperDocs/TerraformConfig.js +503 -0
  2058. package/build/dist/Utils/DeveloperDocs/TerraformConfig.js.map +1 -0
  2059. package/build/dist/Utils/DeveloperDocs/TerraformMonitorSteps.js +332 -0
  2060. package/build/dist/Utils/DeveloperDocs/TerraformMonitorSteps.js.map +1 -0
  2061. package/build/dist/Utils/DeveloperDocs/TerraformSchema.js +420 -0
  2062. package/build/dist/Utils/DeveloperDocs/TerraformSchema.js.map +1 -0
  2063. package/build/dist/Utils/DeveloperDocs/TerraformValues.js +280 -0
  2064. package/build/dist/Utils/DeveloperDocs/TerraformValues.js.map +1 -0
  2065. package/build/dist/Utils/Email/EmailAddressList.js +132 -0
  2066. package/build/dist/Utils/Email/EmailAddressList.js.map +1 -0
  2067. package/build/dist/Utils/LabelRuleImportExport.js +2 -0
  2068. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  2069. package/build/dist/Utils/Markdown/UntrustedMarkdown.js +988 -0
  2070. package/build/dist/Utils/Markdown/UntrustedMarkdown.js.map +1 -0
  2071. package/build/dist/Utils/ModelImportExport.js +15 -0
  2072. package/build/dist/Utils/ModelImportExport.js.map +1 -1
  2073. package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js +54 -3
  2074. package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js.map +1 -1
  2075. package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js +34 -0
  2076. package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js.map +1 -0
  2077. package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js +148 -0
  2078. package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js.map +1 -0
  2079. package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js +19 -1
  2080. package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js.map +1 -1
  2081. package/build/dist/Utils/Monitor/MonitorPauseState.js +66 -0
  2082. package/build/dist/Utils/Monitor/MonitorPauseState.js.map +1 -0
  2083. package/build/dist/Utils/Rum/SessionIdentity.js +73 -0
  2084. package/build/dist/Utils/Rum/SessionIdentity.js.map +1 -1
  2085. package/build/dist/Utils/StatusPage/ArchivedMonitorResources.js +31 -0
  2086. package/build/dist/Utils/StatusPage/ArchivedMonitorResources.js.map +1 -0
  2087. package/build/dist/Utils/Telemetry/EntityKey.js +36 -0
  2088. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  2089. package/package.json +1 -3
  2090. package/test-setup.sh +15 -1
  2091. package/Server/Utils/CommunityEditionSsoReport.ts +0 -361
  2092. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +0 -616
  2093. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +0 -217
  2094. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +0 -271
  2095. package/Tests/App/Dashboard/CloudDocumentationMarkdown.test.ts +0 -215
  2096. package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +0 -784
  2097. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +0 -518
  2098. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +0 -419
  2099. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +0 -769
  2100. package/Tests/UI/Components/CodeEditor.test.tsx +0 -638
  2101. package/Tests/UI/Components/MonacoLoader.test.ts +0 -67
  2102. package/Tests/UI/Components/MonacoRuntime.test.ts +0 -121
  2103. package/Tests/UI/Components/Telemetry/TelemetryRetentionConfigForm.test.tsx +0 -329
  2104. package/Tests/UI/Components/YamlEditor.test.tsx +0 -847
  2105. package/UI/Components/CodeEditor/MonacoLoader.ts +0 -36
  2106. package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +0 -319
  2107. package/UI/Components/Telemetry/TelemetryRetentionConfigSummary.tsx +0 -223
  2108. package/UI/Components/Workflow/ColumnEditor/AddColumnDropdown.tsx +0 -177
  2109. package/UI/Components/Workflow/ComponentValuePickerModal.tsx +0 -325
  2110. package/UI/Components/Workflow/VariableModal.tsx +0 -59
  2111. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +0 -223
  2112. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +0 -1
  2113. package/build/dist/UI/Components/CodeEditor/MonacoLoader.js +0 -34
  2114. package/build/dist/UI/Components/CodeEditor/MonacoLoader.js.map +0 -1
  2115. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js +0 -171
  2116. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +0 -1
  2117. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js +0 -119
  2118. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js.map +0 -1
  2119. package/build/dist/UI/Components/Workflow/ColumnEditor/AddColumnDropdown.js +0 -86
  2120. package/build/dist/UI/Components/Workflow/ColumnEditor/AddColumnDropdown.js.map +0 -1
  2121. package/build/dist/UI/Components/Workflow/ComponentValuePickerModal.js +0 -144
  2122. package/build/dist/UI/Components/Workflow/ComponentValuePickerModal.js.map +0 -1
  2123. package/build/dist/UI/Components/Workflow/VariableModal.js +0 -31
  2124. package/build/dist/UI/Components/Workflow/VariableModal.js.map +0 -1
@@ -1,7 +1,28 @@
1
1
  import React from "react";
2
2
  import MarkdownEditor from "../../../UI/Components/Markdown.tsx/MarkdownEditor";
3
- import { render, screen, fireEvent } from "@testing-library/react";
4
- import { describe, expect, test } from "@jest/globals";
3
+ import ModelAPI from "../../../UI/Utils/ModelAPI/ModelAPI";
4
+ import {
5
+ act,
6
+ cleanup,
7
+ render,
8
+ screen,
9
+ fireEvent,
10
+ } from "@testing-library/react";
11
+ import { afterEach, beforeAll, describe, expect, test } from "@jest/globals";
12
+ import { createInstance, i18n } from "i18next";
13
+ import { I18nextProvider } from "react-i18next";
14
+ import {
15
+ CHROME_VIEWER_CODE_LINES_COPY_HTML,
16
+ CHROME_VIEWER_CODE_WORD_COPY_HTML,
17
+ CHROME_VIEWER_COPY_HTML,
18
+ CHROME_VIEWER_COPY_TEXT,
19
+ GOOGLE_DOCS_LIST_COPY_HTML,
20
+ GOOGLE_DOCS_LIST_COPY_MARKDOWN,
21
+ GOOGLE_DOCS_LIST_COPY_TEXT,
22
+ VIEWER_CODE_LINES_COPY_TEXT,
23
+ VIEWER_COPY_SOURCE_MARKDOWN,
24
+ WORD_OUTLOOK_ISSUE_4114_HTML,
25
+ } from "./fixtures/MarkdownPasteFixtures";
5
26
 
6
27
  describe("MarkdownEditor", () => {
7
28
  test("should render with toolbar buttons", () => {
@@ -153,3 +174,2765 @@ describe("MarkdownEditor", () => {
153
174
  expect(mockOnChange).toHaveBeenCalledWith("new text");
154
175
  });
155
176
  });
177
+
178
+ /*
179
+ * ---------------------------------------------------------------------------
180
+ * Issue #4114: list indent / outdent, rich paste, double bullets, and the
181
+ * editor without image upload.
182
+ *
183
+ * jsdom has no document.execCommand. The code paths that use it fall back
184
+ * to DOM and value edits here, and the tests that need to see what the
185
+ * editor asks the browser for install a stub (see stubExecCommand).
186
+ * ---------------------------------------------------------------------------
187
+ */
188
+
189
+ interface ClipboardStub {
190
+ types: Array<string>;
191
+ items: Array<{ kind: string; type: string; getAsFile: () => File | null }>;
192
+ getData: (format: string) => string;
193
+ }
194
+
195
+ const clipboardWith: (
196
+ data: { [format: string]: string },
197
+ files?: Array<File>,
198
+ ) => ClipboardStub = (
199
+ data: { [format: string]: string },
200
+ files: Array<File> = [],
201
+ ): ClipboardStub => {
202
+ return {
203
+ types: [...Object.keys(data), ...(files.length > 0 ? ["Files"] : [])],
204
+ items: files.map(
205
+ (file: File): { kind: string; type: string; getAsFile: () => File } => {
206
+ return {
207
+ kind: "file",
208
+ type: file.type,
209
+ getAsFile: (): File => {
210
+ return file;
211
+ },
212
+ };
213
+ },
214
+ ),
215
+ getData: (format: string): string => {
216
+ return data[format] ?? "";
217
+ },
218
+ };
219
+ };
220
+
221
+ const imageFile: () => File = (): File => {
222
+ const bytes: ArrayBuffer = new ArrayBuffer(4);
223
+ new Uint8Array(bytes).set([137, 80, 78, 71]);
224
+ const file: File = new File([bytes], "shot.png", { type: "image/png" });
225
+ // jsdom's File has no arrayBuffer(), which the upload reads the file with.
226
+ Object.defineProperty(file, "arrayBuffer", {
227
+ value: (): Promise<ArrayBuffer> => {
228
+ return Promise.resolve(bytes);
229
+ },
230
+ });
231
+ return file;
232
+ };
233
+
234
+ // Lets the upload's awaited steps run.
235
+ const flushUploads: () => Promise<void> = async (): Promise<void> => {
236
+ await act(async () => {
237
+ await new Promise((resolve: (value: unknown) => void) => {
238
+ setTimeout(resolve, 0);
239
+ });
240
+ });
241
+ };
242
+
243
+ const editableOf: () => HTMLElement = (): HTMLElement => {
244
+ return document.querySelector('[contenteditable="true"]') as HTMLElement;
245
+ };
246
+
247
+ // Puts the caret `offset` characters into the first text node holding `text`.
248
+ const placeCaret: (text: string, offset: number) => void = (
249
+ text: string,
250
+ offset: number,
251
+ ): void => {
252
+ const editable: HTMLElement = editableOf();
253
+ act(() => {
254
+ editable.focus();
255
+ });
256
+ const walker: TreeWalker = document.createTreeWalker(
257
+ editable,
258
+ NodeFilter.SHOW_TEXT,
259
+ );
260
+ let node: Node | null = walker.nextNode();
261
+ while (node && !(node.textContent || "").includes(text)) {
262
+ node = walker.nextNode();
263
+ }
264
+ if (!node) {
265
+ throw new Error(`no text "${text}" in the editor`);
266
+ }
267
+ const range: Range = document.createRange();
268
+ range.setStart(node, (node.textContent || "").indexOf(text) + offset);
269
+ range.collapse(true);
270
+ window.getSelection()?.removeAllRanges();
271
+ window.getSelection()?.addRange(range);
272
+ };
273
+
274
+ // The first text node in the editor holding `text`.
275
+ const textNodeWith: (text: string) => Text = (text: string): Text => {
276
+ const walker: TreeWalker = document.createTreeWalker(
277
+ editableOf(),
278
+ NodeFilter.SHOW_TEXT,
279
+ );
280
+ let node: Node | null = walker.nextNode();
281
+ while (node && !(node.textContent || "").includes(text)) {
282
+ node = walker.nextNode();
283
+ }
284
+ if (!node) {
285
+ throw new Error(`no text "${text}" in the editor`);
286
+ }
287
+ return node as Text;
288
+ };
289
+
290
+ // Selects from `startOffset` into the text `start` to `endOffset` into the text `end`.
291
+ const selectText: (
292
+ start: string,
293
+ startOffset: number,
294
+ end: string,
295
+ endOffset: number,
296
+ ) => void = (
297
+ start: string,
298
+ startOffset: number,
299
+ end: string,
300
+ endOffset: number,
301
+ ): void => {
302
+ act(() => {
303
+ editableOf().focus();
304
+ });
305
+ const startNode: Text = textNodeWith(start);
306
+ const endNode: Text = textNodeWith(end);
307
+ const range: Range = document.createRange();
308
+ range.setStart(startNode, startNode.data.indexOf(start) + startOffset);
309
+ range.setEnd(endNode, endNode.data.indexOf(end) + endOffset);
310
+ window.getSelection()?.removeAllRanges();
311
+ window.getSelection()?.addRange(range);
312
+ };
313
+
314
+ const selectAllInEditor: () => void = (): void => {
315
+ const range: Range = document.createRange();
316
+ range.selectNodeContents(editableOf());
317
+ window.getSelection()?.removeAllRanges();
318
+ window.getSelection()?.addRange(range);
319
+ };
320
+
321
+ const lastChange: (onChange: jest.Mock) => string = (
322
+ onChange: jest.Mock,
323
+ ): string => {
324
+ const calls: Array<Array<unknown>> = onChange.mock.calls;
325
+ return String(calls[calls.length - 1]?.[0] ?? "");
326
+ };
327
+
328
+ const switchToMarkdown: () => HTMLTextAreaElement = (): HTMLTextAreaElement => {
329
+ fireEvent.click(screen.getByRole("button", { name: "Markdown" }));
330
+ return screen.getByRole("textbox") as HTMLTextAreaElement;
331
+ };
332
+
333
+ type ExecCommandStub = jest.Mock<
334
+ boolean,
335
+ [command: string, showUi?: boolean | undefined, value?: string | undefined]
336
+ >;
337
+
338
+ // Installs document.execCommand for one test; `handle` answers each command.
339
+ const stubExecCommand: (
340
+ handle: (command: string, value?: string) => boolean,
341
+ ) => ExecCommandStub = (
342
+ handle: (command: string, value?: string) => boolean,
343
+ ): ExecCommandStub => {
344
+ const stub: ExecCommandStub = jest.fn(
345
+ (
346
+ command: string,
347
+ _showUi?: boolean | undefined,
348
+ value?: string | undefined,
349
+ ): boolean => {
350
+ return handle(command, value);
351
+ },
352
+ );
353
+ Object.defineProperty(document, "execCommand", {
354
+ value: stub,
355
+ configurable: true,
356
+ writable: true,
357
+ });
358
+ return stub;
359
+ };
360
+
361
+ afterEach(() => {
362
+ cleanup();
363
+ delete (document as unknown as { execCommand?: unknown }).execCommand;
364
+ window.getSelection()?.removeAllRanges();
365
+ jest.restoreAllMocks();
366
+ });
367
+
368
+ describe("MarkdownEditor indent and outdent", () => {
369
+ test("has Indent and Outdent buttons that name their keys", () => {
370
+ render(<MarkdownEditor initialValue="" />);
371
+
372
+ expect(screen.getByTitle("Indent (Tab)")).toBeInTheDocument();
373
+ expect(screen.getByTitle("Outdent (Shift+Tab)")).toBeInTheDocument();
374
+ });
375
+
376
+ test("puts them in the lists group, after Task List", () => {
377
+ render(<MarkdownEditor initialValue="" />);
378
+
379
+ const titles: Array<string> = Array.from(
380
+ document.querySelectorAll("button[title]"),
381
+ ).map((button: Element): string => {
382
+ return button.getAttribute("title") || "";
383
+ });
384
+ const taskList: number = titles.indexOf("Task List");
385
+ expect(titles.slice(taskList, taskList + 3)).toEqual([
386
+ "Task List",
387
+ "Indent (Tab)",
388
+ "Outdent (Shift+Tab)",
389
+ ]);
390
+ });
391
+
392
+ describe("in the visual editor", () => {
393
+ test("Tab nests the item at the caret under the one before it", () => {
394
+ const onChange: jest.Mock = jest.fn();
395
+ render(
396
+ <MarkdownEditor
397
+ initialValue={"- a\n- b\n - c\n- d"}
398
+ onChange={onChange}
399
+ />,
400
+ );
401
+ placeCaret("b", 1);
402
+
403
+ const notPrevented: boolean = fireEvent.keyDown(editableOf(), {
404
+ key: "Tab",
405
+ });
406
+
407
+ expect(notPrevented).toBe(false);
408
+ expect(lastChange(onChange)).toBe("- a\n - b\n - c\n- d");
409
+ expect(document.activeElement).toBe(editableOf());
410
+ });
411
+
412
+ /*
413
+ * The no-keyboard-trap rule: when Tab has nothing to indent, the editor
414
+ * leaves the key alone and the browser moves focus to the next field.
415
+ */
416
+ test("leaves Tab to move focus when the item cannot be indented", () => {
417
+ const onChange: jest.Mock = jest.fn();
418
+ render(<MarkdownEditor initialValue={"- a\n- b"} onChange={onChange} />);
419
+ placeCaret("a", 0);
420
+
421
+ expect(fireEvent.keyDown(editableOf(), { key: "Tab" })).toBe(true);
422
+ expect(onChange).not.toHaveBeenCalled();
423
+ });
424
+
425
+ test("leaves Tab to move focus outside a list", () => {
426
+ const onChange: jest.Mock = jest.fn();
427
+ render(<MarkdownEditor initialValue="just text" onChange={onChange} />);
428
+ placeCaret("text", 0);
429
+
430
+ expect(fireEvent.keyDown(editableOf(), { key: "Tab" })).toBe(true);
431
+ expect(onChange).not.toHaveBeenCalled();
432
+ });
433
+
434
+ test("Shift+Tab moves a nested item out beside its parent", () => {
435
+ const onChange: jest.Mock = jest.fn();
436
+ render(
437
+ <MarkdownEditor
438
+ initialValue={"- a\n - b\n - c"}
439
+ onChange={onChange}
440
+ />,
441
+ );
442
+ placeCaret("b", 0);
443
+
444
+ expect(
445
+ fireEvent.keyDown(editableOf(), { key: "Tab", shiftKey: true }),
446
+ ).toBe(false);
447
+ expect(lastChange(onChange)).toBe("- a\n- b\n - c");
448
+ });
449
+
450
+ test("leaves Shift+Tab to move focus back from a top-level item", () => {
451
+ const onChange: jest.Mock = jest.fn();
452
+ render(<MarkdownEditor initialValue={"- a\n- b"} onChange={onChange} />);
453
+ placeCaret("b", 0);
454
+
455
+ expect(
456
+ fireEvent.keyDown(editableOf(), { key: "Tab", shiftKey: true }),
457
+ ).toBe(true);
458
+ expect(onChange).not.toHaveBeenCalled();
459
+ });
460
+
461
+ test("does not take Tab with Ctrl, Alt or Cmd held, or while composing", () => {
462
+ const onChange: jest.Mock = jest.fn();
463
+ render(<MarkdownEditor initialValue={"- a\n- b"} onChange={onChange} />);
464
+ placeCaret("b", 0);
465
+
466
+ for (const modifiers of [
467
+ { ctrlKey: true },
468
+ { altKey: true },
469
+ { metaKey: true },
470
+ { isComposing: true },
471
+ ]) {
472
+ expect(
473
+ fireEvent.keyDown(editableOf(), { key: "Tab", ...modifiers }),
474
+ ).toBe(true);
475
+ }
476
+ expect(onChange).not.toHaveBeenCalled();
477
+ });
478
+
479
+ /*
480
+ * NoteComposer handles Cmd+Enter and Escape on its <form> and relies on
481
+ * key events bubbling up out of the editor.
482
+ */
483
+ test("lets the key event bubble on to the page either way", () => {
484
+ const onKeyDown: jest.Mock = jest.fn();
485
+ render(
486
+ <div onKeyDown={onKeyDown}>
487
+ <MarkdownEditor initialValue={"- a\n- b"} />
488
+ </div>,
489
+ );
490
+ placeCaret("b", 0);
491
+
492
+ fireEvent.keyDown(editableOf(), { key: "Tab" });
493
+ fireEvent.keyDown(editableOf(), { key: "Tab" });
494
+
495
+ expect(onKeyDown).toHaveBeenCalledTimes(2);
496
+ });
497
+
498
+ test("the toolbar buttons indent and outdent the item at the caret", () => {
499
+ const onChange: jest.Mock = jest.fn();
500
+ render(
501
+ <MarkdownEditor
502
+ initialValue={"1. a\n2. b\n3. c"}
503
+ onChange={onChange}
504
+ />,
505
+ );
506
+ placeCaret("b", 0);
507
+
508
+ fireEvent.click(screen.getByTitle("Indent (Tab)"));
509
+ expect(lastChange(onChange)).toBe("1. a\n 1. b\n2. c");
510
+
511
+ fireEvent.click(screen.getByTitle("Outdent (Shift+Tab)"));
512
+ expect(lastChange(onChange)).toBe("1. a\n2. b\n3. c");
513
+ });
514
+
515
+ test("the Indent button does nothing outside a list", () => {
516
+ const onChange: jest.Mock = jest.fn();
517
+ render(<MarkdownEditor initialValue="text" onChange={onChange} />);
518
+ placeCaret("text", 1);
519
+
520
+ fireEvent.click(screen.getByTitle("Indent (Tab)"));
521
+
522
+ expect(onChange).not.toHaveBeenCalled();
523
+ });
524
+
525
+ /*
526
+ * The items are moved by hand, which the browser's undo stack never
527
+ * hears of: Ctrl+Z after an accidental Tab undid the typing before it
528
+ * and left the indent. The editor now takes the move back itself.
529
+ */
530
+ test("Ctrl+Z takes back an indent, keeping the caret in the item", () => {
531
+ const onChange: jest.Mock = jest.fn();
532
+ render(<MarkdownEditor initialValue={"- a\n- b"} onChange={onChange} />);
533
+ placeCaret("b", 1);
534
+ const b: Text = textNodeWith("b");
535
+ fireEvent.keyDown(editableOf(), { key: "Tab" });
536
+ expect(lastChange(onChange)).toBe("- a\n - b");
537
+
538
+ expect(fireEvent.keyDown(editableOf(), { key: "z", ctrlKey: true })).toBe(
539
+ false,
540
+ );
541
+
542
+ expect(lastChange(onChange)).toBe("- a\n- b");
543
+ expect(window.getSelection()?.anchorNode).toBe(b);
544
+ expect(window.getSelection()?.anchorOffset).toBe(1);
545
+ // Nothing of the editor's own left: the next Ctrl+Z is the browser's.
546
+ expect(fireEvent.keyDown(editableOf(), { key: "z", ctrlKey: true })).toBe(
547
+ true,
548
+ );
549
+ });
550
+
551
+ // Undoing an outdent by indenting again would nest c under b.
552
+ test("Ctrl+Z puts an outdented item back exactly as it was", () => {
553
+ const onChange: jest.Mock = jest.fn();
554
+ render(
555
+ <MarkdownEditor
556
+ initialValue={"- a\n - b\n - c"}
557
+ onChange={onChange}
558
+ />,
559
+ );
560
+ placeCaret("b", 0);
561
+ fireEvent.keyDown(editableOf(), { key: "Tab", shiftKey: true });
562
+ expect(lastChange(onChange)).toBe("- a\n- b\n - c");
563
+
564
+ fireEvent.keyDown(editableOf(), { key: "z", ctrlKey: true });
565
+
566
+ expect(lastChange(onChange)).toBe("- a\n - b\n - c");
567
+ });
568
+
569
+ test("Cmd+Z takes back the Indent and Outdent buttons too", () => {
570
+ const onChange: jest.Mock = jest.fn();
571
+ render(
572
+ <MarkdownEditor initialValue={"- a\n- b\n- c"} onChange={onChange} />,
573
+ );
574
+ placeCaret("b", 0);
575
+
576
+ fireEvent.click(screen.getByTitle("Indent (Tab)"));
577
+ fireEvent.click(screen.getByTitle("Outdent (Shift+Tab)"));
578
+ fireEvent.click(screen.getByTitle("Indent (Tab)"));
579
+ expect(lastChange(onChange)).toBe("- a\n - b\n- c");
580
+
581
+ fireEvent.keyDown(editableOf(), { key: "z", metaKey: true });
582
+ expect(lastChange(onChange)).toBe("- a\n- b\n- c");
583
+ fireEvent.keyDown(editableOf(), { key: "z", metaKey: true });
584
+ expect(lastChange(onChange)).toBe("- a\n - b\n- c");
585
+ fireEvent.keyDown(editableOf(), { key: "z", metaKey: true });
586
+ expect(lastChange(onChange)).toBe("- a\n- b\n- c");
587
+ });
588
+
589
+ test("Ctrl+Shift+Z and Ctrl+Y make an undone indent again", () => {
590
+ const onChange: jest.Mock = jest.fn();
591
+ render(<MarkdownEditor initialValue={"- a\n- b"} onChange={onChange} />);
592
+ placeCaret("b", 0);
593
+ fireEvent.keyDown(editableOf(), { key: "Tab" });
594
+ fireEvent.keyDown(editableOf(), { key: "z", ctrlKey: true });
595
+
596
+ expect(
597
+ fireEvent.keyDown(editableOf(), {
598
+ key: "Z",
599
+ ctrlKey: true,
600
+ shiftKey: true,
601
+ }),
602
+ ).toBe(false);
603
+ expect(lastChange(onChange)).toBe("- a\n - b");
604
+
605
+ fireEvent.keyDown(editableOf(), { key: "z", ctrlKey: true });
606
+ expect(fireEvent.keyDown(editableOf(), { key: "y", ctrlKey: true })).toBe(
607
+ false,
608
+ );
609
+ expect(lastChange(onChange)).toBe("- a\n - b");
610
+ });
611
+
612
+ /*
613
+ * Typing after the move is newer history in the browser's own stack, so
614
+ * Ctrl+Z is left to the browser, which takes the typing back first.
615
+ */
616
+ test("leaves Ctrl+Z to the browser once something else changed the editor", () => {
617
+ const onChange: jest.Mock = jest.fn();
618
+ render(<MarkdownEditor initialValue={"- a\n- b"} onChange={onChange} />);
619
+ placeCaret("b", 1);
620
+ fireEvent.keyDown(editableOf(), { key: "Tab" });
621
+
622
+ textNodeWith("b").data = "bx";
623
+ fireEvent.input(editableOf());
624
+ expect(lastChange(onChange)).toBe("- a\n - bx");
625
+
626
+ expect(fireEvent.keyDown(editableOf(), { key: "z", ctrlKey: true })).toBe(
627
+ true,
628
+ );
629
+ expect(lastChange(onChange)).toBe("- a\n - bx");
630
+ });
631
+
632
+ test("does not take Ctrl+Alt+Z, or Ctrl+Z while composing", () => {
633
+ const onChange: jest.Mock = jest.fn();
634
+ render(<MarkdownEditor initialValue={"- a\n- b"} onChange={onChange} />);
635
+ placeCaret("b", 0);
636
+ fireEvent.keyDown(editableOf(), { key: "Tab" });
637
+
638
+ expect(
639
+ fireEvent.keyDown(editableOf(), {
640
+ key: "z",
641
+ ctrlKey: true,
642
+ altKey: true,
643
+ }),
644
+ ).toBe(true);
645
+ expect(
646
+ fireEvent.keyDown(editableOf(), {
647
+ key: "z",
648
+ ctrlKey: true,
649
+ isComposing: true,
650
+ }),
651
+ ).toBe(true);
652
+ expect(lastChange(onChange)).toBe("- a\n - b");
653
+ });
654
+
655
+ // Undo and redo from the Edit menu arrive as a beforeinput event.
656
+ test("takes an indent back on the Edit menu's undo, and makes it again on redo", () => {
657
+ const onChange: jest.Mock = jest.fn();
658
+ render(<MarkdownEditor initialValue={"- a\n- b"} onChange={onChange} />);
659
+ placeCaret("b", 0);
660
+ fireEvent.keyDown(editableOf(), { key: "Tab" });
661
+
662
+ const undo: InputEvent = new InputEvent("beforeinput", {
663
+ inputType: "historyUndo",
664
+ bubbles: true,
665
+ cancelable: true,
666
+ });
667
+ act(() => {
668
+ editableOf().dispatchEvent(undo);
669
+ });
670
+ expect(undo.defaultPrevented).toBe(true);
671
+ expect(lastChange(onChange)).toBe("- a\n- b");
672
+
673
+ const redo: InputEvent = new InputEvent("beforeinput", {
674
+ inputType: "historyRedo",
675
+ bubbles: true,
676
+ cancelable: true,
677
+ });
678
+ act(() => {
679
+ editableOf().dispatchEvent(redo);
680
+ });
681
+ expect(redo.defaultPrevented).toBe(true);
682
+ expect(lastChange(onChange)).toBe("- a\n - b");
683
+ });
684
+
685
+ test("leaves the Edit menu's undo to the browser when it has nothing of its own", () => {
686
+ render(<MarkdownEditor initialValue={"- a\n- b"} />);
687
+ placeCaret("b", 0);
688
+
689
+ const undo: InputEvent = new InputEvent("beforeinput", {
690
+ inputType: "historyUndo",
691
+ bubbles: true,
692
+ cancelable: true,
693
+ });
694
+ act(() => {
695
+ editableOf().dispatchEvent(undo);
696
+ });
697
+
698
+ expect(undo.defaultPrevented).toBe(false);
699
+ });
700
+
701
+ test("leaves Tab to move focus from a code block inside a list item", () => {
702
+ const onChange: jest.Mock = jest.fn();
703
+ render(
704
+ <MarkdownEditor
705
+ initialValue={"- a\n- b\n\n ```\n code\n ```"}
706
+ onChange={onChange}
707
+ />,
708
+ );
709
+ placeCaret("code", 2);
710
+
711
+ expect(fireEvent.keyDown(editableOf(), { key: "Tab" })).toBe(true);
712
+ expect(onChange).not.toHaveBeenCalled();
713
+ });
714
+ });
715
+
716
+ describe("in the markdown source", () => {
717
+ test("Tab moves the selected item to its parent's content column", () => {
718
+ const onChange: jest.Mock = jest.fn();
719
+ render(
720
+ <MarkdownEditor initialValue={"1. a\n2. b"} onChange={onChange} />,
721
+ );
722
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
723
+ textarea.setSelectionRange(8, 8);
724
+
725
+ expect(fireEvent.keyDown(textarea, { key: "Tab" })).toBe(false);
726
+ expect(textarea.value).toBe("1. a\n 1. b");
727
+ expect(lastChange(onChange)).toBe("1. a\n 1. b");
728
+ expect(textarea.value.slice(textarea.selectionStart)).toBe("b");
729
+ });
730
+
731
+ test("Shift+Tab moves it back", () => {
732
+ const onChange: jest.Mock = jest.fn();
733
+ render(
734
+ <MarkdownEditor initialValue={"- a\n - b"} onChange={onChange} />,
735
+ );
736
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
737
+ textarea.setSelectionRange(8, 8);
738
+
739
+ expect(fireEvent.keyDown(textarea, { key: "Tab", shiftKey: true })).toBe(
740
+ false,
741
+ );
742
+ expect(textarea.value).toBe("- a\n- b");
743
+ });
744
+
745
+ test("leaves Tab to move focus when there is nothing to indent", () => {
746
+ const onChange: jest.Mock = jest.fn();
747
+ render(<MarkdownEditor initialValue={"- a\n- b"} onChange={onChange} />);
748
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
749
+
750
+ textarea.setSelectionRange(0, 0);
751
+ expect(fireEvent.keyDown(textarea, { key: "Tab" })).toBe(true);
752
+ textarea.setSelectionRange(6, 6);
753
+ expect(fireEvent.keyDown(textarea, { key: "Tab", shiftKey: true })).toBe(
754
+ true,
755
+ );
756
+ expect(textarea.value).toBe("- a\n- b");
757
+ expect(onChange).not.toHaveBeenCalled();
758
+ });
759
+
760
+ test("the toolbar buttons indent every selected item", () => {
761
+ render(<MarkdownEditor initialValue={"- a\n- b\n- c"} />);
762
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
763
+ textarea.setSelectionRange(4, 11);
764
+
765
+ fireEvent.click(screen.getByTitle("Indent (Tab)"));
766
+ expect(textarea.value).toBe("- a\n - b\n - c");
767
+
768
+ fireEvent.click(screen.getByTitle("Outdent (Shift+Tab)"));
769
+ expect(textarea.value).toBe("- a\n- b\n- c");
770
+ });
771
+
772
+ /*
773
+ * Where the browser has execCommand, only the changed stretch is
774
+ * replaced, with insertText -- so Ctrl+Z undoes an indent like typing.
775
+ */
776
+ test("replaces only the changed text through insertText when it can", () => {
777
+ render(<MarkdownEditor initialValue={"- a\n- b"} />);
778
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
779
+ const seen: Array<{ text?: string; start: number; end: number }> = [];
780
+ const valueSetter: ((value: string) => void) | undefined =
781
+ Object.getOwnPropertyDescriptor(
782
+ HTMLTextAreaElement.prototype,
783
+ "value",
784
+ )?.set;
785
+ stubExecCommand((command: string, value?: string): boolean => {
786
+ if (command !== "insertText" || value === undefined) {
787
+ return false;
788
+ }
789
+ const start: number = textarea.selectionStart;
790
+ const end: number = textarea.selectionEnd;
791
+ seen.push({ text: value, start, end });
792
+ // What the browser does: splice the text in and fire input.
793
+ valueSetter?.call(
794
+ textarea,
795
+ textarea.value.slice(0, start) + value + textarea.value.slice(end),
796
+ );
797
+ textarea.dispatchEvent(new Event("input", { bubbles: true }));
798
+ return true;
799
+ });
800
+ textarea.setSelectionRange(6, 6);
801
+
802
+ fireEvent.keyDown(textarea, { key: "Tab" });
803
+
804
+ expect(seen).toEqual([{ text: " ", start: 4, end: 4 }]);
805
+ expect(textarea.value).toBe("- a\n - b");
806
+ expect(textarea.selectionStart).toBe(8);
807
+ });
808
+ });
809
+ });
810
+
811
+ describe("MarkdownEditor list buttons", () => {
812
+ /*
813
+ * The double bullets of issue #4114: text pasted from Word still began
814
+ * with "•", execCommand("insertUnorderedList") kept it, and the item
815
+ * showed the list's bullet and its own -- saved as "- •\tService down".
816
+ */
817
+ test("Bullet List strips the bullet characters the lines began with", () => {
818
+ const onChange: jest.Mock = jest.fn();
819
+ render(<MarkdownEditor initialValue="" onChange={onChange} />);
820
+ stubExecCommand((command: string): boolean => {
821
+ if (command !== "insertUnorderedList") {
822
+ return false;
823
+ }
824
+ // What Chromium leaves after turning the pasted lines into a list.
825
+ editableOf().innerHTML =
826
+ "<ul><li>•\tService down</li><li>o\tUsers cannot log in</li></ul>";
827
+ selectAllInEditor();
828
+ return true;
829
+ });
830
+ act(() => {
831
+ editableOf().focus();
832
+ });
833
+
834
+ fireEvent.click(screen.getByTitle("Bullet List"));
835
+
836
+ expect(document.execCommand).toHaveBeenCalledWith(
837
+ "insertUnorderedList",
838
+ false,
839
+ undefined,
840
+ );
841
+ expect(lastChange(onChange)).toBe("- Service down\n- Users cannot log in");
842
+ expect(editableOf().textContent).not.toContain("•");
843
+ });
844
+
845
+ test("Numbered List strips the numbers the lines were typed with", () => {
846
+ const onChange: jest.Mock = jest.fn();
847
+ render(<MarkdownEditor initialValue="" onChange={onChange} />);
848
+ stubExecCommand((command: string): boolean => {
849
+ if (command !== "insertOrderedList") {
850
+ return false;
851
+ }
852
+ editableOf().innerHTML = "<ol><li>1.\tFirst</li><li>2.\tSecond</li></ol>";
853
+ selectAllInEditor();
854
+ return true;
855
+ });
856
+ act(() => {
857
+ editableOf().focus();
858
+ });
859
+
860
+ fireEvent.click(screen.getByTitle("Numbered List"));
861
+
862
+ expect(lastChange(onChange)).toBe("1. First\n2. Second");
863
+ });
864
+
865
+ describe("in the markdown source", () => {
866
+ /*
867
+ * The same bug in the source: the button put "- " on the first selected
868
+ * line only, in front of the pasted "•".
869
+ */
870
+ test("Bullet List replaces the bullets on every selected line", () => {
871
+ const onChange: jest.Mock = jest.fn();
872
+ render(
873
+ <MarkdownEditor
874
+ initialValue={"•\tService down\nsecond line"}
875
+ onChange={onChange}
876
+ />,
877
+ );
878
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
879
+ textarea.setSelectionRange(0, textarea.value.length);
880
+
881
+ fireEvent.click(screen.getByTitle("Bullet List"));
882
+
883
+ expect(textarea.value).toBe("- Service down\n- second line");
884
+ expect(lastChange(onChange)).toBe("- Service down\n- second line");
885
+ });
886
+
887
+ test("Numbered List numbers every selected line", () => {
888
+ render(<MarkdownEditor initialValue={"a\nb\nc"} />);
889
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
890
+ textarea.setSelectionRange(0, textarea.value.length);
891
+
892
+ fireEvent.click(screen.getByTitle("Numbered List"));
893
+
894
+ expect(textarea.value).toBe("1. a\n2. b\n3. c");
895
+ });
896
+
897
+ // Nested items move to the numbered item's content column, and count from 1.
898
+ test("Numbered List keeps a nested list nested", () => {
899
+ const onChange: jest.Mock = jest.fn();
900
+ render(
901
+ <MarkdownEditor initialValue={"- a\n - b\n- c"} onChange={onChange} />,
902
+ );
903
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
904
+ textarea.setSelectionRange(0, textarea.value.length);
905
+
906
+ fireEvent.click(screen.getByTitle("Numbered List"));
907
+
908
+ expect(textarea.value).toBe("1. a\n 1. b\n2. c");
909
+ expect(lastChange(onChange)).toBe("1. a\n 1. b\n2. c");
910
+ });
911
+
912
+ test("a second click takes the markers off again", () => {
913
+ render(<MarkdownEditor initialValue={"a\nb"} />);
914
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
915
+ textarea.setSelectionRange(0, textarea.value.length);
916
+
917
+ fireEvent.click(screen.getByTitle("Task List"));
918
+ expect(textarea.value).toBe("- [ ] a\n- [ ] b");
919
+
920
+ textarea.setSelectionRange(0, textarea.value.length);
921
+ fireEvent.click(screen.getByTitle("Task List"));
922
+ expect(textarea.value).toBe("a\nb");
923
+ });
924
+
925
+ test("starts a list on an empty line with the caret after the marker", () => {
926
+ render(<MarkdownEditor initialValue="" />);
927
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
928
+ textarea.setSelectionRange(0, 0);
929
+
930
+ fireEvent.click(screen.getByTitle("Bullet List"));
931
+
932
+ expect(textarea.value).toBe("- ");
933
+ expect(textarea.selectionStart).toBe(2);
934
+ });
935
+ });
936
+ });
937
+
938
+ describe("MarkdownEditor paste in the visual editor", () => {
939
+ test("keeps the nesting of a list pasted from Outlook", () => {
940
+ const onChange: jest.Mock = jest.fn();
941
+ render(<MarkdownEditor initialValue="" onChange={onChange} />);
942
+
943
+ const notPrevented: boolean = fireEvent.paste(editableOf(), {
944
+ clipboardData: clipboardWith({
945
+ "text/html": WORD_OUTLOOK_ISSUE_4114_HTML,
946
+ "text/plain": "flattened text",
947
+ }),
948
+ });
949
+
950
+ expect(notPrevented).toBe(false);
951
+ expect(lastChange(onChange)).toContain(
952
+ "- Service is currently unavailable\n - Users are unable to log in\n - Users are receiving an error message\n- Investigation is in progress\n - Technical team has been notified\n - Vendor has been contacted",
953
+ );
954
+ expect(
955
+ editableOf().querySelector("li > ul > li")?.textContent,
956
+ ).toBeTruthy();
957
+ });
958
+
959
+ // Its plain text is bare lines: no bullets, no nesting, no links.
960
+ test("keeps the list, links and formatting of a Google Docs copy", () => {
961
+ const onChange: jest.Mock = jest.fn();
962
+ render(<MarkdownEditor initialValue="" onChange={onChange} />);
963
+
964
+ fireEvent.paste(editableOf(), {
965
+ clipboardData: clipboardWith({
966
+ "text/html": GOOGLE_DOCS_LIST_COPY_HTML,
967
+ "text/plain": GOOGLE_DOCS_LIST_COPY_TEXT,
968
+ }),
969
+ });
970
+
971
+ expect(lastChange(onChange)).toBe(GOOGLE_DOCS_LIST_COPY_MARKDOWN);
972
+ });
973
+
974
+ test("turns a copied note back into the markdown it was written in", () => {
975
+ const onChange: jest.Mock = jest.fn();
976
+ render(<MarkdownEditor initialValue="" onChange={onChange} />);
977
+
978
+ fireEvent.paste(editableOf(), {
979
+ clipboardData: clipboardWith({
980
+ "text/html": CHROME_VIEWER_COPY_HTML,
981
+ "text/plain": CHROME_VIEWER_COPY_TEXT,
982
+ }),
983
+ });
984
+
985
+ expect(lastChange(onChange)).toBe(VIEWER_COPY_SOURCE_MARKDOWN);
986
+ });
987
+
988
+ test("makes pasted bullet characters a nested list, not text", () => {
989
+ const onChange: jest.Mock = jest.fn();
990
+ render(<MarkdownEditor initialValue="" onChange={onChange} />);
991
+
992
+ fireEvent.paste(editableOf(), {
993
+ clipboardData: clipboardWith({
994
+ "text/plain": "•\tService down\no\tUsers cannot log in",
995
+ }),
996
+ });
997
+
998
+ expect(lastChange(onChange)).toBe(
999
+ "- Service down\n - Users cannot log in",
1000
+ );
1001
+ expect(editableOf().innerHTML).toBe(
1002
+ "<ul><li>Service down<ul><li>Users cannot log in</li></ul></li></ul>",
1003
+ );
1004
+ });
1005
+
1006
+ /*
1007
+ * A paragraph pasted into the middle of a line used to land as a <p>
1008
+ * inside the <p> the caret was in, and "big " pasted into "hello world"
1009
+ * saved "hello \n\nbig \n\nworld".
1010
+ */
1011
+ test("pastes a word into the middle of a line without splitting it", () => {
1012
+ const onChange: jest.Mock = jest.fn();
1013
+ render(<MarkdownEditor initialValue="hello world" onChange={onChange} />);
1014
+ placeCaret("world", 0);
1015
+
1016
+ fireEvent.paste(editableOf(), {
1017
+ clipboardData: clipboardWith({ "text/plain": "big " }),
1018
+ });
1019
+
1020
+ expect(lastChange(onChange)).toBe("hello big world");
1021
+ expect(editableOf().querySelectorAll("p")).toHaveLength(1);
1022
+ });
1023
+
1024
+ test("pastes formatted words into the middle of a line", () => {
1025
+ const onChange: jest.Mock = jest.fn();
1026
+ render(<MarkdownEditor initialValue="hello world" onChange={onChange} />);
1027
+ placeCaret("world", 0);
1028
+
1029
+ fireEvent.paste(editableOf(), {
1030
+ clipboardData: clipboardWith({
1031
+ "text/html": "<b>very</b> ",
1032
+ "text/plain": "very ",
1033
+ }),
1034
+ });
1035
+
1036
+ expect(lastChange(onChange)).toBe("hello **very** world");
1037
+ });
1038
+
1039
+ /*
1040
+ * Every browser keeps a note's code block <pre> around a word copied out
1041
+ * of it; pasted as a fenced block, the word split the sentence in three.
1042
+ */
1043
+ test("pastes a word copied out of a note's code block into the line as inline code", () => {
1044
+ const onChange: jest.Mock = jest.fn();
1045
+ render(
1046
+ <MarkdownEditor initialValue="Restart the pod now" onChange={onChange} />,
1047
+ );
1048
+ stubBlinkExecCommand();
1049
+ placeCaret("pod", 0);
1050
+
1051
+ fireEvent.paste(editableOf(), {
1052
+ clipboardData: clipboardWith({
1053
+ "text/html": CHROME_VIEWER_CODE_WORD_COPY_HTML,
1054
+ "text/plain": "api_server",
1055
+ }),
1056
+ });
1057
+
1058
+ expect(lastChange(onChange)).toBe("Restart the `api_server`pod now");
1059
+ expect(editableOf().querySelectorAll("p")).toHaveLength(1);
1060
+ expect(editableOf().querySelector("pre")).toBeNull();
1061
+ });
1062
+
1063
+ test("keeps the paragraph when pasting into an empty editor", () => {
1064
+ render(<MarkdownEditor initialValue="" />);
1065
+ const range: Range = document.createRange();
1066
+ range.setStart(editableOf(), 0);
1067
+ range.collapse(true);
1068
+ act(() => {
1069
+ editableOf().focus();
1070
+ });
1071
+ window.getSelection()?.addRange(range);
1072
+
1073
+ fireEvent.paste(editableOf(), {
1074
+ clipboardData: clipboardWith({ "text/plain": "first" }),
1075
+ });
1076
+
1077
+ expect(editableOf().innerHTML).toBe("<p>first</p>");
1078
+ });
1079
+
1080
+ /*
1081
+ * insertText for plain words, as if typed (Firefox's insertHTML turns the
1082
+ * space before them into a non-breaking one), so they go on the browser's
1083
+ * undo stack. Blocks in the middle of a line are never handed to
1084
+ * insertHTML -- Chromium and Safari fold them into the line -- the editor
1085
+ * splits the line and puts them in itself.
1086
+ */
1087
+ test("asks the browser to insert words as text, and keeps blocks in a line to itself", () => {
1088
+ const onChange: jest.Mock = jest.fn();
1089
+ render(<MarkdownEditor initialValue="hello world" onChange={onChange} />);
1090
+ const stub: ExecCommandStub = stubExecCommand((): boolean => {
1091
+ return false;
1092
+ });
1093
+ placeCaret("world", 0);
1094
+
1095
+ fireEvent.paste(editableOf(), {
1096
+ clipboardData: clipboardWith({ "text/plain": "big " }),
1097
+ });
1098
+ fireEvent.paste(editableOf(), {
1099
+ clipboardData: clipboardWith({ "text/plain": "- a\n- b" }),
1100
+ });
1101
+
1102
+ expect(stub.mock.calls).toEqual([["insertText", false, "big "]]);
1103
+ // The browser refused the words here, so the editor inserted them itself.
1104
+ expect(lastChange(onChange)).toBe("hello big\n\n- a\n- b\n\nworld");
1105
+ });
1106
+
1107
+ /*
1108
+ * Chromium's and Firefox's insertHTML turn the spaces around formatted
1109
+ * words into non-breaking ones, which were saved on either side of
1110
+ * "**very**", so formatted words are inserted as nodes instead.
1111
+ */
1112
+ test("inserts formatted words itself, without asking the browser", () => {
1113
+ const onChange: jest.Mock = jest.fn();
1114
+ render(<MarkdownEditor initialValue="hello world" onChange={onChange} />);
1115
+ const stub: ExecCommandStub = stubExecCommand((): boolean => {
1116
+ return true;
1117
+ });
1118
+ placeCaret("world", 0);
1119
+
1120
+ fireEvent.paste(editableOf(), {
1121
+ clipboardData: clipboardWith({
1122
+ "text/html": "<b>very</b> ",
1123
+ "text/plain": "very ",
1124
+ }),
1125
+ });
1126
+
1127
+ expect(stub).not.toHaveBeenCalled();
1128
+ expect(lastChange(onChange)).toBe("hello **very** world");
1129
+ });
1130
+
1131
+ test("does not insert twice when the browser takes the insert", () => {
1132
+ const onChange: jest.Mock = jest.fn();
1133
+ render(<MarkdownEditor initialValue="hello world" onChange={onChange} />);
1134
+ stubExecCommand((command: string, value?: string): boolean => {
1135
+ if (command !== "insertText" || value === undefined) {
1136
+ return false;
1137
+ }
1138
+ const range: Range = window.getSelection()!.getRangeAt(0);
1139
+ range.insertNode(document.createTextNode(value));
1140
+ return true;
1141
+ });
1142
+ placeCaret("world", 0);
1143
+
1144
+ fireEvent.paste(editableOf(), {
1145
+ clipboardData: clipboardWith({ "text/plain": "big " }),
1146
+ });
1147
+
1148
+ expect(lastChange(onChange)).toBe("hello big world");
1149
+ });
1150
+
1151
+ /*
1152
+ * A selection across two list items, deleted on its own, left both items
1153
+ * and the caret between them, straight inside the <ul> -- the pasted link
1154
+ * showed in the editor but the serializer, which reads only a list's
1155
+ * items, saved "- al\n- ta\n- gamma".
1156
+ */
1157
+ test("keeps a link pasted over part of two list items, joining them", () => {
1158
+ const onChange: jest.Mock = jest.fn();
1159
+ render(
1160
+ <MarkdownEditor
1161
+ initialValue={"- alpha\n- beta\n- gamma"}
1162
+ onChange={onChange}
1163
+ />,
1164
+ );
1165
+ selectText("alpha", 2, "beta", 2);
1166
+
1167
+ fireEvent.paste(editableOf(), {
1168
+ clipboardData: clipboardWith({
1169
+ "text/html": '<a href="https://oneuptime.com/docs">the docs</a>',
1170
+ "text/plain": "the docs",
1171
+ }),
1172
+ });
1173
+
1174
+ expect(lastChange(onChange)).toBe(
1175
+ "- al[the docs](https://oneuptime.com/docs)ta\n- gamma",
1176
+ );
1177
+ });
1178
+
1179
+ // The joined item's own nested items stay where they were in the text.
1180
+ test("keeps the text order when the paste runs into a nested item", () => {
1181
+ const onChange: jest.Mock = jest.fn();
1182
+ render(
1183
+ <MarkdownEditor
1184
+ initialValue={"- alpha\n - beta\n - deep\n - gamma\n- omega"}
1185
+ onChange={onChange}
1186
+ />,
1187
+ );
1188
+ selectText("alpha", 2, "beta", 2);
1189
+
1190
+ fireEvent.paste(editableOf(), {
1191
+ clipboardData: clipboardWith({
1192
+ "text/html": '<a href="https://x.test/">L</a>',
1193
+ "text/plain": "L",
1194
+ }),
1195
+ });
1196
+
1197
+ expect(lastChange(onChange)).toBe(
1198
+ "- al[L](https://x.test/)ta\n - deep\n - gamma\n- omega",
1199
+ );
1200
+ });
1201
+
1202
+ test("Ctrl+Z takes back such a paste, selection and all", () => {
1203
+ const onChange: jest.Mock = jest.fn();
1204
+ render(
1205
+ <MarkdownEditor
1206
+ initialValue={"- alpha\n- beta\n- gamma"}
1207
+ onChange={onChange}
1208
+ />,
1209
+ );
1210
+ selectText("alpha", 2, "beta", 2);
1211
+ const alpha: Text = textNodeWith("alpha");
1212
+ const beta: Text = textNodeWith("beta");
1213
+ fireEvent.paste(editableOf(), {
1214
+ clipboardData: clipboardWith({
1215
+ "text/html": '<a href="https://oneuptime.com/docs">the docs</a>',
1216
+ "text/plain": "the docs",
1217
+ }),
1218
+ });
1219
+
1220
+ fireEvent.keyDown(editableOf(), { key: "z", ctrlKey: true });
1221
+
1222
+ expect(lastChange(onChange)).toBe("- alpha\n- beta\n- gamma");
1223
+ const selection: Selection = window.getSelection() as Selection;
1224
+ expect([selection.anchorNode, selection.anchorOffset]).toEqual([alpha, 2]);
1225
+ expect([selection.focusNode, selection.focusOffset]).toEqual([beta, 2]);
1226
+ });
1227
+
1228
+ // Ctrl+A in a note that is only a list, as Chromium selects it.
1229
+ test("keeps formatted words pasted over a whole list", () => {
1230
+ const onChange: jest.Mock = jest.fn();
1231
+ render(
1232
+ <MarkdownEditor initialValue={"- alpha\n- beta"} onChange={onChange} />,
1233
+ );
1234
+ selectText("alpha", 0, "beta", 4);
1235
+
1236
+ fireEvent.paste(editableOf(), {
1237
+ clipboardData: clipboardWith({
1238
+ "text/html": "<p>see <b>this</b></p>",
1239
+ "text/plain": "see this",
1240
+ }),
1241
+ });
1242
+
1243
+ expect(lastChange(onChange)).toBe("- see **this**");
1244
+ });
1245
+
1246
+ /*
1247
+ * A triple click selects an item up to the very start of the next: the
1248
+ * paste replaces that item, and the next one is left as it was.
1249
+ */
1250
+ test("replaces a triple-clicked list item and leaves the next alone", () => {
1251
+ const onChange: jest.Mock = jest.fn();
1252
+ render(
1253
+ <MarkdownEditor
1254
+ initialValue={"- alpha\n- beta\n- gamma"}
1255
+ onChange={onChange}
1256
+ />,
1257
+ );
1258
+ act(() => {
1259
+ editableOf().focus();
1260
+ });
1261
+ const items: NodeListOf<HTMLLIElement> =
1262
+ editableOf().querySelectorAll("li");
1263
+ const range: Range = document.createRange();
1264
+ range.setStart(textNodeWith("beta"), 0);
1265
+ range.setEnd(items[2] as Node, 0);
1266
+ window.getSelection()?.removeAllRanges();
1267
+ window.getSelection()?.addRange(range);
1268
+
1269
+ fireEvent.paste(editableOf(), {
1270
+ clipboardData: clipboardWith({
1271
+ "text/html": "<p>see <b>this</b></p>",
1272
+ "text/plain": "see this",
1273
+ }),
1274
+ });
1275
+
1276
+ expect(lastChange(onChange)).toBe("- alpha\n- see **this**\n- gamma");
1277
+ });
1278
+
1279
+ test("joins two paragraphs a formatted paste runs across", () => {
1280
+ const onChange: jest.Mock = jest.fn();
1281
+ render(
1282
+ <MarkdownEditor
1283
+ initialValue={"first para\n\nsecond para"}
1284
+ onChange={onChange}
1285
+ />,
1286
+ );
1287
+ selectText("first", 2, "second", 2);
1288
+
1289
+ fireEvent.paste(editableOf(), {
1290
+ clipboardData: clipboardWith({
1291
+ "text/html": "<b>X</b>",
1292
+ "text/plain": "X",
1293
+ }),
1294
+ });
1295
+
1296
+ expect(lastChange(onChange)).toBe("fi**X**cond para");
1297
+ });
1298
+
1299
+ // What the browser's own insertText does with the same selection.
1300
+ test("joins two list items a plain word is pasted over", () => {
1301
+ const onChange: jest.Mock = jest.fn();
1302
+ render(
1303
+ <MarkdownEditor
1304
+ initialValue={"- alpha\n- beta\n- gamma"}
1305
+ onChange={onChange}
1306
+ />,
1307
+ );
1308
+ selectText("alpha", 2, "beta", 2);
1309
+
1310
+ fireEvent.paste(editableOf(), {
1311
+ clipboardData: clipboardWith({ "text/plain": "X" }),
1312
+ });
1313
+
1314
+ expect(lastChange(onChange)).toBe("- alXta\n- gamma");
1315
+ });
1316
+
1317
+ test("keeps a code block pasted over part of two list items", () => {
1318
+ const onChange: jest.Mock = jest.fn();
1319
+ render(
1320
+ <MarkdownEditor
1321
+ initialValue={"- alpha\n- beta\n- gamma"}
1322
+ onChange={onChange}
1323
+ />,
1324
+ );
1325
+ selectText("alpha", 2, "beta", 2);
1326
+
1327
+ fireEvent.paste(editableOf(), {
1328
+ clipboardData: clipboardWith({ "text/plain": "```\nnpm ci\n```" }),
1329
+ });
1330
+
1331
+ expect(lastChange(onChange)).toBe(
1332
+ "- al\n\n ```\n npm ci\n ```\n\n ta\n- gamma",
1333
+ );
1334
+ });
1335
+
1336
+ test("the Code button keeps code made over part of two list items", () => {
1337
+ const onChange: jest.Mock = jest.fn();
1338
+ render(
1339
+ <MarkdownEditor
1340
+ initialValue={"- alpha\n- beta\n- gamma"}
1341
+ onChange={onChange}
1342
+ />,
1343
+ );
1344
+ selectText("alpha", 2, "alpha", 5);
1345
+
1346
+ fireEvent.click(screen.getByTitle("Code"));
1347
+ expect(lastChange(onChange)).toBe("- al`pha`\n- beta\n- gamma");
1348
+
1349
+ selectText("beta", 2, "gamma", 2);
1350
+ fireEvent.click(screen.getByTitle("Code"));
1351
+ expect(editableOf().querySelectorAll("ul > li")).toHaveLength(2);
1352
+ expect(lastChange(onChange)).toContain("`ta");
1353
+ expect(lastChange(onChange)).toContain("ga`mma");
1354
+ });
1355
+
1356
+ /*
1357
+ * Ctrl+A in Chromium and Safari ends inside the last code line's text.
1358
+ * The emptied code block stayed, saved as an empty fence under the paste.
1359
+ */
1360
+ test("leaves no empty code block behind a paste over everything", () => {
1361
+ const onChange: jest.Mock = jest.fn();
1362
+ render(
1363
+ <MarkdownEditor
1364
+ initialValue={"Steps:\n\n```\nkubectl get pods\n```"}
1365
+ onChange={onChange}
1366
+ />,
1367
+ );
1368
+ stubBlinkExecCommand();
1369
+ selectText("Steps:", 0, "kubectl get pods", 16);
1370
+
1371
+ fireEvent.paste(editableOf(), {
1372
+ clipboardData: clipboardWith({
1373
+ "text/html": "<p>Service <b>down</b></p><p>Rolled back.</p>",
1374
+ "text/plain": "Service down\n\nRolled back.",
1375
+ }),
1376
+ });
1377
+
1378
+ expect(lastChange(onChange)).toBe("Service **down**\n\nRolled back.");
1379
+ });
1380
+
1381
+ test("leaves no empty item behind a paste into a nested item", () => {
1382
+ const onChange: jest.Mock = jest.fn();
1383
+ render(
1384
+ <MarkdownEditor
1385
+ initialValue={"- alpha\n- beta\n - deep\n- gamma"}
1386
+ onChange={onChange}
1387
+ />,
1388
+ );
1389
+ selectText("alpha", 2, "deep", 2);
1390
+
1391
+ fireEvent.paste(editableOf(), {
1392
+ clipboardData: clipboardWith({
1393
+ "text/html": "<b>X</b>",
1394
+ "text/plain": "X",
1395
+ }),
1396
+ });
1397
+
1398
+ expect(lastChange(onChange)).toBe("- al**X**ep\n- gamma");
1399
+ });
1400
+
1401
+ test("leaves no emptied bold behind words pasted over its end", () => {
1402
+ const onChange: jest.Mock = jest.fn();
1403
+ render(
1404
+ <MarkdownEditor
1405
+ initialValue="Run **this** then check"
1406
+ onChange={onChange}
1407
+ />,
1408
+ );
1409
+ selectText("Run", 2, "this", 4);
1410
+
1411
+ fireEvent.paste(editableOf(), {
1412
+ clipboardData: clipboardWith({
1413
+ "text/html": "see <b>that</b>",
1414
+ "text/plain": "see that",
1415
+ }),
1416
+ });
1417
+
1418
+ expect(lastChange(onChange)).toBe("Rusee **that** then check");
1419
+ });
1420
+
1421
+ /*
1422
+ * Typed over, a selection from one table cell into the next keeps both
1423
+ * cells. The paste joined them like two lines: the emptied cell went, and
1424
+ * "Cell 3" moved under column B.
1425
+ */
1426
+ test("keeps both cells of a table a formatted paste runs across", () => {
1427
+ const onChange: jest.Mock = jest.fn();
1428
+ render(
1429
+ <MarkdownEditor
1430
+ initialValue={
1431
+ "| A | B | C |\n| --- | --- | --- |\n| Cell 1 | Cell 2 | Cell 3 |"
1432
+ }
1433
+ onChange={onChange}
1434
+ />,
1435
+ );
1436
+ selectText("Cell 1", 2, "Cell 2", 2);
1437
+
1438
+ fireEvent.paste(editableOf(), {
1439
+ clipboardData: clipboardWith({
1440
+ "text/html": '<a href="https://x.test/">L</a>',
1441
+ "text/plain": "L",
1442
+ }),
1443
+ });
1444
+
1445
+ const rows: Array<string> = lastChange(onChange).split("\n");
1446
+ expect(rows).toHaveLength(3);
1447
+ expect(
1448
+ (rows[2] || "").split("|").map((cell: string): string => {
1449
+ return cell.trim();
1450
+ }),
1451
+ ).toEqual(["", "Ce[L](https://x.test/)", "ll 2", "Cell 3", ""]);
1452
+ });
1453
+
1454
+ test("the Code button keeps both cells of a table it runs across", () => {
1455
+ const onChange: jest.Mock = jest.fn();
1456
+ render(
1457
+ <MarkdownEditor
1458
+ initialValue={
1459
+ "| A | B | C |\n| --- | --- | --- |\n| Cell 1 | Cell 2 | Cell 3 |"
1460
+ }
1461
+ onChange={onChange}
1462
+ />,
1463
+ );
1464
+ selectText("Cell 1", 2, "Cell 2", 2);
1465
+
1466
+ fireEvent.click(screen.getByTitle("Code"));
1467
+
1468
+ const cells: Array<string> = Array.from(
1469
+ editableOf().querySelectorAll("tbody td"),
1470
+ ).map((cell: Element): string => {
1471
+ return cell.textContent || "";
1472
+ });
1473
+ expect(cells).toHaveLength(3);
1474
+ expect(cells.slice(1)).toEqual(["ll 2", "Cell 3"]);
1475
+ });
1476
+
1477
+ test("pastes into a code block as the plain text it is", () => {
1478
+ const onChange: jest.Mock = jest.fn();
1479
+ render(
1480
+ <MarkdownEditor initialValue={"```\ncode\n```"} onChange={onChange} />,
1481
+ );
1482
+ placeCaret("code", 4);
1483
+
1484
+ fireEvent.paste(editableOf(), {
1485
+ clipboardData: clipboardWith({
1486
+ "text/html": "<ul><li>not a list here</li></ul>",
1487
+ "text/plain": "\r\n- line one\r\n * line two",
1488
+ }),
1489
+ });
1490
+
1491
+ expect(lastChange(onChange)).toBe(
1492
+ "```\ncode\n- line one\n * line two\n```",
1493
+ );
1494
+ });
1495
+
1496
+ test("lets nothing from hostile HTML through", () => {
1497
+ const onChange: jest.Mock = jest.fn();
1498
+ render(<MarkdownEditor initialValue="" onChange={onChange} />);
1499
+
1500
+ fireEvent.paste(editableOf(), {
1501
+ clipboardData: clipboardWith({
1502
+ "text/html":
1503
+ '<p>safe <a href="javascript:alert(1)">link</a></p><img src="x" onerror="window.__editorPasteRan=1"><script>window.__editorPasteRan=2</script>',
1504
+ "text/plain": "safe link",
1505
+ }),
1506
+ });
1507
+
1508
+ expect(lastChange(onChange)).not.toMatch(/javascript|onerror|script/);
1509
+ expect(editableOf().innerHTML).not.toMatch(/onerror|<script|javascript/);
1510
+ expect(
1511
+ (window as unknown as { __editorPasteRan?: number }).__editorPasteRan,
1512
+ ).toBeUndefined();
1513
+ });
1514
+
1515
+ test("leaves a paste without clipboard data to the browser", () => {
1516
+ render(<MarkdownEditor initialValue="" />);
1517
+
1518
+ expect(fireEvent.paste(editableOf(), {})).toBe(true);
1519
+ });
1520
+ });
1521
+
1522
+ /*
1523
+ * document.execCommand as Chromium and Safari answer the editor's inserts.
1524
+ * insertText types the text at the caret. insertHTML puts blocks where they
1525
+ * belong on an empty line (or into the empty editor); anywhere else in a
1526
+ * line it folds a leading code block or quote into that line as a <span> of
1527
+ * its text, which the serializer reads as plain text -- the Code Block
1528
+ * button saved "hellocode block" and a pasted fenced block
1529
+ * "Run:npm install". (Lists, headings and tables it does split the line
1530
+ * for; the stub refuses those, and the editor inserts them itself.)
1531
+ */
1532
+ const stubBlinkExecCommand: () => ExecCommandStub = (): ExecCommandStub => {
1533
+ return stubExecCommand((command: string, value?: string): boolean => {
1534
+ const selection: Selection | null = window.getSelection();
1535
+ if (!selection || selection.rangeCount === 0 || value === undefined) {
1536
+ return false;
1537
+ }
1538
+ const range: Range = selection.getRangeAt(0);
1539
+ if (command === "insertText") {
1540
+ range.deleteContents();
1541
+ const text: Text = document.createTextNode(value);
1542
+ range.insertNode(text);
1543
+ range.setStartAfter(text);
1544
+ range.collapse(true);
1545
+ return true;
1546
+ }
1547
+ if (command !== "insertHTML") {
1548
+ return false;
1549
+ }
1550
+ const template: HTMLTemplateElement = document.createElement("template");
1551
+ template.innerHTML = value;
1552
+ const editable: HTMLElement = editableOf();
1553
+ if (range.startContainer === editable) {
1554
+ range.insertNode(template.content);
1555
+ return true;
1556
+ }
1557
+ let line: Node = range.startContainer;
1558
+ while (line.parentNode && line.parentNode !== editable) {
1559
+ line = line.parentNode;
1560
+ }
1561
+ if ((line.textContent || "") === "") {
1562
+ editable.replaceChild(template.content, line);
1563
+ return true;
1564
+ }
1565
+ const first: Element | null = template.content.firstElementChild;
1566
+ if (!first || !["PRE", "BLOCKQUOTE"].includes(first.tagName)) {
1567
+ return false;
1568
+ }
1569
+ const folded: HTMLSpanElement = document.createElement("span");
1570
+ folded.setAttribute("style", "font-family: ui-monospace, monospace");
1571
+ folded.textContent = first.textContent || "";
1572
+ range.deleteContents();
1573
+ range.insertNode(folded);
1574
+ return true;
1575
+ });
1576
+ };
1577
+
1578
+ describe("MarkdownEditor blocks inserted into a line of text", () => {
1579
+ test("the Code Block button puts its block after the line the caret ends", () => {
1580
+ const onChange: jest.Mock = jest.fn();
1581
+ render(<MarkdownEditor initialValue="hello" onChange={onChange} />);
1582
+ const stub: ExecCommandStub = stubBlinkExecCommand();
1583
+ placeCaret("hello", 5);
1584
+
1585
+ fireEvent.click(screen.getByTitle("Code Block"));
1586
+
1587
+ expect(stub).not.toHaveBeenCalledWith(
1588
+ "insertHTML",
1589
+ expect.anything(),
1590
+ expect.anything(),
1591
+ );
1592
+ expect(lastChange(onChange)).toBe("hello\n\n```\ncode block\n```");
1593
+ });
1594
+
1595
+ test("the Code Block button splits the line the caret is in the middle of", () => {
1596
+ const onChange: jest.Mock = jest.fn();
1597
+ render(<MarkdownEditor initialValue="hello world" onChange={onChange} />);
1598
+ stubBlinkExecCommand();
1599
+ placeCaret("world", 0);
1600
+
1601
+ fireEvent.click(screen.getByTitle("Code Block"));
1602
+
1603
+ expect(lastChange(onChange)).toBe("hello\n\n```\ncode block\n```\n\nworld");
1604
+ });
1605
+
1606
+ /*
1607
+ * As in the markdown source, the placeholder is selected, so the code
1608
+ * typed next replaces it inside the block -- rather than landing after the
1609
+ * placeholder in one browser and below the block in another.
1610
+ */
1611
+ test("the Code Block button selects its placeholder", () => {
1612
+ render(<MarkdownEditor initialValue="hello" />);
1613
+ stubBlinkExecCommand();
1614
+ placeCaret("hello", 5);
1615
+
1616
+ fireEvent.click(screen.getByTitle("Code Block"));
1617
+
1618
+ const selection: Selection = window.getSelection() as Selection;
1619
+ expect(selection.toString()).toBe("code block");
1620
+ expect(selection.anchorNode?.parentElement?.closest("pre")).not.toBeNull();
1621
+ });
1622
+
1623
+ test("a fenced block pasted after a line stays a code block", () => {
1624
+ const onChange: jest.Mock = jest.fn();
1625
+ render(<MarkdownEditor initialValue="Run:" onChange={onChange} />);
1626
+ stubBlinkExecCommand();
1627
+ placeCaret("Run:", 4);
1628
+
1629
+ fireEvent.paste(editableOf(), {
1630
+ clipboardData: clipboardWith({ "text/plain": "```\nnpm install\n```" }),
1631
+ });
1632
+
1633
+ expect(lastChange(onChange)).toBe("Run:\n\n```\nnpm install\n```");
1634
+ });
1635
+
1636
+ test("code copied from a web page, pasted mid-line, splits the line", () => {
1637
+ const onChange: jest.Mock = jest.fn();
1638
+ render(
1639
+ <MarkdownEditor initialValue="Run this then check" onChange={onChange} />,
1640
+ );
1641
+ stubBlinkExecCommand();
1642
+ placeCaret("then", 0);
1643
+
1644
+ fireEvent.paste(editableOf(), {
1645
+ clipboardData: clipboardWith({
1646
+ "text/html": "<pre><code>npm install oneuptime</code></pre>",
1647
+ "text/plain": "npm install oneuptime",
1648
+ }),
1649
+ });
1650
+
1651
+ expect(lastChange(onChange)).toBe(
1652
+ "Run this\n\n```\nnpm install oneuptime\n```\n\nthen check",
1653
+ );
1654
+ });
1655
+
1656
+ test("a quote pasted after a line keeps its first line in the quote", () => {
1657
+ const onChange: jest.Mock = jest.fn();
1658
+ render(
1659
+ <MarkdownEditor initialValue="Customer said:" onChange={onChange} />,
1660
+ );
1661
+ stubBlinkExecCommand();
1662
+ placeCaret("said:", 5);
1663
+
1664
+ fireEvent.paste(editableOf(), {
1665
+ clipboardData: clipboardWith({ "text/plain": "> it is down\n> again" }),
1666
+ });
1667
+
1668
+ expect(lastChange(onChange)).toBe(
1669
+ "Customer said:\n\n> it is down\n> again",
1670
+ );
1671
+ });
1672
+
1673
+ /*
1674
+ * The Code Block button selects its placeholder, so what is typed next
1675
+ * replaces it -- the browser's own edit, which its Ctrl+Z takes back
1676
+ * first. After that the block is as the button left it, and the next
1677
+ * Ctrl+Z takes the block back. The editor forgot the block at the first
1678
+ * keystroke, and that Ctrl+Z went to the browser's next entry: the typing
1679
+ * before the block, "Run:" deleted, the block kept.
1680
+ */
1681
+ test("Ctrl+Z takes back a code block once the browser has taken back the code typed in it", () => {
1682
+ const onChange: jest.Mock = jest.fn();
1683
+ render(<MarkdownEditor initialValue="Run:" onChange={onChange} />);
1684
+ stubBlinkExecCommand();
1685
+ placeCaret("Run:", 4);
1686
+ fireEvent.click(screen.getByTitle("Code Block"));
1687
+ const code: Text = textNodeWith("code block");
1688
+
1689
+ // Typed over the placeholder...
1690
+ code.data = "npm ci";
1691
+ fireEvent.input(editableOf(), { inputType: "insertText", data: "npm ci" });
1692
+ expect(lastChange(onChange)).toBe("Run:\n\n```\nnpm ci\n```");
1693
+ // ...which Ctrl+Z leaves to the browser, whose undo puts it back.
1694
+ expect(fireEvent.keyDown(editableOf(), { key: "z", ctrlKey: true })).toBe(
1695
+ true,
1696
+ );
1697
+ code.data = "code block";
1698
+ fireEvent.input(editableOf(), { inputType: "historyUndo" });
1699
+ expect(lastChange(onChange)).toBe("Run:\n\n```\ncode block\n```");
1700
+
1701
+ expect(fireEvent.keyDown(editableOf(), { key: "z", ctrlKey: true })).toBe(
1702
+ false,
1703
+ );
1704
+ expect(lastChange(onChange)).toBe("Run:");
1705
+
1706
+ // Ctrl+Shift+Z makes the block again, and Ctrl+Z takes it back again.
1707
+ expect(
1708
+ fireEvent.keyDown(editableOf(), {
1709
+ key: "z",
1710
+ ctrlKey: true,
1711
+ shiftKey: true,
1712
+ }),
1713
+ ).toBe(false);
1714
+ expect(lastChange(onChange)).toBe("Run:\n\n```\ncode block\n```");
1715
+ fireEvent.keyDown(editableOf(), { key: "z", ctrlKey: true });
1716
+ expect(lastChange(onChange)).toBe("Run:");
1717
+ });
1718
+
1719
+ // Typed after an undo, new text leaves nothing of the editor's to redo.
1720
+ test("leaves Ctrl+Shift+Z to the browser once something is typed after an undo", () => {
1721
+ const onChange: jest.Mock = jest.fn();
1722
+ render(<MarkdownEditor initialValue="Run:" onChange={onChange} />);
1723
+ stubBlinkExecCommand();
1724
+ placeCaret("Run:", 4);
1725
+ fireEvent.click(screen.getByTitle("Code Block"));
1726
+ fireEvent.keyDown(editableOf(), { key: "z", ctrlKey: true });
1727
+ expect(lastChange(onChange)).toBe("Run:");
1728
+
1729
+ textNodeWith("Run:").data = "Run: now";
1730
+ fireEvent.input(editableOf(), { inputType: "insertText", data: " now" });
1731
+
1732
+ expect(
1733
+ fireEvent.keyDown(editableOf(), {
1734
+ key: "z",
1735
+ ctrlKey: true,
1736
+ shiftKey: true,
1737
+ }),
1738
+ ).toBe(true);
1739
+ expect(lastChange(onChange)).toBe("Run: now");
1740
+ });
1741
+
1742
+ // Put in by hand, the block is not on the browser's undo stack.
1743
+ test("Ctrl+Z takes back a code block put into a line", () => {
1744
+ const onChange: jest.Mock = jest.fn();
1745
+ render(<MarkdownEditor initialValue="hello" onChange={onChange} />);
1746
+ stubBlinkExecCommand();
1747
+ placeCaret("hello", 5);
1748
+ fireEvent.click(screen.getByTitle("Code Block"));
1749
+
1750
+ expect(fireEvent.keyDown(editableOf(), { key: "z", ctrlKey: true })).toBe(
1751
+ false,
1752
+ );
1753
+
1754
+ expect(lastChange(onChange)).toBe("hello");
1755
+ });
1756
+
1757
+ /*
1758
+ * With the caret between two elements of a line -- after a bold word and
1759
+ * before the space that follows it, where Firefox's arrow keys can leave
1760
+ * it -- the rest of the line is moved out whole rather than copied, and the
1761
+ * space at the split trimmed from it. Trimmed while it was out of the
1762
+ * editor, that change was beyond what an undo could check: Ctrl+Z left the
1763
+ * block in (and in jsdom took the space with it). Moved into the second
1764
+ * half before the half was in the editor, the text could not be redone.
1765
+ */
1766
+ test("Ctrl+Z and Ctrl+Shift+Z take back and remake a code block put in between two words' formatting", () => {
1767
+ const onChange: jest.Mock = jest.fn();
1768
+ render(<MarkdownEditor initialValue="**bold** *it*" onChange={onChange} />);
1769
+ stubBlinkExecCommand();
1770
+ act(() => {
1771
+ editableOf().focus();
1772
+ });
1773
+ const line: HTMLElement = editableOf().querySelector("p") as HTMLElement;
1774
+ const range: Range = document.createRange();
1775
+ range.setStart(line, 1);
1776
+ range.collapse(true);
1777
+ window.getSelection()?.removeAllRanges();
1778
+ window.getSelection()?.addRange(range);
1779
+ fireEvent.click(screen.getByTitle("Code Block"));
1780
+ expect(lastChange(onChange)).toBe(
1781
+ "**bold**\n\n```\ncode block\n```\n\n*it*",
1782
+ );
1783
+
1784
+ expect(fireEvent.keyDown(editableOf(), { key: "z", ctrlKey: true })).toBe(
1785
+ false,
1786
+ );
1787
+ expect(lastChange(onChange)).toBe("**bold** *it*");
1788
+
1789
+ expect(
1790
+ fireEvent.keyDown(editableOf(), {
1791
+ key: "z",
1792
+ ctrlKey: true,
1793
+ shiftKey: true,
1794
+ }),
1795
+ ).toBe(false);
1796
+ expect(lastChange(onChange)).toBe(
1797
+ "**bold**\n\n```\ncode block\n```\n\n*it*",
1798
+ );
1799
+ expect(fireEvent.keyDown(editableOf(), { key: "z", ctrlKey: true })).toBe(
1800
+ false,
1801
+ );
1802
+ expect(lastChange(onChange)).toBe("**bold** *it*");
1803
+ });
1804
+
1805
+ /*
1806
+ * A click on the last letter of a bold word, or the arrow keys, leave the
1807
+ * caret inside the <strong> at its very end. The split copied the
1808
+ * <strong> into the second half with nothing in it, which nothing showed
1809
+ * and the note saved as "**** then check".
1810
+ */
1811
+ test("the Code Block button at the end of a bold word leaves no empty bold behind", () => {
1812
+ const onChange: jest.Mock = jest.fn();
1813
+ render(
1814
+ <MarkdownEditor
1815
+ initialValue="Run **this** then check"
1816
+ onChange={onChange}
1817
+ />,
1818
+ );
1819
+ stubBlinkExecCommand();
1820
+ placeCaret("this", 4);
1821
+
1822
+ fireEvent.click(screen.getByTitle("Code Block"));
1823
+ expect(lastChange(onChange)).toBe(
1824
+ "Run **this**\n\n```\ncode block\n```\n\nthen check",
1825
+ );
1826
+
1827
+ fireEvent.keyDown(editableOf(), { key: "z", ctrlKey: true });
1828
+ expect(lastChange(onChange)).toBe("Run **this** then check");
1829
+ fireEvent.keyDown(editableOf(), {
1830
+ key: "z",
1831
+ ctrlKey: true,
1832
+ shiftKey: true,
1833
+ });
1834
+ expect(lastChange(onChange)).toBe(
1835
+ "Run **this**\n\n```\ncode block\n```\n\nthen check",
1836
+ );
1837
+ fireEvent.keyDown(editableOf(), { key: "z", ctrlKey: true });
1838
+ expect(lastChange(onChange)).toBe("Run **this** then check");
1839
+ });
1840
+
1841
+ // An empty link was saved as its address: a second link, visible nowhere.
1842
+ test("paragraphs pasted after the last letter of a link leave no empty link behind", () => {
1843
+ const onChange: jest.Mock = jest.fn();
1844
+ render(
1845
+ <MarkdownEditor
1846
+ initialValue="See [docs](https://x.test/) now"
1847
+ onChange={onChange}
1848
+ />,
1849
+ );
1850
+ stubBlinkExecCommand();
1851
+ placeCaret("docs", 4);
1852
+
1853
+ fireEvent.paste(editableOf(), {
1854
+ clipboardData: clipboardWith({
1855
+ "text/html": "<p>First.</p><p>Second.</p>",
1856
+ "text/plain": "First.\n\nSecond.",
1857
+ }),
1858
+ });
1859
+
1860
+ expect(lastChange(onChange)).toBe(
1861
+ "See [docs](https://x.test/)\n\nFirst.\n\nSecond.\n\nnow",
1862
+ );
1863
+ });
1864
+
1865
+ // Pasted over, the bold word is emptied, and was saved as "****".
1866
+ test("paragraphs pasted over a bold word leave no emptied bold behind", () => {
1867
+ const onChange: jest.Mock = jest.fn();
1868
+ render(
1869
+ <MarkdownEditor
1870
+ initialValue="Run **this** then check"
1871
+ onChange={onChange}
1872
+ />,
1873
+ );
1874
+ stubBlinkExecCommand();
1875
+ selectText("this", 0, "this", 4);
1876
+
1877
+ fireEvent.paste(editableOf(), {
1878
+ clipboardData: clipboardWith({
1879
+ "text/html": "<p>First.</p><p>Second.</p>",
1880
+ "text/plain": "First.\n\nSecond.",
1881
+ }),
1882
+ });
1883
+
1884
+ expect(lastChange(onChange)).toBe("Run\n\nFirst.\n\nSecond.\n\nthen check");
1885
+ });
1886
+
1887
+ // Every block goes in the same way, splitting the line at the caret.
1888
+ test("the Table button splits the line too", () => {
1889
+ const onChange: jest.Mock = jest.fn();
1890
+ render(<MarkdownEditor initialValue="hello world" onChange={onChange} />);
1891
+ stubBlinkExecCommand();
1892
+ placeCaret("world", 0);
1893
+
1894
+ fireEvent.click(screen.getByTitle("Table"));
1895
+
1896
+ expect(lastChange(onChange)).toMatch(
1897
+ /^hello\n\n\| Header 1 \| Header 2 \| Header 3 \|\n[\s\S]*\| Cell 6 {3}\|\n\nworld$/,
1898
+ );
1899
+ });
1900
+
1901
+ /*
1902
+ * On an empty line insertHTML puts the blocks where they belong in every
1903
+ * browser, and there it is still used: it puts the insert on the
1904
+ * browser's own undo stack.
1905
+ */
1906
+ test("hands a block on an empty line to the browser", () => {
1907
+ const onChange: jest.Mock = jest.fn();
1908
+ render(<MarkdownEditor initialValue="" onChange={onChange} />);
1909
+ const stub: ExecCommandStub = stubBlinkExecCommand();
1910
+ act(() => {
1911
+ editableOf().focus();
1912
+ });
1913
+ const range: Range = document.createRange();
1914
+ range.setStart(editableOf(), 0);
1915
+ range.collapse(true);
1916
+ window.getSelection()?.removeAllRanges();
1917
+ window.getSelection()?.addRange(range);
1918
+
1919
+ fireEvent.paste(editableOf(), {
1920
+ clipboardData: clipboardWith({ "text/plain": "```\nnpm install\n```" }),
1921
+ });
1922
+
1923
+ expect(stub).toHaveBeenCalledWith(
1924
+ "insertHTML",
1925
+ false,
1926
+ "<pre><code>npm install</code></pre>",
1927
+ );
1928
+ expect(lastChange(onChange)).toBe("```\nnpm install\n```");
1929
+ });
1930
+
1931
+ test("the Code Block button on an empty line still selects its placeholder", () => {
1932
+ const onChange: jest.Mock = jest.fn();
1933
+ render(<MarkdownEditor initialValue={"Steps:\n\n"} onChange={onChange} />);
1934
+ const stub: ExecCommandStub = stubBlinkExecCommand();
1935
+ const blank: HTMLElement = document.createElement("p");
1936
+ blank.appendChild(document.createElement("br"));
1937
+ editableOf().appendChild(blank);
1938
+ act(() => {
1939
+ editableOf().focus();
1940
+ });
1941
+ const range: Range = document.createRange();
1942
+ range.setStart(blank, 0);
1943
+ range.collapse(true);
1944
+ window.getSelection()?.removeAllRanges();
1945
+ window.getSelection()?.addRange(range);
1946
+
1947
+ fireEvent.click(screen.getByTitle("Code Block"));
1948
+
1949
+ expect(stub).toHaveBeenCalledWith(
1950
+ "insertHTML",
1951
+ false,
1952
+ "<pre><code>code block</code></pre><p><br></p>",
1953
+ );
1954
+ expect(lastChange(onChange)).toBe("Steps:\n\n```\ncode block\n```");
1955
+ expect(window.getSelection()?.toString()).toBe("code block");
1956
+ });
1957
+ });
1958
+
1959
+ /*
1960
+ * The Link button with nothing selected puts the link into the line the
1961
+ * caret is in. It went in as a bare <a>, which the insert took for a block:
1962
+ * the line was split, and "Run this now" with a link after "Run " saved as
1963
+ * "Run" and the link as two paragraphs, in every engine.
1964
+ */
1965
+ describe("MarkdownEditor Link button with nothing selected", () => {
1966
+ const LINK: string = "https://x.test/";
1967
+
1968
+ const clickLink: () => void = (): void => {
1969
+ jest.spyOn(window, "prompt").mockReturnValue(LINK);
1970
+ fireEvent.click(screen.getByTitle("Link"));
1971
+ };
1972
+
1973
+ test("puts the link into the middle of a paragraph", () => {
1974
+ const onChange: jest.Mock = jest.fn();
1975
+ render(<MarkdownEditor initialValue="Run this now" onChange={onChange} />);
1976
+ stubBlinkExecCommand();
1977
+ placeCaret("Run this now", 4);
1978
+
1979
+ clickLink();
1980
+
1981
+ expect(lastChange(onChange)).toBe(`Run [${LINK}](${LINK})this now`);
1982
+ });
1983
+
1984
+ test("puts the link at the end of a paragraph", () => {
1985
+ const onChange: jest.Mock = jest.fn();
1986
+ render(
1987
+ <MarkdownEditor initialValue="See the runbook" onChange={onChange} />,
1988
+ );
1989
+ stubBlinkExecCommand();
1990
+ placeCaret("See the runbook", 15);
1991
+
1992
+ clickLink();
1993
+
1994
+ expect(lastChange(onChange)).toBe(`See the runbook[${LINK}](${LINK})`);
1995
+ });
1996
+
1997
+ test("puts the link into a heading", () => {
1998
+ const onChange: jest.Mock = jest.fn();
1999
+ render(<MarkdownEditor initialValue="# Title here" onChange={onChange} />);
2000
+ stubBlinkExecCommand();
2001
+ placeCaret("Title here", 6);
2002
+
2003
+ clickLink();
2004
+
2005
+ expect(lastChange(onChange)).toBe(`# Title [${LINK}](${LINK})here`);
2006
+ });
2007
+
2008
+ test("puts the link into a list item", () => {
2009
+ const onChange: jest.Mock = jest.fn();
2010
+ render(
2011
+ <MarkdownEditor initialValue={"- Run this now"} onChange={onChange} />,
2012
+ );
2013
+ stubBlinkExecCommand();
2014
+ placeCaret("Run this now", 4);
2015
+
2016
+ clickLink();
2017
+
2018
+ expect(lastChange(onChange)).toBe(`- Run [${LINK}](${LINK})this now`);
2019
+ });
2020
+
2021
+ test("puts the link into the empty editor as a paragraph of its own", () => {
2022
+ const onChange: jest.Mock = jest.fn();
2023
+ render(<MarkdownEditor initialValue="" onChange={onChange} />);
2024
+ stubBlinkExecCommand();
2025
+ act(() => {
2026
+ editableOf().focus();
2027
+ });
2028
+ const range: Range = document.createRange();
2029
+ range.setStart(editableOf(), 0);
2030
+ range.collapse(true);
2031
+ window.getSelection()?.removeAllRanges();
2032
+ window.getSelection()?.addRange(range);
2033
+
2034
+ clickLink();
2035
+
2036
+ expect(lastChange(onChange)).toBe(`[${LINK}](${LINK})`);
2037
+ });
2038
+ });
2039
+
2040
+ /*
2041
+ * After the Bullet or Numbered List button in the empty editor, Chromium
2042
+ * leaves the selection on the editor itself, before the new list -- though it
2043
+ * shows the caret, and types, in the list's empty first item. The editor's own
2044
+ * inserts went where the selection was: above the list, leaving an empty
2045
+ * bullet under what was pasted ("restart the api\n\n-").
2046
+ */
2047
+ describe("MarkdownEditor inserts after Chromium's list button in the empty editor", () => {
2048
+ const listJustMade: (html: string) => jest.Mock = (
2049
+ html: string,
2050
+ ): jest.Mock => {
2051
+ const onChange: jest.Mock = jest.fn();
2052
+ render(<MarkdownEditor initialValue="" onChange={onChange} />);
2053
+ stubBlinkExecCommand();
2054
+ const editable: HTMLElement = editableOf();
2055
+ act(() => {
2056
+ editable.focus();
2057
+ });
2058
+ editable.innerHTML = html;
2059
+ const range: Range = document.createRange();
2060
+ range.setStart(editable, 0);
2061
+ range.collapse(true);
2062
+ window.getSelection()?.removeAllRanges();
2063
+ window.getSelection()?.addRange(range);
2064
+ return onChange;
2065
+ };
2066
+
2067
+ test("a line pasted then is the bulleted list's first item", () => {
2068
+ const onChange: jest.Mock = listJustMade("<ul><li><br></li></ul>");
2069
+
2070
+ fireEvent.paste(editableOf(), {
2071
+ clipboardData: clipboardWith({ "text/plain": "restart the api" }),
2072
+ });
2073
+
2074
+ expect(lastChange(onChange)).toBe("- restart the api");
2075
+ });
2076
+
2077
+ test("a line pasted then is the numbered list's first item", () => {
2078
+ const onChange: jest.Mock = listJustMade("<ol><li><br></li></ol>");
2079
+
2080
+ fireEvent.paste(editableOf(), {
2081
+ clipboardData: clipboardWith({ "text/plain": "restart the api" }),
2082
+ });
2083
+
2084
+ expect(lastChange(onChange)).toBe("1. restart the api");
2085
+ });
2086
+
2087
+ test("the Code Block button then puts its block in the list's item, not above the list", () => {
2088
+ const onChange: jest.Mock = listJustMade("<ul><li><br></li></ul>");
2089
+
2090
+ fireEvent.click(screen.getByTitle("Code Block"));
2091
+
2092
+ const saved: string = lastChange(onChange);
2093
+ expect(saved.startsWith("- ")).toBe(true);
2094
+ expect(saved).toContain("code block");
2095
+ expect(saved).not.toMatch(/\n-\s*$/);
2096
+ expect(editableOf().firstElementChild?.tagName).toBe("UL");
2097
+ expect(editableOf().querySelector("li pre")).not.toBeNull();
2098
+ });
2099
+ });
2100
+
2101
+ /*
2102
+ * A list pasted into a list item, or the Task List button's task, joins the
2103
+ * item's list. Kept inside the item, as a code block pasted there is, it was
2104
+ * a list nested in it: pasted into the empty item Enter leaves, it showed two
2105
+ * bullets -- the double bullets of issue #4114 -- and the next task added at
2106
+ * the end of a task was a sub-task.
2107
+ */
2108
+ describe("MarkdownEditor a list inserted into a list item", () => {
2109
+ // The empty item Enter leaves at the end of a list, with the caret in it.
2110
+ const pressEnterAfterLastItem: () => HTMLElement = (): HTMLElement => {
2111
+ const list: Element = editableOf().querySelector("ul, ol") as Element;
2112
+ const empty: HTMLElement = document.createElement("li");
2113
+ empty.appendChild(document.createElement("br"));
2114
+ list.appendChild(empty);
2115
+ act(() => {
2116
+ editableOf().focus();
2117
+ });
2118
+ const range: Range = document.createRange();
2119
+ range.setStart(empty, 0);
2120
+ range.collapse(true);
2121
+ window.getSelection()?.removeAllRanges();
2122
+ window.getSelection()?.addRange(range);
2123
+ return empty;
2124
+ };
2125
+
2126
+ test("pastes a list into the empty item Enter leaves as items of the list", () => {
2127
+ const onChange: jest.Mock = jest.fn();
2128
+ render(<MarkdownEditor initialValue="- first" onChange={onChange} />);
2129
+ stubBlinkExecCommand();
2130
+ pressEnterAfterLastItem();
2131
+
2132
+ fireEvent.paste(editableOf(), {
2133
+ clipboardData: clipboardWith({
2134
+ "text/plain": "- restart api\n- check logs",
2135
+ }),
2136
+ });
2137
+
2138
+ expect(lastChange(onChange)).toBe("- first\n- restart api\n- check logs");
2139
+ expect(editableOf().querySelectorAll("li li")).toHaveLength(0);
2140
+ });
2141
+
2142
+ test("pastes bullets copied from Outlook into the empty item as items", () => {
2143
+ const onChange: jest.Mock = jest.fn();
2144
+ render(<MarkdownEditor initialValue="- item one" onChange={onChange} />);
2145
+ stubBlinkExecCommand();
2146
+ pressEnterAfterLastItem();
2147
+
2148
+ fireEvent.paste(editableOf(), {
2149
+ clipboardData: clipboardWith({ "text/plain": "• a\n• b" }),
2150
+ });
2151
+
2152
+ expect(lastChange(onChange)).toBe("- item one\n- a\n- b");
2153
+ });
2154
+
2155
+ test("pastes a list at the end of an item as the items after it", () => {
2156
+ const onChange: jest.Mock = jest.fn();
2157
+ render(
2158
+ <MarkdownEditor
2159
+ initialValue={"- item one\n- item two"}
2160
+ onChange={onChange}
2161
+ />,
2162
+ );
2163
+ stubBlinkExecCommand();
2164
+ placeCaret("item one", 8);
2165
+
2166
+ fireEvent.paste(editableOf(), {
2167
+ clipboardData: clipboardWith({
2168
+ "text/html": "<ul><li>alpha</li><li>beta</li></ul>",
2169
+ "text/plain": "alpha\nbeta",
2170
+ }),
2171
+ });
2172
+
2173
+ expect(lastChange(onChange)).toBe(
2174
+ "- item one\n- alpha\n- beta\n- item two",
2175
+ );
2176
+ });
2177
+
2178
+ test("the Task List button at the end of a task adds the next task, not a sub-task", () => {
2179
+ const onChange: jest.Mock = jest.fn();
2180
+ render(
2181
+ <MarkdownEditor initialValue="- [ ] task one" onChange={onChange} />,
2182
+ );
2183
+ stubBlinkExecCommand();
2184
+ placeCaret("task one", 8);
2185
+
2186
+ fireEvent.click(screen.getByTitle("Task List"));
2187
+
2188
+ expect(lastChange(onChange)).toBe("- [ ] task one\n- [ ] Task");
2189
+ });
2190
+
2191
+ test("the Task List button in the empty item Enter leaves makes it a task", () => {
2192
+ const onChange: jest.Mock = jest.fn();
2193
+ render(<MarkdownEditor initialValue="- item one" onChange={onChange} />);
2194
+ stubBlinkExecCommand();
2195
+ pressEnterAfterLastItem();
2196
+
2197
+ fireEvent.click(screen.getByTitle("Task List"));
2198
+
2199
+ expect(lastChange(onChange)).toBe("- item one\n- [ ] Task");
2200
+ });
2201
+
2202
+ test("leaves the caret after the last item pasted, and Ctrl+Z takes the paste back", () => {
2203
+ const onChange: jest.Mock = jest.fn();
2204
+ render(<MarkdownEditor initialValue="- first" onChange={onChange} />);
2205
+ stubBlinkExecCommand();
2206
+ const empty: HTMLElement = pressEnterAfterLastItem();
2207
+
2208
+ fireEvent.paste(editableOf(), {
2209
+ clipboardData: clipboardWith({ "text/plain": "- a\n- b" }),
2210
+ });
2211
+ const selection: Selection = window.getSelection() as Selection;
2212
+ expect(selection.anchorNode?.textContent).toBe("b");
2213
+ expect(selection.anchorOffset).toBe(1);
2214
+
2215
+ fireEvent.keyDown(editableOf(), { key: "z", ctrlKey: true });
2216
+
2217
+ expect(editableOf().innerHTML).toBe("<ul><li>first</li><li><br></li></ul>");
2218
+ expect(editableOf().querySelectorAll("li")[1]).toBe(empty);
2219
+ });
2220
+ });
2221
+
2222
+ describe("MarkdownEditor paste in the markdown source", () => {
2223
+ test("writes pasted rich text as markdown source", () => {
2224
+ const onChange: jest.Mock = jest.fn();
2225
+ render(<MarkdownEditor initialValue="" onChange={onChange} />);
2226
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2227
+
2228
+ const notPrevented: boolean = fireEvent.paste(textarea, {
2229
+ clipboardData: clipboardWith({
2230
+ "text/html": "<ul><li>a<ul><li>b</li></ul></li></ul>",
2231
+ "text/plain": "a\nb",
2232
+ }),
2233
+ });
2234
+
2235
+ expect(notPrevented).toBe(false);
2236
+ expect(lastChange(onChange)).toBe("- a\n - b");
2237
+ });
2238
+
2239
+ test("writes pasted bullet characters as markdown items", () => {
2240
+ const onChange: jest.Mock = jest.fn();
2241
+ render(<MarkdownEditor initialValue="" onChange={onChange} />);
2242
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2243
+
2244
+ expect(
2245
+ fireEvent.paste(textarea, {
2246
+ clipboardData: clipboardWith({ "text/plain": "•\ta\n•\tb" }),
2247
+ }),
2248
+ ).toBe(false);
2249
+ expect(lastChange(onChange)).toBe("- a\n- b");
2250
+ });
2251
+
2252
+ /*
2253
+ * When there is nothing to convert, the browser's own paste inserts the
2254
+ * same text and keeps it on the undo stack, so it is left to do that.
2255
+ */
2256
+ test("leaves a plain paste to the browser", () => {
2257
+ const onChange: jest.Mock = jest.fn();
2258
+ render(<MarkdownEditor initialValue="" onChange={onChange} />);
2259
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2260
+
2261
+ expect(
2262
+ fireEvent.paste(textarea, {
2263
+ clipboardData: clipboardWith({
2264
+ "text/plain": "- already\r\n- markdown",
2265
+ "text/html": "<p>- already<br>- markdown</p>",
2266
+ }),
2267
+ }),
2268
+ ).toBe(true);
2269
+ expect(onChange).not.toHaveBeenCalled();
2270
+ });
2271
+
2272
+ /*
2273
+ * Converted inside a fence, a command copied from a docs page came in as
2274
+ * a ``` block of its own -- closing the one around it, with the command
2275
+ * left as a paragraph -- so there the browser pastes the text as it is.
2276
+ */
2277
+ test("leaves a paste inside a fenced code block to the browser", () => {
2278
+ const onChange: jest.Mock = jest.fn();
2279
+ render(
2280
+ <MarkdownEditor initialValue={"```bash\n\n```"} onChange={onChange} />,
2281
+ );
2282
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2283
+ textarea.setSelectionRange(8, 8);
2284
+
2285
+ expect(
2286
+ fireEvent.paste(textarea, {
2287
+ clipboardData: clipboardWith({
2288
+ "text/html": "<pre><code>npm install oneuptime</code></pre>",
2289
+ "text/plain": "npm install oneuptime",
2290
+ }),
2291
+ }),
2292
+ ).toBe(true);
2293
+ expect(onChange).not.toHaveBeenCalled();
2294
+ });
2295
+
2296
+ // CLI output is not a list: "1)" and "•" stay as they were printed.
2297
+ test("does not rewrite list markers in text pasted inside a fence", () => {
2298
+ const onChange: jest.Mock = jest.fn();
2299
+ render(<MarkdownEditor initialValue={"~~~\n\n~~~"} onChange={onChange} />);
2300
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2301
+ textarea.setSelectionRange(4, 4);
2302
+
2303
+ expect(
2304
+ fireEvent.paste(textarea, {
2305
+ clipboardData: clipboardWith({
2306
+ "text/plain": "● nginx.service - web server\n1) option A\n• done",
2307
+ }),
2308
+ }),
2309
+ ).toBe(true);
2310
+ expect(onChange).not.toHaveBeenCalled();
2311
+ });
2312
+
2313
+ test("leaves a paste after a fence that is never closed to the browser", () => {
2314
+ const onChange: jest.Mock = jest.fn();
2315
+ render(<MarkdownEditor initialValue={"```bash\n"} onChange={onChange} />);
2316
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2317
+ textarea.setSelectionRange(8, 8);
2318
+
2319
+ expect(
2320
+ fireEvent.paste(textarea, {
2321
+ clipboardData: clipboardWith({
2322
+ "text/html": "<ul><li>a</li></ul>",
2323
+ "text/plain": "a",
2324
+ }),
2325
+ }),
2326
+ ).toBe(true);
2327
+ expect(onChange).not.toHaveBeenCalled();
2328
+ });
2329
+
2330
+ test("still converts a paste on the line after a code block", () => {
2331
+ const onChange: jest.Mock = jest.fn();
2332
+ render(
2333
+ <MarkdownEditor initialValue={"```\nx\n```\n\n"} onChange={onChange} />,
2334
+ );
2335
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2336
+ textarea.setSelectionRange(textarea.value.length, textarea.value.length);
2337
+
2338
+ expect(
2339
+ fireEvent.paste(textarea, {
2340
+ clipboardData: clipboardWith({
2341
+ "text/html": "<ul><li>a<ul><li>b</li></ul></li></ul>",
2342
+ "text/plain": "a\nb",
2343
+ }),
2344
+ }),
2345
+ ).toBe(false);
2346
+ expect(lastChange(onChange)).toBe("```\nx\n```\n\n- a\n - b");
2347
+ });
2348
+
2349
+ /*
2350
+ * A pod name double-clicked in a note's code block: as a fenced block in
2351
+ * the middle of the line, its closing fence was followed by the rest of the
2352
+ * line -- an opening fence, which turned the rest of the note into code.
2353
+ */
2354
+ test("pastes a word copied out of a note's code block into the line as inline code", () => {
2355
+ const onChange: jest.Mock = jest.fn();
2356
+ render(
2357
+ <MarkdownEditor
2358
+ initialValue={"Restart the pod now\n\nNext paragraph."}
2359
+ onChange={onChange}
2360
+ />,
2361
+ );
2362
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2363
+ textarea.setSelectionRange(12, 12);
2364
+
2365
+ expect(
2366
+ fireEvent.paste(textarea, {
2367
+ clipboardData: clipboardWith({
2368
+ "text/html": CHROME_VIEWER_CODE_WORD_COPY_HTML,
2369
+ "text/plain": "api_server",
2370
+ }),
2371
+ }),
2372
+ ).toBe(false);
2373
+ expect(lastChange(onChange)).toBe(
2374
+ "Restart the `api_server` pod now\n\nNext paragraph.",
2375
+ );
2376
+ });
2377
+
2378
+ /*
2379
+ * What the visual editor does with a block pasted into the middle of a
2380
+ * line -- split the line -- in the source: the block on lines of its own,
2381
+ * a blank line either side, and the spaces at the split gone.
2382
+ */
2383
+ test("puts code lines pasted into the middle of a line on lines of their own", () => {
2384
+ const onChange: jest.Mock = jest.fn();
2385
+ render(
2386
+ <MarkdownEditor
2387
+ initialValue={"Restart the pod now\n\nNext paragraph."}
2388
+ onChange={onChange}
2389
+ />,
2390
+ );
2391
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2392
+ textarea.setSelectionRange(12, 12);
2393
+
2394
+ fireEvent.paste(textarea, {
2395
+ clipboardData: clipboardWith({
2396
+ "text/html": CHROME_VIEWER_CODE_LINES_COPY_HTML,
2397
+ "text/plain": VIEWER_CODE_LINES_COPY_TEXT,
2398
+ }),
2399
+ });
2400
+
2401
+ expect(lastChange(onChange)).toBe(
2402
+ "Restart the\n\n```yaml\nreplicas: 3\nimage: api_server:v2\n```\n\npod now\n\nNext paragraph.",
2403
+ );
2404
+ });
2405
+
2406
+ test("puts a list pasted over part of a line on lines of its own", () => {
2407
+ const onChange: jest.Mock = jest.fn();
2408
+ render(
2409
+ <MarkdownEditor initialValue={"Steps: TODO later"} onChange={onChange} />,
2410
+ );
2411
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2412
+ textarea.setSelectionRange(7, 11);
2413
+
2414
+ fireEvent.paste(textarea, {
2415
+ clipboardData: clipboardWith({
2416
+ "text/html": "<ul><li>restart api</li><li>check logs</li></ul>",
2417
+ "text/plain": "restart api\ncheck logs",
2418
+ }),
2419
+ });
2420
+
2421
+ expect(lastChange(onChange)).toBe(
2422
+ "Steps:\n\n- restart api\n- check logs\n\nlater",
2423
+ );
2424
+ });
2425
+
2426
+ // A block at the start or end of its line is already on lines of its own.
2427
+ test("adds no lines around a block pasted on a line of its own", () => {
2428
+ const onChange: jest.Mock = jest.fn();
2429
+ render(
2430
+ <MarkdownEditor initialValue={"Steps:\n\nlater"} onChange={onChange} />,
2431
+ );
2432
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2433
+ textarea.setSelectionRange(7, 7);
2434
+
2435
+ fireEvent.paste(textarea, {
2436
+ clipboardData: clipboardWith({
2437
+ "text/html": "<ul><li>restart api</li></ul>",
2438
+ "text/plain": "restart api",
2439
+ }),
2440
+ });
2441
+
2442
+ expect(lastChange(onChange)).toBe("Steps:\n- restart api\nlater");
2443
+ });
2444
+
2445
+ /*
2446
+ * As in the visual editor, a list pasted on a list item's line joins its
2447
+ * list. After the bare marker of an item just started, the marker stayed
2448
+ * in front of the first pasted item: "- - restart api", two bullets.
2449
+ */
2450
+ test("pastes a list after a list's bare marker in place of that empty item", () => {
2451
+ const onChange: jest.Mock = jest.fn();
2452
+ render(
2453
+ <MarkdownEditor initialValue={"Steps:\n\n- "} onChange={onChange} />,
2454
+ );
2455
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2456
+ textarea.setSelectionRange(textarea.value.length, textarea.value.length);
2457
+
2458
+ fireEvent.paste(textarea, {
2459
+ clipboardData: clipboardWith({
2460
+ "text/html": "<ul><li>restart api</li><li>check logs</li></ul>",
2461
+ "text/plain": "restart api\ncheck logs",
2462
+ }),
2463
+ });
2464
+
2465
+ expect(lastChange(onChange)).toBe("Steps:\n\n- restart api\n- check logs");
2466
+ });
2467
+
2468
+ /*
2469
+ * Only an EMPTY item is replaced. Right after the marker of an item that
2470
+ * has text, the pasted items go in before it and it keeps its marker and
2471
+ * task box, as in the visual editor. Deciding on the text before the caret
2472
+ * alone deleted the marker (and the tick of a done task) and left the
2473
+ * item's text as a paragraph.
2474
+ */
2475
+ test("pastes a list right after an item's marker before that item, which keeps its marker", () => {
2476
+ const onChange: jest.Mock = jest.fn();
2477
+ render(
2478
+ <MarkdownEditor
2479
+ initialValue={"- item one\n- item two"}
2480
+ onChange={onChange}
2481
+ />,
2482
+ );
2483
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2484
+ textarea.setSelectionRange(13, 13);
2485
+
2486
+ fireEvent.paste(textarea, {
2487
+ clipboardData: clipboardWith({
2488
+ "text/html": "<ul><li>restart api</li><li>check logs</li></ul>",
2489
+ "text/plain": "restart api\ncheck logs",
2490
+ }),
2491
+ });
2492
+
2493
+ expect(lastChange(onChange)).toBe(
2494
+ "- item one\n- restart api\n- check logs\n- item two",
2495
+ );
2496
+ });
2497
+
2498
+ test("keeps a done task's marker and tick when a list is pasted right after them", () => {
2499
+ const onChange: jest.Mock = jest.fn();
2500
+ render(
2501
+ <MarkdownEditor
2502
+ initialValue={"- [x] rolled back deploy\n- [ ] notify customers"}
2503
+ onChange={onChange}
2504
+ />,
2505
+ );
2506
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2507
+ textarea.setSelectionRange(6, 6);
2508
+
2509
+ fireEvent.paste(textarea, {
2510
+ clipboardData: clipboardWith({
2511
+ "text/html": "<ul><li>check logs</li><li>restart api</li></ul>",
2512
+ "text/plain": "check logs\nrestart api",
2513
+ }),
2514
+ });
2515
+
2516
+ expect(lastChange(onChange)).toBe(
2517
+ "- check logs\n- restart api\n- [x] rolled back deploy\n- [ ] notify customers",
2518
+ );
2519
+ });
2520
+
2521
+ test("keeps the item's marker when a list is pasted over text that starts right after it", () => {
2522
+ const onChange: jest.Mock = jest.fn();
2523
+ render(
2524
+ <MarkdownEditor
2525
+ initialValue={"- [x] rolled back deploy"}
2526
+ onChange={onChange}
2527
+ />,
2528
+ );
2529
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2530
+ textarea.setSelectionRange(6, 18);
2531
+
2532
+ fireEvent.paste(textarea, {
2533
+ clipboardData: clipboardWith({
2534
+ "text/html": "<ul><li>check logs</li></ul>",
2535
+ "text/plain": "check logs",
2536
+ }),
2537
+ });
2538
+
2539
+ expect(lastChange(onChange)).toBe("- check logs\n- [x] deploy");
2540
+ });
2541
+
2542
+ test("pastes a list at the end of a list item as the items after it", () => {
2543
+ const onChange: jest.Mock = jest.fn();
2544
+ render(
2545
+ <MarkdownEditor
2546
+ initialValue={"- parent\n - child\n- next"}
2547
+ onChange={onChange}
2548
+ />,
2549
+ );
2550
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2551
+ textarea.setSelectionRange(18, 18);
2552
+
2553
+ fireEvent.paste(textarea, {
2554
+ clipboardData: clipboardWith({
2555
+ "text/html": "<ul><li>a<ul><li>a1</li></ul></li><li>b</li></ul>",
2556
+ "text/plain": "a\na1\nb",
2557
+ }),
2558
+ });
2559
+
2560
+ expect(lastChange(onChange)).toBe(
2561
+ "- parent\n - child\n - a\n - a1\n - b\n- next",
2562
+ );
2563
+ });
2564
+
2565
+ test("still pastes formatted words into the middle of a line", () => {
2566
+ const onChange: jest.Mock = jest.fn();
2567
+ render(<MarkdownEditor initialValue={"hello world"} onChange={onChange} />);
2568
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2569
+ textarea.setSelectionRange(6, 6);
2570
+
2571
+ fireEvent.paste(textarea, {
2572
+ clipboardData: clipboardWith({
2573
+ "text/html": "<b>very</b> ",
2574
+ "text/plain": "very ",
2575
+ }),
2576
+ });
2577
+
2578
+ expect(lastChange(onChange)).toBe("hello **very** world");
2579
+ });
2580
+
2581
+ test("still uploads an image pasted inside a fence", async () => {
2582
+ const create: jest.SpyInstance = jest
2583
+ .spyOn(ModelAPI, "create")
2584
+ .mockReturnValue(new Promise<never>(() => {}) as never);
2585
+ render(<MarkdownEditor initialValue={"```\n\n```"} />);
2586
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2587
+ textarea.setSelectionRange(4, 4);
2588
+
2589
+ expect(
2590
+ fireEvent.paste(textarea, {
2591
+ clipboardData: clipboardWith({}, [imageFile()]),
2592
+ }),
2593
+ ).toBe(false);
2594
+ await flushUploads();
2595
+ expect(create).toHaveBeenCalledTimes(1);
2596
+ });
2597
+
2598
+ test("still uploads a pasted image", async () => {
2599
+ const onChange: jest.Mock = jest.fn();
2600
+ const create: jest.SpyInstance = jest
2601
+ .spyOn(ModelAPI, "create")
2602
+ .mockReturnValue(new Promise<never>(() => {}) as never);
2603
+ render(<MarkdownEditor initialValue="" onChange={onChange} />);
2604
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2605
+
2606
+ expect(
2607
+ fireEvent.paste(textarea, {
2608
+ clipboardData: clipboardWith({}, [imageFile()]),
2609
+ }),
2610
+ ).toBe(false);
2611
+ expect(lastChange(onChange)).toMatch(/^!\[Uploading shot\.png/);
2612
+ await flushUploads();
2613
+ expect(create).toHaveBeenCalledTimes(1);
2614
+ });
2615
+ });
2616
+
2617
+ describe("MarkdownEditor without image upload", () => {
2618
+ test("shows the Image button, file picker and upload tip by default", () => {
2619
+ render(<MarkdownEditor initialValue="" />);
2620
+
2621
+ expect(screen.getByTitle("Image")).toBeInTheDocument();
2622
+ expect(document.querySelector('input[type="file"]')).not.toBeNull();
2623
+ expect(screen.getByText(/upload screenshots inline/)).toBeInTheDocument();
2624
+ });
2625
+
2626
+ test("hides the Image button, file picker and upload tip when turned off", () => {
2627
+ render(<MarkdownEditor initialValue="" allowImageUpload={false} />);
2628
+
2629
+ expect(screen.queryByTitle("Image")).toBeNull();
2630
+ expect(document.querySelector('input[type="file"]')).toBeNull();
2631
+ expect(screen.queryByText(/upload screenshots inline/)).toBeNull();
2632
+ // The rest of the toolbar is still there.
2633
+ expect(screen.getByTitle("Link")).toBeInTheDocument();
2634
+ expect(screen.getByTitle("Indent (Tab)")).toBeInTheDocument();
2635
+ });
2636
+
2637
+ test("ignores a pasted image, and does not let the browser insert it", async () => {
2638
+ const onChange: jest.Mock = jest.fn();
2639
+ const create: jest.SpyInstance = jest.spyOn(ModelAPI, "create");
2640
+ render(
2641
+ <MarkdownEditor
2642
+ initialValue=""
2643
+ allowImageUpload={false}
2644
+ onChange={onChange}
2645
+ />,
2646
+ );
2647
+
2648
+ const notPrevented: boolean = fireEvent.paste(editableOf(), {
2649
+ clipboardData: clipboardWith({}, [imageFile()]),
2650
+ });
2651
+
2652
+ expect(notPrevented).toBe(false);
2653
+ await flushUploads();
2654
+ expect(onChange).not.toHaveBeenCalled();
2655
+ expect(create).not.toHaveBeenCalled();
2656
+ expect(editableOf().innerHTML).toBe("");
2657
+ });
2658
+
2659
+ test("still pastes the text that comes with an image", () => {
2660
+ const onChange: jest.Mock = jest.fn();
2661
+ render(
2662
+ <MarkdownEditor
2663
+ initialValue=""
2664
+ allowImageUpload={false}
2665
+ onChange={onChange}
2666
+ />,
2667
+ );
2668
+
2669
+ fireEvent.paste(editableOf(), {
2670
+ clipboardData: clipboardWith({ "text/plain": "caption" }, [imageFile()]),
2671
+ });
2672
+
2673
+ expect(lastChange(onChange)).toBe("caption");
2674
+ });
2675
+
2676
+ test("ignores a pasted image in the markdown source", async () => {
2677
+ const onChange: jest.Mock = jest.fn();
2678
+ const create: jest.SpyInstance = jest.spyOn(ModelAPI, "create");
2679
+ render(
2680
+ <MarkdownEditor
2681
+ initialValue=""
2682
+ allowImageUpload={false}
2683
+ onChange={onChange}
2684
+ />,
2685
+ );
2686
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2687
+
2688
+ fireEvent.paste(textarea, {
2689
+ clipboardData: clipboardWith({}, [imageFile()]),
2690
+ });
2691
+ await flushUploads();
2692
+
2693
+ expect(onChange).not.toHaveBeenCalled();
2694
+ expect(create).not.toHaveBeenCalled();
2695
+ });
2696
+
2697
+ test("refuses a dropped file without uploading it", async () => {
2698
+ const onChange: jest.Mock = jest.fn();
2699
+ const create: jest.SpyInstance = jest.spyOn(ModelAPI, "create");
2700
+ render(
2701
+ <MarkdownEditor
2702
+ initialValue=""
2703
+ allowImageUpload={false}
2704
+ onChange={onChange}
2705
+ />,
2706
+ );
2707
+ const dataTransfer: {
2708
+ types: Array<string>;
2709
+ files: Array<File>;
2710
+ dropEffect: string;
2711
+ } = { types: ["Files"], files: [imageFile()], dropEffect: "copy" };
2712
+
2713
+ expect(fireEvent.dragOver(editableOf(), { dataTransfer })).toBe(false);
2714
+ expect(dataTransfer.dropEffect).toBe("none");
2715
+ expect(screen.queryByText("Drop image to upload")).toBeNull();
2716
+ expect(fireEvent.drop(editableOf(), { dataTransfer })).toBe(false);
2717
+ await flushUploads();
2718
+
2719
+ expect(onChange).not.toHaveBeenCalled();
2720
+ expect(create).not.toHaveBeenCalled();
2721
+ });
2722
+
2723
+ test("uploads a dropped image when uploads are on", async () => {
2724
+ const onChange: jest.Mock = jest.fn();
2725
+ const create: jest.SpyInstance = jest
2726
+ .spyOn(ModelAPI, "create")
2727
+ .mockReturnValue(new Promise<never>(() => {}) as never);
2728
+ render(<MarkdownEditor initialValue="" onChange={onChange} />);
2729
+ const dataTransfer: { types: Array<string>; files: Array<File> } = {
2730
+ types: ["Files"],
2731
+ files: [imageFile()],
2732
+ };
2733
+
2734
+ fireEvent.dragOver(editableOf(), { dataTransfer });
2735
+ expect(screen.getByText("Drop image to upload")).toBeInTheDocument();
2736
+ fireEvent.drop(editableOf(), { dataTransfer });
2737
+
2738
+ expect(lastChange(onChange)).toMatch(/^!\[Uploading shot\.png/);
2739
+ await flushUploads();
2740
+ expect(create).toHaveBeenCalledTimes(1);
2741
+ });
2742
+
2743
+ test("uploads a pasted image in the visual editor when uploads are on", async () => {
2744
+ const onChange: jest.Mock = jest.fn();
2745
+ const create: jest.SpyInstance = jest
2746
+ .spyOn(ModelAPI, "create")
2747
+ .mockReturnValue(new Promise<never>(() => {}) as never);
2748
+ render(<MarkdownEditor initialValue="" onChange={onChange} />);
2749
+
2750
+ fireEvent.paste(editableOf(), {
2751
+ clipboardData: clipboardWith({}, [imageFile()]),
2752
+ });
2753
+
2754
+ expect(lastChange(onChange)).toMatch(/^!\[Uploading shot\.png/);
2755
+ await flushUploads();
2756
+ expect(create).toHaveBeenCalledTimes(1);
2757
+ });
2758
+ });
2759
+
2760
+ /*
2761
+ * What Chromium does to an empty editor as "abc", Enter, "def" is typed:
2762
+ * the first line stays bare text and the second goes in a <div>. That used
2763
+ * to save as "abcdef".
2764
+ */
2765
+ describe("MarkdownEditor typing lines into an empty editor", () => {
2766
+ test("saves each line Chromium writes as a line", () => {
2767
+ const onChange: jest.Mock = jest.fn();
2768
+ render(<MarkdownEditor initialValue="" onChange={onChange} />);
2769
+
2770
+ editableOf().innerHTML = "abc<div>def</div>";
2771
+ fireEvent.input(editableOf());
2772
+
2773
+ expect(lastChange(onChange)).toBe("abc\ndef");
2774
+ });
2775
+ });
2776
+
2777
+ /*
2778
+ * The error was a bare paragraph: a required description left empty was
2779
+ * neither announced nor tied to the editor, so to a screen reader the form
2780
+ * did nothing when submitted.
2781
+ */
2782
+ describe("MarkdownEditor error message", () => {
2783
+ test("is announced, and describes the visual editor, which is marked invalid", () => {
2784
+ render(<MarkdownEditor initialValue="" error="Description is required." />);
2785
+
2786
+ const editor: HTMLElement = screen.getByRole("textbox");
2787
+ expect(editor).toHaveAttribute("aria-invalid", "true");
2788
+ expect(editor).toHaveAccessibleDescription("Description is required.");
2789
+ expect(screen.getByRole("alert")).toHaveTextContent(
2790
+ "Description is required.",
2791
+ );
2792
+ });
2793
+
2794
+ test("describes the markdown source the same way", () => {
2795
+ render(<MarkdownEditor initialValue="" error="Description is required." />);
2796
+
2797
+ const textarea: HTMLTextAreaElement = switchToMarkdown();
2798
+
2799
+ expect(textarea).toHaveAttribute("aria-invalid", "true");
2800
+ expect(textarea).toHaveAccessibleDescription("Description is required.");
2801
+ });
2802
+
2803
+ test("gives each editor's message an id of its own", () => {
2804
+ render(
2805
+ <>
2806
+ <MarkdownEditor initialValue="" error="Description is required." />
2807
+ <MarkdownEditor initialValue="" error="Impact is required." />
2808
+ </>,
2809
+ );
2810
+
2811
+ const [first, second] = screen.getAllByRole(
2812
+ "textbox",
2813
+ ) as Array<HTMLElement>;
2814
+ expect(first).toHaveAccessibleDescription("Description is required.");
2815
+ expect(second).toHaveAccessibleDescription("Impact is required.");
2816
+ });
2817
+
2818
+ test("leaves the editor unmarked without an error", () => {
2819
+ render(<MarkdownEditor initialValue="" />);
2820
+
2821
+ const editor: HTMLElement = screen.getByRole("textbox");
2822
+ expect(editor).not.toHaveAttribute("aria-invalid");
2823
+ expect(editor).not.toHaveAttribute("aria-describedby");
2824
+ expect(screen.queryByRole("alert")).toBeNull();
2825
+ });
2826
+ });
2827
+
2828
+ describe("MarkdownEditor help text", () => {
2829
+ test("explains Tab and Shift+Tab, and plain-text paste", () => {
2830
+ render(<MarkdownEditor initialValue="" />);
2831
+
2832
+ expect(screen.getByText(/to indent an item and/)).toBeInTheDocument();
2833
+ expect(screen.getByText("Shift+Tab")).toBeInTheDocument();
2834
+ expect(screen.getByText("Ctrl+Shift+V")).toBeInTheDocument();
2835
+ expect(
2836
+ screen.getByText(/Outside a list, Tab moves to the next field/),
2837
+ ).toBeInTheDocument();
2838
+ });
2839
+ });
2840
+
2841
+ /*
2842
+ * On the public incident form, translated all round, the empty Description
2843
+ * box still said "Type your content here..." and its help "Formatting help".
2844
+ * The editor looks those words up by their English text, as FieldLabel does
2845
+ * "(Optional)"; a locale with no entry for them -- the Dashboard's, today --
2846
+ * keeps the English. The instances reach the editor through I18nextProvider
2847
+ * only: installed with initReactI18next they would leak German into every
2848
+ * other test in this worker.
2849
+ */
2850
+ describe("MarkdownEditor in the page's language", () => {
2851
+ const german: i18n = createInstance();
2852
+ const germanWithoutEditorWords: i18n = createInstance();
2853
+
2854
+ beforeAll(async () => {
2855
+ await german.init({
2856
+ lng: "de",
2857
+ resources: {
2858
+ de: {
2859
+ translation: {
2860
+ "Type your content here...": "Geben Sie hier Ihren Text ein...",
2861
+ "Type your markdown here...": "Geben Sie hier Ihr Markdown ein...",
2862
+ "Formatting help": "Hilfe zur Formatierung",
2863
+ },
2864
+ },
2865
+ },
2866
+ interpolation: { escapeValue: false },
2867
+ keySeparator: false,
2868
+ nsSeparator: false,
2869
+ });
2870
+ await germanWithoutEditorWords.init({
2871
+ lng: "de",
2872
+ resources: { de: { translation: { Submit: "Senden" } } },
2873
+ interpolation: { escapeValue: false },
2874
+ keySeparator: false,
2875
+ nsSeparator: false,
2876
+ });
2877
+ });
2878
+
2879
+ test("shows its placeholders and its help's heading in the locale's words", () => {
2880
+ render(
2881
+ <I18nextProvider i18n={german}>
2882
+ <MarkdownEditor initialValue="" />
2883
+ </I18nextProvider>,
2884
+ );
2885
+
2886
+ expect(editableOf()).toHaveAttribute(
2887
+ "data-placeholder",
2888
+ "Geben Sie hier Ihren Text ein...",
2889
+ );
2890
+ expect(screen.getByText("Hilfe zur Formatierung")).toBeInTheDocument();
2891
+ expect(screen.queryByText("Formatting help")).toBeNull();
2892
+
2893
+ expect(switchToMarkdown()).toHaveAttribute(
2894
+ "placeholder",
2895
+ "Geben Sie hier Ihr Markdown ein...",
2896
+ );
2897
+ });
2898
+
2899
+ test("falls back to the English when the locale has no entry for them", () => {
2900
+ render(
2901
+ <I18nextProvider i18n={germanWithoutEditorWords}>
2902
+ <MarkdownEditor initialValue="" />
2903
+ </I18nextProvider>,
2904
+ );
2905
+
2906
+ expect(editableOf()).toHaveAttribute(
2907
+ "data-placeholder",
2908
+ "Type your content here...",
2909
+ );
2910
+ expect(screen.getByText("Formatting help")).toBeInTheDocument();
2911
+
2912
+ expect(switchToMarkdown()).toHaveAttribute(
2913
+ "placeholder",
2914
+ "Type your markdown here...",
2915
+ );
2916
+ });
2917
+
2918
+ // A form field hands the editor a placeholder it has already translated.
2919
+ test("shows a placeholder it is given as it is", () => {
2920
+ render(
2921
+ <I18nextProvider i18n={german}>
2922
+ <MarkdownEditor
2923
+ initialValue=""
2924
+ placeholder="Beschreiben Sie, was nicht funktioniert"
2925
+ />
2926
+ </I18nextProvider>,
2927
+ );
2928
+
2929
+ expect(editableOf()).toHaveAttribute(
2930
+ "data-placeholder",
2931
+ "Beschreiben Sie, was nicht funktioniert",
2932
+ );
2933
+ expect(switchToMarkdown()).toHaveAttribute(
2934
+ "placeholder",
2935
+ "Beschreiben Sie, was nicht funktioniert",
2936
+ );
2937
+ });
2938
+ });