diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index a9c45744cec2a..866386232dc7d 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -306,7 +306,7 @@ enabled: - x-pack/test/functional/apps/ml/short_tests/config.ts - x-pack/test/functional/apps/ml/stack_management_jobs/config.ts - x-pack/test/functional/apps/monitoring/config.ts - - x-pack/test/functional/apps/observability_log_explorer/config.ts + - x-pack/test/functional/apps/observability_logs_explorer/config.ts - x-pack/test/functional/apps/painless_lab/config.ts - x-pack/test/functional/apps/remote_clusters/config.ts - x-pack/test/functional/apps/reporting_management/config.ts diff --git a/.buildkite/package-lock.json b/.buildkite/package-lock.json index 62647ca6f2f8a..5b19d688aa3ff 100644 --- a/.buildkite/package-lock.json +++ b/.buildkite/package-lock.json @@ -702,9 +702,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz", - "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "funding": [ { "type": "individual", @@ -2261,9 +2261,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz", - "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==" + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==" }, "form-data": { "version": "4.0.0", diff --git a/.buildkite/pipelines/pull_request/apm_cypress.yml b/.buildkite/pipelines/pull_request/apm_cypress.yml index a64590e337ee4..3c95b2814f4e0 100644 --- a/.buildkite/pipelines/pull_request/apm_cypress.yml +++ b/.buildkite/pipelines/pull_request/apm_cypress.yml @@ -3,7 +3,9 @@ steps: label: 'APM Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 120 parallelism: 4 retry: diff --git a/.buildkite/pipelines/pull_request/base.yml b/.buildkite/pipelines/pull_request/base.yml index 718a7b2a32031..25a373de87509 100644 --- a/.buildkite/pipelines/pull_request/base.yml +++ b/.buildkite/pipelines/pull_request/base.yml @@ -23,6 +23,7 @@ steps: label: 'Quick Checks' agents: queue: n2-2-spot + key: quick_checks timeout_in_minutes: 60 retry: automatic: diff --git a/.buildkite/pipelines/pull_request/deploy_cloud.yml b/.buildkite/pipelines/pull_request/deploy_cloud.yml index 5306b4f0094bb..722c6a2785c04 100644 --- a/.buildkite/pipelines/pull_request/deploy_cloud.yml +++ b/.buildkite/pipelines/pull_request/deploy_cloud.yml @@ -3,7 +3,9 @@ steps: label: 'Build and Deploy to Cloud' agents: queue: n2-2-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 30 soft_fail: true retry: diff --git a/.buildkite/pipelines/pull_request/exploratory_view_plugin.yml b/.buildkite/pipelines/pull_request/exploratory_view_plugin.yml index 0f572a98cefb3..8053cdfe2eebd 100644 --- a/.buildkite/pipelines/pull_request/exploratory_view_plugin.yml +++ b/.buildkite/pipelines/pull_request/exploratory_view_plugin.yml @@ -3,7 +3,9 @@ steps: label: 'Exploratory View @elastic/synthetics Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 artifact_paths: - 'x-pack/plugins/exploratory_view/e2e/.journeys/**/*' diff --git a/.buildkite/pipelines/pull_request/fleet_cypress.yml b/.buildkite/pipelines/pull_request/fleet_cypress.yml index fcccdfe7a6799..2f8e629478657 100644 --- a/.buildkite/pipelines/pull_request/fleet_cypress.yml +++ b/.buildkite/pipelines/pull_request/fleet_cypress.yml @@ -3,7 +3,9 @@ steps: label: 'Fleet Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 50 parallelism: 6 retry: diff --git a/.buildkite/pipelines/pull_request/kbn_handlebars.yml b/.buildkite/pipelines/pull_request/kbn_handlebars.yml index ecc5103619216..ba12674abaf32 100644 --- a/.buildkite/pipelines/pull_request/kbn_handlebars.yml +++ b/.buildkite/pipelines/pull_request/kbn_handlebars.yml @@ -3,7 +3,9 @@ steps: label: 'Check @kbn/handlebars for upstream differences' agents: queue: n2-2-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 5 retry: automatic: diff --git a/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml b/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml index e5a1b6a445fd2..8a8d7e68e3f32 100644 --- a/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml +++ b/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml @@ -3,7 +3,9 @@ steps: label: 'Observability onboarding Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 120 parallelism: 2 retry: diff --git a/.buildkite/pipelines/pull_request/profiling_cypress.yml b/.buildkite/pipelines/pull_request/profiling_cypress.yml index ca345f2c78dd3..f9fef28fa5fea 100644 --- a/.buildkite/pipelines/pull_request/profiling_cypress.yml +++ b/.buildkite/pipelines/pull_request/profiling_cypress.yml @@ -3,7 +3,9 @@ steps: label: 'Profiling Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 120 parallelism: 2 retry: diff --git a/.buildkite/pipelines/pull_request/response_ops.yml b/.buildkite/pipelines/pull_request/response_ops.yml index 38ca242949d86..c984fba8f2e07 100644 --- a/.buildkite/pipelines/pull_request/response_ops.yml +++ b/.buildkite/pipelines/pull_request/response_ops.yml @@ -3,7 +3,9 @@ steps: label: 'Rules, Alerts and Exceptions ResponseOps Cypress Tests on Security Solution' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 120 parallelism: 4 retry: diff --git a/.buildkite/pipelines/pull_request/response_ops_cases.yml b/.buildkite/pipelines/pull_request/response_ops_cases.yml index 312c62c01c732..42ae473616e3d 100644 --- a/.buildkite/pipelines/pull_request/response_ops_cases.yml +++ b/.buildkite/pipelines/pull_request/response_ops_cases.yml @@ -3,7 +3,9 @@ steps: label: 'Cases Cypress Tests on Security Solution' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 120 retry: automatic: diff --git a/.buildkite/pipelines/pull_request/security_solution/ai_assistant.yml b/.buildkite/pipelines/pull_request/security_solution/ai_assistant.yml index 3de3ece499a6e..a7f9754753ca8 100644 --- a/.buildkite/pipelines/pull_request/security_solution/ai_assistant.yml +++ b/.buildkite/pipelines/pull_request/security_solution/ai_assistant.yml @@ -3,7 +3,9 @@ steps: label: 'Serverless AI Assistant - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 1 retry: @@ -15,7 +17,9 @@ steps: label: 'AI Assistant - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 1 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/cypress_burn.yml b/.buildkite/pipelines/pull_request/security_solution/cypress_burn.yml index e65659a6e038b..f5f7f62e0d90f 100644 --- a/.buildkite/pipelines/pull_request/security_solution/cypress_burn.yml +++ b/.buildkite/pipelines/pull_request/security_solution/cypress_burn.yml @@ -3,7 +3,9 @@ steps: label: '[Soft fail] Defend Workflows Cypress Tests, burning changed specs' agents: queue: n2-4-virt - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 soft_fail: true parallelism: 1 @@ -14,7 +16,9 @@ steps: label: '[Soft fail] Defend Workflows Cypress Tests on Serverless, burning changed specs' agents: queue: n2-4-virt - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 soft_fail: true parallelism: 1 @@ -25,7 +29,9 @@ steps: label: '[Soft fail] Security Solution Cypress tests, burning changed specs' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 1 retry: @@ -36,7 +42,9 @@ steps: label: '[Soft fail] Osquery Cypress Tests, burning changed specs' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 50 soft_fail: true retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/defend_workflows.yml b/.buildkite/pipelines/pull_request/security_solution/defend_workflows.yml index 248d953c485e6..c0c68d8fc2192 100644 --- a/.buildkite/pipelines/pull_request/security_solution/defend_workflows.yml +++ b/.buildkite/pipelines/pull_request/security_solution/defend_workflows.yml @@ -3,7 +3,9 @@ steps: label: 'Defend Workflows Cypress Tests' agents: queue: n2-4-virt - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 16 retry: @@ -15,7 +17,9 @@ steps: label: 'Defend Workflows Cypress Tests on Serverless' agents: queue: n2-4-virt - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 6 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/detection_engine.yml b/.buildkite/pipelines/pull_request/security_solution/detection_engine.yml index 6196e2e251522..47565c2b2042f 100644 --- a/.buildkite/pipelines/pull_request/security_solution/detection_engine.yml +++ b/.buildkite/pipelines/pull_request/security_solution/detection_engine.yml @@ -3,7 +3,9 @@ steps: label: 'Serverless Detection Engine - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 6 retry: @@ -15,7 +17,9 @@ steps: label: 'Serverless Detection Engine - Exceptions - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 6 retry: @@ -27,7 +31,9 @@ steps: label: 'Detection Engine - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 8 retry: @@ -39,7 +45,9 @@ steps: label: 'Detection Engine - Exceptions - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 6 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/entity_analytics.yml b/.buildkite/pipelines/pull_request/security_solution/entity_analytics.yml index 482107467884c..412047bd1921b 100644 --- a/.buildkite/pipelines/pull_request/security_solution/entity_analytics.yml +++ b/.buildkite/pipelines/pull_request/security_solution/entity_analytics.yml @@ -3,7 +3,9 @@ steps: label: 'Serverless Entity Analytics - Security Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 2 retry: @@ -15,7 +17,9 @@ steps: label: 'Entity Analytics - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 2 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/explore.yml b/.buildkite/pipelines/pull_request/security_solution/explore.yml index 5acd56ebe7f06..ecb821b51cf03 100644 --- a/.buildkite/pipelines/pull_request/security_solution/explore.yml +++ b/.buildkite/pipelines/pull_request/security_solution/explore.yml @@ -3,7 +3,9 @@ steps: label: 'Explore - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 4 retry: @@ -15,7 +17,9 @@ steps: label: 'Serverless Explore - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 4 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/investigations.yml b/.buildkite/pipelines/pull_request/security_solution/investigations.yml index 0390f5dfec8e7..f18c78f54ec2f 100644 --- a/.buildkite/pipelines/pull_request/security_solution/investigations.yml +++ b/.buildkite/pipelines/pull_request/security_solution/investigations.yml @@ -3,7 +3,9 @@ steps: label: 'Investigations - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 8 retry: @@ -15,7 +17,9 @@ steps: label: 'Serverless Investigations - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 8 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/osquery_cypress.yml b/.buildkite/pipelines/pull_request/security_solution/osquery_cypress.yml index b969a468c81bc..93d502873c881 100644 --- a/.buildkite/pipelines/pull_request/security_solution/osquery_cypress.yml +++ b/.buildkite/pipelines/pull_request/security_solution/osquery_cypress.yml @@ -3,7 +3,9 @@ steps: label: 'Osquery Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 6 retry: @@ -15,7 +17,9 @@ steps: label: 'Serverless Osquery Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 6 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/rule_management.yml b/.buildkite/pipelines/pull_request/security_solution/rule_management.yml index e36f77ec60988..88a63cbe5bfa1 100644 --- a/.buildkite/pipelines/pull_request/security_solution/rule_management.yml +++ b/.buildkite/pipelines/pull_request/security_solution/rule_management.yml @@ -3,7 +3,9 @@ steps: label: 'Serverless Rule Management - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 8 retry: @@ -15,7 +17,9 @@ steps: label: 'Serverless Rule Management - Prebuilt Rules - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 4 retry: @@ -27,7 +31,9 @@ steps: label: 'Rule Management - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 8 retry: @@ -39,7 +45,9 @@ steps: label: 'Rule Management - Prebuilt Rules - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 6 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/threat_intelligence.yml b/.buildkite/pipelines/pull_request/security_solution/threat_intelligence.yml index 6a82abe46eee1..74fe7a7e05969 100644 --- a/.buildkite/pipelines/pull_request/security_solution/threat_intelligence.yml +++ b/.buildkite/pipelines/pull_request/security_solution/threat_intelligence.yml @@ -3,7 +3,9 @@ steps: label: 'Threat Intelligence Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 2 retry: diff --git a/.buildkite/pipelines/pull_request/synthetics_plugin.yml b/.buildkite/pipelines/pull_request/synthetics_plugin.yml index bfa3caa62f177..f81a19d835bdb 100644 --- a/.buildkite/pipelines/pull_request/synthetics_plugin.yml +++ b/.buildkite/pipelines/pull_request/synthetics_plugin.yml @@ -3,7 +3,9 @@ steps: label: 'Synthetics @elastic/synthetics Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 artifact_paths: - 'x-pack/plugins/synthetics/e2e/.journeys/**/*' diff --git a/.buildkite/pipelines/pull_request/uptime_plugin.yml b/.buildkite/pipelines/pull_request/uptime_plugin.yml index cbd1c417fc852..c1744101b018e 100644 --- a/.buildkite/pipelines/pull_request/uptime_plugin.yml +++ b/.buildkite/pipelines/pull_request/uptime_plugin.yml @@ -3,7 +3,9 @@ steps: label: 'Uptime @elastic/synthetics Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 artifact_paths: - 'x-pack/plugins/synthetics/e2e/.journeys/**/*' diff --git a/.buildkite/pipelines/pull_request/ux_plugin_e2e.yml b/.buildkite/pipelines/pull_request/ux_plugin_e2e.yml index 7542373c0f437..476e8c204d15c 100644 --- a/.buildkite/pipelines/pull_request/ux_plugin_e2e.yml +++ b/.buildkite/pipelines/pull_request/ux_plugin_e2e.yml @@ -3,7 +3,9 @@ steps: label: 'UX Plugin @elastic/synthetics Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 artifact_paths: - 'x-pack/plugins/ux/e2e/.journeys/**/*' diff --git a/.buildkite/scripts/steps/code_coverage/reporting/downloadPrevSha.sh b/.buildkite/scripts/steps/code_coverage/reporting/downloadPrevSha.sh index e7158bb07b667..af7824841ef28 100755 --- a/.buildkite/scripts/steps/code_coverage/reporting/downloadPrevSha.sh +++ b/.buildkite/scripts/steps/code_coverage/reporting/downloadPrevSha.sh @@ -2,10 +2,14 @@ set -euo pipefail +# TODO: Safe to remove this after 2024-03-01 (https://github.com/elastic/kibana/issues/175904) gsutil -m cp -r gs://elastic-bekitzur-kibana-coverage-live/previous_pointer/previous.txt . || echo "### Previous Pointer NOT FOUND?" +# TODO: Activate after the above is removed +#gsutil -m cp -r gs://elastic-kibana-coverage-live/previous_pointer/previous.txt . || echo "### Previous Pointer NOT FOUND?" + if [ -e ./previous.txt ]; then mv previous.txt downloaded_previous.txt echo "### downloaded_previous.txt" cat downloaded_previous.txt -fi \ No newline at end of file +fi diff --git a/.buildkite/scripts/steps/code_coverage/reporting/uploadPrevSha.sh b/.buildkite/scripts/steps/code_coverage/reporting/uploadPrevSha.sh index 2c15dc34f38c2..26d84fa7d6024 100755 --- a/.buildkite/scripts/steps/code_coverage/reporting/uploadPrevSha.sh +++ b/.buildkite/scripts/steps/code_coverage/reporting/uploadPrevSha.sh @@ -9,4 +9,7 @@ collectPrevious() { } collectPrevious -gsutil cp previous.txt gs://elastic-bekitzur-kibana-coverage-live/previous_pointer/ \ No newline at end of file +# TODO: Safe to remove this after 2024-03-01 (https://github.com/elastic/kibana/issues/175904) +gsutil cp previous.txt gs://elastic-bekitzur-kibana-coverage-live/previous_pointer/ + +gsutil cp previous.txt gs://elastic-kibana-coverage-live/previous_pointer/ diff --git a/.buildkite/scripts/steps/code_coverage/reporting/uploadStaticSite.sh b/.buildkite/scripts/steps/code_coverage/reporting/uploadStaticSite.sh index 02f2262075b89..93f2ca8660e60 100755 --- a/.buildkite/scripts/steps/code_coverage/reporting/uploadStaticSite.sh +++ b/.buildkite/scripts/steps/code_coverage/reporting/uploadStaticSite.sh @@ -4,18 +4,24 @@ set -euo pipefail xs=("$@") -uploadPrefix="gs://elastic-bekitzur-kibana-coverage-live/" +# TODO: Safe to remove this after 2024-03-01 (https://github.com/elastic/kibana/issues/175904) - also clean up usages +uploadPrefix_old="gs://elastic-bekitzur-kibana-coverage-live/" +uploadPrefixWithTimeStamp_old="${uploadPrefix}${TIME_STAMP}/" + +uploadPrefix="gs://elastic-kibana-coverage-live/" uploadPrefixWithTimeStamp="${uploadPrefix}${TIME_STAMP}/" uploadBase() { for x in 'src/dev/code_coverage/www/index.html' 'src/dev/code_coverage/www/404.html'; do gsutil -m -q cp -r -a public-read -z js,css,html "${x}" "${uploadPrefix}" + gsutil -m -q cp -r -a public-read -z js,css,html "${x}" "${uploadPrefix_old}" done } uploadRest() { for x in "${xs[@]}"; do gsutil -m -q cp -r -a public-read -z js,css,html "target/kibana-coverage/${x}-combined" "${uploadPrefixWithTimeStamp}" + gsutil -m -q cp -r -a public-read -z js,css,html "target/kibana-coverage/${x}-combined" "${uploadPrefixWithTimeStamp_old}" done } diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 20a33917c1819..b1a14c058fa95 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -462,7 +462,7 @@ x-pack/plugins/index_lifecycle_management @elastic/platform-deployment-managemen x-pack/plugins/index_management @elastic/platform-deployment-management test/plugin_functional/plugins/index_patterns @elastic/kibana-data-discovery x-pack/packages/kbn-infra-forge @elastic/obs-ux-management-team -x-pack/plugins/infra @elastic/infra-monitoring-ui @elastic/obs-ux-logs-team @elastic/obs-ux-infra_services-team +x-pack/plugins/infra @elastic/obs-ux-logs-team @elastic/obs-ux-infra_services-team x-pack/plugins/ingest_pipelines @elastic/platform-deployment-management src/plugins/input_control_vis @elastic/kibana-presentation src/plugins/inspector @elastic/kibana-presentation @@ -806,7 +806,7 @@ packages/kbn-text-based-editor @elastic/kibana-visualizations src/plugins/text_based_languages @elastic/kibana-visualizations x-pack/examples/third_party_lens_navigation_prompt @elastic/kibana-visualizations x-pack/examples/third_party_vis_lens_example @elastic/kibana-visualizations -x-pack/plugins/threat_intelligence @elastic/protections-experience +x-pack/plugins/threat_intelligence @elastic/security-threat-hunting-investigations x-pack/plugins/timelines @elastic/security-threat-hunting-investigations packages/kbn-timelion-grammar @elastic/kibana-visualizations packages/kbn-tinymath @elastic/kibana-visualizations @@ -1041,9 +1041,9 @@ packages/kbn-monaco/src/esql @elastic/kibana-visualizations /x-pack/plugins/infra/public/common @elastic/obs-ux-infra_services-team /x-pack/plugins/infra/public/observability_logs @elastic/obs-ux-logs-team /x-pack/plugins/infra/public/services @elastic/obs-ux-infra_services-team -/x-pack/test/functional/apps/infra @elastic/infra-monitoring-ui @elastic/obs-ux-infra_services-team -/x-pack/test/functional/apps/infra/logs @elastic/infra-monitoring-ui @elastic/obs-ux-logs-team -/x-pack/test/api_integration/apis/infra @elastic/infra-monitoring-ui @elastic/obs-ux-infra_services-team +/x-pack/test/functional/apps/infra @elastic/obs-ux-infra_services-team +/x-pack/test/functional/apps/infra/logs @elastic/obs-ux-logs-team +/x-pack/test/api_integration/apis/infra @elastic/obs-ux-infra_services-team # Observability UX management team x-pack/packages/observability/alert_details @elastic/obs-ux-management-team @@ -1055,7 +1055,7 @@ x-pack/plugins/infra/server/lib/alerting @elastic/obs-ux-management-team /x-pack/test/functional/apps/monitoring @elastic/obs-ux-infra_services-team @elastic/stack-monitoring /x-pack/test/api_integration/apis/monitoring @elastic/obs-ux-infra_services-team @elastic/stack-monitoring /x-pack/test/api_integration/apis/monitoring_collection @elastic/obs-ux-infra_services-team @elastic/stack-monitoring -/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer @elastic/obs-ux-logs-team +/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer @elastic/obs-ux-logs-team # Fleet /fleet_packages.json @elastic/fleet @@ -1086,7 +1086,7 @@ x-pack/plugins/infra/server/lib/alerting @elastic/obs-ux-management-team # Logs /x-pack/test/api_integration/apis/logs_ui @elastic/obs-ux-logs-team -/x-pack/test/functional/apps/observability_log_explorer @elastic/obs-ux-logs-team +/x-pack/test/functional/apps/observability_logs_explorer @elastic/obs-ux-logs-team # Observability onboarding tour /x-pack/plugins/observability_shared/public/components/tour @elastic/platform-onboarding diff --git a/.github/stale.yml b/.github/stale.yml index d44d965baf2da..efb51919e1dd9 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -8,7 +8,7 @@ daysUntilStale: 180 daysUntilClose: false # Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled) -onlyLabels: ['Team:apm', 'Team:Infra Monitoring UI'] +onlyLabels: ['Team:obs-ux-infra_services'] # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable exemptLabels: ['technical debt', 'prevent stale'] diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index ed90267b8ed8e..c5ec0b53a8de2 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.devdocs.json b/api_docs/advanced_settings.devdocs.json index e52a5d7848d75..c66a04618ed08 100644 --- a/api_docs/advanced_settings.devdocs.json +++ b/api_docs/advanced_settings.devdocs.json @@ -2,281 +2,8 @@ "id": "advancedSettings", "client": { "classes": [], - "functions": [ - { - "parentPluginId": "advancedSettings", - "id": "def-public.LazyField", - "type": "Function", - "tags": [], - "label": "LazyField", - "description": [ - "\nExports the field component as a React.lazy component. We're explicitly naming it lazy here\nso any plugin that would import that can clearly see it's lazy loaded and can only be used\ninside a suspense context." - ], - "signature": [ - "React.ExoticComponent> & { readonly _result: typeof ", - "Field", - "; }" - ], - "path": "src/plugins/advanced_settings/public/index.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "advancedSettings", - "id": "def-public.LazyField.$1", - "type": "Uncategorized", - "tags": [], - "label": "props", - "description": [], - "signature": [ - "P" - ], - "path": "node_modules/@types/react/index.d.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "advancedSettings", - "id": "def-public.toEditableConfig", - "type": "Function", - "tags": [], - "label": "toEditableConfig", - "description": [], - "signature": [ - "({\n def,\n name,\n value,\n isCustom,\n isOverridden,\n}: { def: ", - { - "pluginId": "@kbn/core-ui-settings-browser", - "scope": "common", - "docId": "kibKbnCoreUiSettingsBrowserPluginApi", - "section": "def-common.PublicUiSettingsParams", - "text": "PublicUiSettingsParams" - }, - " & ", - { - "pluginId": "@kbn/core-ui-settings-common", - "scope": "common", - "docId": "kibKbnCoreUiSettingsCommonPluginApi", - "section": "def-common.UserProvidedValues", - "text": "UserProvidedValues" - }, - "; name: string; value: ", - { - "pluginId": "@kbn/core-saved-objects-common", - "scope": "common", - "docId": "kibKbnCoreSavedObjectsCommonPluginApi", - "section": "def-common.SavedObjectAttribute", - "text": "SavedObjectAttribute" - }, - "; isCustom: boolean; isOverridden: boolean; }) => ", - "FieldSetting" - ], - "path": "src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "advancedSettings", - "id": "def-public.toEditableConfig.$1", - "type": "Object", - "tags": [], - "label": "{\n def,\n name,\n value,\n isCustom,\n isOverridden,\n}", - "description": [], - "path": "src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "advancedSettings", - "id": "def-public.toEditableConfig.$1.def", - "type": "CompoundType", - "tags": [], - "label": "def", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-ui-settings-browser", - "scope": "common", - "docId": "kibKbnCoreUiSettingsBrowserPluginApi", - "section": "def-common.PublicUiSettingsParams", - "text": "PublicUiSettingsParams" - }, - " & ", - { - "pluginId": "@kbn/core-ui-settings-common", - "scope": "common", - "docId": "kibKbnCoreUiSettingsCommonPluginApi", - "section": "def-common.UserProvidedValues", - "text": "UserProvidedValues" - }, - "" - ], - "path": "src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "advancedSettings", - "id": "def-public.toEditableConfig.$1.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "advancedSettings", - "id": "def-public.toEditableConfig.$1.value", - "type": "CompoundType", - "tags": [], - "label": "value", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-saved-objects-common", - "scope": "common", - "docId": "kibKbnCoreSavedObjectsCommonPluginApi", - "section": "def-common.SavedObjectAttributeSingle", - "text": "SavedObjectAttributeSingle" - }, - " | ", - { - "pluginId": "@kbn/core-saved-objects-common", - "scope": "common", - "docId": "kibKbnCoreSavedObjectsCommonPluginApi", - "section": "def-common.SavedObjectAttributeSingle", - "text": "SavedObjectAttributeSingle" - }, - "[]" - ], - "path": "src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "advancedSettings", - "id": "def-public.toEditableConfig.$1.isCustom", - "type": "boolean", - "tags": [], - "label": "isCustom", - "description": [], - "path": "src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "advancedSettings", - "id": "def-public.toEditableConfig.$1.isOverridden", - "type": "boolean", - "tags": [], - "label": "isOverridden", - "description": [], - "path": "src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts", - "deprecated": false, - "trackAdoption": false - } - ] - } - ], - "returnComment": [ - "the editable config object" - ], - "initialIsOpen": false - } - ], - "interfaces": [ - { - "parentPluginId": "advancedSettings", - "id": "def-public.FieldState", - "type": "Interface", - "tags": [], - "label": "FieldState", - "description": [], - "path": "src/plugins/advanced_settings/public/management_app/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "advancedSettings", - "id": "def-public.FieldState.value", - "type": "Any", - "tags": [], - "label": "value", - "description": [], - "signature": [ - "any" - ], - "path": "src/plugins/advanced_settings/public/management_app/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "advancedSettings", - "id": "def-public.FieldState.changeImage", - "type": "CompoundType", - "tags": [], - "label": "changeImage", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/advanced_settings/public/management_app/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "advancedSettings", - "id": "def-public.FieldState.loading", - "type": "CompoundType", - "tags": [], - "label": "loading", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/advanced_settings/public/management_app/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "advancedSettings", - "id": "def-public.FieldState.isInvalid", - "type": "CompoundType", - "tags": [], - "label": "isInvalid", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/advanced_settings/public/management_app/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "advancedSettings", - "id": "def-public.FieldState.error", - "type": "CompoundType", - "tags": [], - "label": "error", - "description": [], - "signature": [ - "string | null | undefined" - ], - "path": "src/plugins/advanced_settings/public/management_app/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - } - ], + "functions": [], + "interfaces": [], "enums": [], "misc": [], "objects": [], diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 82249f9682f61..eb5a1ac8a0b2d 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux @elastic/platform-deployment-management](https: | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 17 | 1 | 15 | 2 | +| 2 | 0 | 2 | 0 | ## Client @@ -31,9 +31,3 @@ Contact [@elastic/appex-sharedux @elastic/platform-deployment-management](https: ### Start -### Functions - - -### Interfaces - - diff --git a/api_docs/ai_assistant_management_observability.mdx b/api_docs/ai_assistant_management_observability.mdx index 911ee04cb0414..f0b3ddce70594 100644 --- a/api_docs/ai_assistant_management_observability.mdx +++ b/api_docs/ai_assistant_management_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementObservability title: "aiAssistantManagementObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementObservability plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementObservability'] --- import aiAssistantManagementObservabilityObj from './ai_assistant_management_observability.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index fd99099347c9d..8648c0e874105 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 5b5be6d8ed57c..4a23def0faf08 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.devdocs.json b/api_docs/alerting.devdocs.json index 84f358d1d8f42..033531cbd02be 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -2822,7 +2822,7 @@ "label": "actions", "description": [], "signature": [ - "Readonly<{ frequency?: Readonly<{} & { summary: boolean; throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; }> | undefined; alertsFilter?: Readonly<{ query?: Readonly<{ dsl?: string | undefined; } & { kql: string; filters: Readonly<{ query?: Record | undefined; $state?: Readonly<{} & { store: \"appState\" | \"globalState\"; }> | undefined; } & { meta: Record; }>[]; }> | undefined; timeframe?: Readonly<{} & { days: (2 | 7 | 6 | 5 | 4 | 3 | 1)[]; hours: Readonly<{} & { start: string; end: string; }>; timezone: string; }> | undefined; } & {}> | undefined; uuid?: string | undefined; useAlertDataForTemplate?: boolean | undefined; } & { id: string; params: Record; actionTypeId: string; group: string; }>[]" + "Readonly<{ frequency?: Readonly<{} & { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; }> | undefined; alertsFilter?: Readonly<{ query?: Readonly<{ dsl?: string | undefined; } & { kql: string; filters: Readonly<{ query?: Record | undefined; $state?: Readonly<{} & { store: \"appState\" | \"globalState\"; }> | undefined; } & { meta: Record; }>[]; }> | undefined; timeframe?: Readonly<{} & { days: (2 | 7 | 6 | 5 | 4 | 3 | 1)[]; hours: Readonly<{} & { start: string; end: string; }>; timezone: string; }> | undefined; } & {}> | undefined; uuid?: string | undefined; useAlertDataForTemplate?: boolean | undefined; } & { id: string; params: Record; actionTypeId: string; group: string; }>[]" ], "path": "x-pack/plugins/alerting/server/application/rule/types/rule.ts", "deprecated": false, @@ -4594,7 +4594,7 @@ "label": "BulkEditOperation", "description": [], "signature": [ - "Readonly<{} & { value: string[]; operation: \"delete\" | \"add\" | \"set\"; field: \"tags\"; }> | Readonly<{} & { value: Readonly<{ frequency?: Readonly<{} & { summary: boolean; throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; }> | undefined; uuid?: string | undefined; } & { id: string; params: Record; group: string; }>[]; operation: \"add\" | \"set\"; field: \"actions\"; }> | Readonly<{} & { value: Readonly<{} & { interval: string; }>; operation: \"set\"; field: \"schedule\"; }> | Readonly<{} & { value: string | null; operation: \"set\"; field: \"throttle\"; }> | Readonly<{} & { value: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; operation: \"set\"; field: \"notifyWhen\"; }> | Readonly<{} & { value: Readonly<{ id?: string | undefined; } & { duration: number; rRule: Readonly<{ count?: number | undefined; interval?: number | undefined; freq?: 0 | 2 | 3 | 1 | undefined; until?: string | undefined; byweekday?: string[] | undefined; bymonthday?: number[] | undefined; bymonth?: number[] | undefined; } & { dtstart: string; tzid: string; }>; }>; operation: \"set\"; field: \"snoozeSchedule\"; }> | Readonly<{ value?: string[] | undefined; } & { operation: \"delete\"; field: \"snoozeSchedule\"; }> | Readonly<{} & { operation: \"set\"; field: \"apiKey\"; }>" + "Readonly<{} & { value: string[]; operation: \"delete\" | \"add\" | \"set\"; field: \"tags\"; }> | Readonly<{} & { value: Readonly<{ frequency?: Readonly<{} & { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; }> | undefined; uuid?: string | undefined; } & { id: string; params: Record; group: string; }>[]; operation: \"add\" | \"set\"; field: \"actions\"; }> | Readonly<{} & { value: Readonly<{} & { interval: string; }>; operation: \"set\"; field: \"schedule\"; }> | Readonly<{} & { value: string | null; operation: \"set\"; field: \"throttle\"; }> | Readonly<{} & { value: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; operation: \"set\"; field: \"notifyWhen\"; }> | Readonly<{} & { value: Readonly<{ id?: string | undefined; } & { duration: number; rRule: Readonly<{ count?: number | undefined; interval?: number | undefined; freq?: 0 | 2 | 3 | 1 | undefined; until?: string | undefined; byweekday?: string[] | undefined; bymonthday?: number[] | undefined; bymonth?: number[] | undefined; } & { dtstart: string; tzid: string; }>; }>; operation: \"set\"; field: \"snoozeSchedule\"; }> | Readonly<{ value?: string[] | undefined; } & { operation: \"delete\"; field: \"snoozeSchedule\"; }> | Readonly<{} & { operation: \"set\"; field: \"apiKey\"; }>" ], "path": "x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/types/bulk_edit_rules_options.ts", "deprecated": false, @@ -5098,7 +5098,7 @@ "section": "def-server.AuditLogger", "text": "AuditLogger" }, - " | undefined; getTags: (params: Readonly<{ search?: string | undefined; perPage?: number | undefined; } & { page: number; }>) => Promise>; getScheduleFrequency: () => Promise>; getAlertFromRaw: (params: ", + " | undefined; getTags: (params: Readonly<{ search?: string | undefined; perPage?: number | undefined; } & { page: number; }>) => Promise>; getScheduleFrequency: () => Promise>; getAlertFromRaw: (params: ", "GetAlertFromRawParams", ") => ", { diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index dcbaa7a49ee95..ed528b091cc6b 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.devdocs.json b/api_docs/apm.devdocs.json index 826a1856a6cee..19c462f335b79 100644 --- a/api_docs/apm.devdocs.json +++ b/api_docs/apm.devdocs.json @@ -1047,7 +1047,7 @@ "IngestGetPipelineResponse", " | undefined; }; diagnosticsPrivileges: { index: Record; cluster: Record; hasAllClusterPrivileges: boolean; hasAllIndexPrivileges: boolean; hasAllPrivileges: boolean; }; apmIndices: Readonly<{} & { error: string; span: string; metric: string; transaction: string; onboarding: string; sourcemap: string; }>; apmIndexTemplates: { name: string; isNonStandard: boolean; exists: boolean; }[]; fleetPackageInfo: { isInstalled: boolean; version?: string | undefined; }; kibanaVersion: string; elasticsearchVersion: string; apmEvents: ", + ">; cluster: Record; hasAllClusterPrivileges: boolean; hasAllIndexPrivileges: boolean; hasAllPrivileges: boolean; }; apmIndices: Readonly<{} & { error: string; transaction: string; span: string; metric: string; onboarding: string; sourcemap: string; }>; apmIndexTemplates: { name: string; isNonStandard: boolean; exists: boolean; }[]; fleetPackageInfo: { isInstalled: boolean; version?: string | undefined; }; kibanaVersion: string; elasticsearchVersion: string; apmEvents: ", "ApmEvent", "[]; invalidIndices?: ", "IndiciesItem", @@ -3993,7 +3993,7 @@ "PartialC", "; }> | undefined; handler: ({}: ", "APMRouteHandlerResources", - " & { params: { body: { readonly error?: string | undefined; readonly span?: string | undefined; readonly metric?: string | undefined; readonly transaction?: string | undefined; readonly onboarding?: string | undefined; readonly sourcemap?: string | undefined; }; }; }) => Promise<", + " & { params: { body: { readonly error?: string | undefined; readonly transaction?: string | undefined; readonly span?: string | undefined; readonly metric?: string | undefined; readonly onboarding?: string | undefined; readonly sourcemap?: string | undefined; }; }; }) => Promise<", { "pluginId": "@kbn/core-saved-objects-common", "scope": "common", @@ -4005,7 +4005,7 @@ "APMRouteCreateOptions", "; \"GET /internal/apm/settings/apm-indices\": { endpoint: \"GET /internal/apm/settings/apm-indices\"; params?: undefined; handler: ({}: ", "APMRouteHandlerResources", - ") => Promise>; } & ", + ") => Promise>; } & ", "APMRouteCreateOptions", "; \"GET /internal/apm/settings/apm-index-settings\": { endpoint: \"GET /internal/apm/settings/apm-index-settings\"; params?: undefined; handler: ({}: ", "APMRouteHandlerResources", @@ -5082,6 +5082,10 @@ "; }>; query: ", "IntersectionC", "<[", + "PartialC", + "<{ searchQuery: ", + "StringC", + "; }>, ", "TypeC", "<{ environment: ", "UnionC", @@ -5103,17 +5107,15 @@ }, ">]>; }>, ", "TypeC", - "<{ kuery: ", - "StringC", - "; }>, ", - "TypeC", "<{ start: ", "Type", "; end: ", "Type", "; }>, ", "TypeC", - "<{ useDurationSummary: ", + "<{ kuery: ", + "StringC", + "; useDurationSummary: ", "Type", "; transactionType: ", "StringC", @@ -5163,7 +5165,7 @@ "RollupInterval", ".None>]>; }>]>; }> | undefined; handler: ({}: ", "APMRouteHandlerResources", - " & { params: { path: { serviceName: string; }; query: { environment: \"ENVIRONMENT_NOT_DEFINED\" | \"ENVIRONMENT_ALL\" | ", + " & { params: { path: { serviceName: string; }; query: { searchQuery?: string | undefined; } & { environment: \"ENVIRONMENT_NOT_DEFINED\" | \"ENVIRONMENT_ALL\" | ", "Branded", "; } & { kuery: string; } & { start: number; end: number; } & { useDurationSummary: boolean; transactionType: string; latencyAggregationType: ", + ">; } & { start: number; end: number; } & { kuery: string; useDurationSummary: boolean; transactionType: string; latencyAggregationType: ", "LatencyAggregationType", "; } & { documentType: ", "ApmDocumentType", @@ -5925,7 +5927,15 @@ "LatencyAggregationType", ".p99>]>; transactionType: ", "StringC", - "; }>, ", + "; sortField: ", + "KeyofC", + "<{ serviceNodeName: null; latency: null; throughput: null; errorRate: null; cpuUsage: null; memoryUsage: null; }>; sortDirection: ", + "UnionC", + "<[", + "LiteralC", + "<\"asc\">, ", + "LiteralC", + "<\"desc\">]>; }>, ", "PartialC", "<{ offset: ", "StringC", @@ -5963,7 +5973,7 @@ "APMRouteHandlerResources", " & { params: { path: { serviceName: string; }; query: { latencyAggregationType: ", "LatencyAggregationType", - "; transactionType: string; } & { offset?: string | undefined; } & { environment: \"ENVIRONMENT_NOT_DEFINED\" | \"ENVIRONMENT_ALL\" | ", + "; transactionType: string; sortField: \"serviceNodeName\" | \"latency\" | \"throughput\" | \"errorRate\" | \"cpuUsage\" | \"memoryUsage\"; sortDirection: \"asc\" | \"desc\"; } & { offset?: string | undefined; } & { environment: \"ENVIRONMENT_NOT_DEFINED\" | \"ENVIRONMENT_ALL\" | ", "Branded", ", ", "IntersectionC", @@ -6643,7 +6655,7 @@ "Type", "; }>]>]>; }> | undefined; handler: ({}: ", "APMRouteHandlerResources", - " & { params: { query: { serviceGroup?: string | undefined; } & { probability: number; } & { documentType: ", + " & { params: { query: { searchQuery?: string | undefined; serviceGroup?: string | undefined; } & { probability: number; } & { documentType: ", "ApmDocumentType", ".TransactionMetric | ", "ApmDocumentType", @@ -7705,9 +7717,9 @@ "section": "def-common.NonEmptyStringBrand", "text": "NonEmptyStringBrand" }, - ">; } & { kuery: string; } & { start: number; end: number; }; }; }) => Promise<{ errorGroups: ", + ">; } & { kuery: string; } & { start: number; end: number; }; }; }) => Promise<", "ErrorGroupMainStatisticsResponse", - "; }>; } & ", + ">; } & ", "APMRouteCreateOptions", "; \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics\": { endpoint: \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics\"; params?: ", "TypeC", @@ -7727,7 +7739,9 @@ "LiteralC", "<\"asc\">, ", "LiteralC", - "<\"desc\">]>; }>, ", + "<\"desc\">]>; searchQuery: ", + "StringC", + "; }>, ", "TypeC", "<{ environment: ", "UnionC", @@ -7759,7 +7773,7 @@ "Type", "; }>]>; }> | undefined; handler: ({}: ", "APMRouteHandlerResources", - " & { params: { path: { serviceName: string; }; query: { sortField?: string | undefined; sortDirection?: \"asc\" | \"desc\" | undefined; } & { environment: \"ENVIRONMENT_NOT_DEFINED\" | \"ENVIRONMENT_ALL\" | ", + " & { params: { path: { serviceName: string; }; query: { sortField?: string | undefined; sortDirection?: \"asc\" | \"desc\" | undefined; searchQuery?: string | undefined; } & { environment: \"ENVIRONMENT_NOT_DEFINED\" | \"ENVIRONMENT_ALL\" | ", "Branded", "; } & { kuery: string; } & { start: number; end: number; }; }; }) => Promise<{ errorGroups: ", + ">; } & { kuery: string; } & { start: number; end: number; }; }; }) => Promise<", "ErrorGroupMainStatisticsResponse", - "; }>; } & ", + ">; } & ", "APMRouteCreateOptions", "; \"GET /internal/apm/environments\": { endpoint: \"GET /internal/apm/environments\"; params?: ", "TypeC", diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index efde419e5b95b..888edf294aef6 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.devdocs.json b/api_docs/apm_data_access.devdocs.json index 8fbb498826123..e9cf99fb8e272 100644 --- a/api_docs/apm_data_access.devdocs.json +++ b/api_docs/apm_data_access.devdocs.json @@ -22,7 +22,7 @@ "label": "APMDataAccessConfig", "description": [], "signature": [ - "{ readonly indices: Readonly<{} & { error: string; span: string; metric: string; transaction: string; onboarding: string; sourcemap: string; }>; }" + "{ readonly indices: Readonly<{} & { error: string; transaction: string; span: string; metric: string; onboarding: string; sourcemap: string; }>; }" ], "path": "x-pack/plugins/apm_data_access/server/index.ts", "deprecated": false, @@ -37,7 +37,7 @@ "label": "APMIndices", "description": [], "signature": [ - "{ readonly error: string; readonly span: string; readonly metric: string; readonly transaction: string; readonly onboarding: string; readonly sourcemap: string; }" + "{ readonly error: string; readonly transaction: string; readonly span: string; readonly metric: string; readonly onboarding: string; readonly sourcemap: string; }" ], "path": "x-pack/plugins/apm_data_access/server/index.ts", "deprecated": false, @@ -65,7 +65,7 @@ "label": "apmIndicesFromConfigFile", "description": [], "signature": [ - "{ readonly error: string; readonly span: string; readonly metric: string; readonly transaction: string; readonly onboarding: string; readonly sourcemap: string; }" + "{ readonly error: string; readonly transaction: string; readonly span: string; readonly metric: string; readonly onboarding: string; readonly sourcemap: string; }" ], "path": "x-pack/plugins/apm_data_access/server/types.ts", "deprecated": false, @@ -87,7 +87,7 @@ "section": "def-common.SavedObjectsClientContract", "text": "SavedObjectsClientContract" }, - ") => Promise>" + ") => Promise>" ], "path": "x-pack/plugins/apm_data_access/server/types.ts", "deprecated": false, diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 36247a4355b05..39a80d73eec57 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx index e7c9ad4071bbb..0dbf60da5d767 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 901a469efa137..3a757a94802d1 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 5e4e98764f00c..d71d9abad6eae 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index a29b6e2338b64..4da33897d5e47 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.devdocs.json b/api_docs/cases.devdocs.json index 96bad19d030d8..ba2cfe692c048 100644 --- a/api_docs/cases.devdocs.json +++ b/api_docs/cases.devdocs.json @@ -512,7 +512,7 @@ "section": "def-common.CaseSeverity", "text": "CaseSeverity" }, - "[] | undefined; assignees?: string | string[] | undefined; reporters?: string | string[] | undefined; defaultSearchOperator?: \"AND\" | \"OR\" | undefined; from?: string | undefined; search?: string | undefined; searchFields?: \"title\" | \"description\" | (\"title\" | \"description\")[] | undefined; sortField?: \"title\" | \"category\" | \"createdAt\" | \"updatedAt\" | \"status\" | \"severity\" | \"closedAt\" | undefined; sortOrder?: \"asc\" | \"desc\" | undefined; to?: string | undefined; owner?: string | string[] | undefined; category?: string | string[] | undefined; } & Partial<", + "[] | undefined; assignees?: string | string[] | undefined; reporters?: string | string[] | undefined; defaultSearchOperator?: \"AND\" | \"OR\" | undefined; from?: string | undefined; search?: string | undefined; searchFields?: \"title\" | \"description\" | (\"title\" | \"description\")[] | undefined; sortField?: \"title\" | \"createdAt\" | \"updatedAt\" | \"category\" | \"status\" | \"severity\" | \"closedAt\" | undefined; sortOrder?: \"asc\" | \"desc\" | undefined; to?: string | undefined; owner?: string | string[] | undefined; category?: string | string[] | undefined; } & Partial<", "Pagination", ">, signal?: AbortSignal | undefined) => Promise<", { diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index f44905ac92032..06725ee1b28f1 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index abd2c4a1e2e03..45d156eb590b6 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index 6b4d45502a8b4..de52ed6a3fa9d 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index ea668277e1728..08b49cb93d7c3 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index f3fcfb68df8f8..e8f1bfbcfac5b 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index 13efe49e68fd7..ed300cb2090fe 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments'] --- import cloudExperimentsObj from './cloud_experiments.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index 81365f8459915..0ee0eefdefa0c 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.devdocs.json b/api_docs/console.devdocs.json index c1de41890cb4e..b12dc9c4e02bb 100644 --- a/api_docs/console.devdocs.json +++ b/api_docs/console.devdocs.json @@ -185,15 +185,14 @@ "section": "def-public.AppStartUIPluginDependencies", "text": "AppStartUIPluginDependencies" }, - ") => { renderEmbeddableConsole: (props: ", + ") => ", { "pluginId": "console", "scope": "public", "docId": "kibConsolePluginApi", - "section": "def-public.EmbeddableConsoleProps", - "text": "EmbeddableConsoleProps" - }, - ") => React.ReactElement> | null; } | { renderEmbeddableConsole?: undefined; }" + "section": "def-public.ConsolePluginStart", + "text": "ConsolePluginStart" + } ], "path": "src/plugins/console/public/plugin.ts", "deprecated": false, diff --git a/api_docs/console.mdx b/api_docs/console.mdx index ac5867264ff7c..df17519fb3502 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index 6734745e67c63..833a3245f2e0f 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.devdocs.json b/api_docs/controls.devdocs.json index ca34f2c954ae9..ff88942354ddb 100644 --- a/api_docs/controls.devdocs.json +++ b/api_docs/controls.devdocs.json @@ -78,6 +78,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupContainer.diffingSubscription", + "type": "Object", + "tags": [], + "label": "diffingSubscription", + "description": [], + "signature": [ + "Subscription" + ], + "path": "src/plugins/controls/public/control_group/embeddable/control_group_container.tsx", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "controls", "id": "def-public.ControlGroupContainer.select", @@ -167,7 +181,15 @@ "label": "dispatch", "description": [], "signature": [ - "{ setControlStyle: (payload: ", + "{ setLastSavedInput: (payload: ", + { + "pluginId": "controls", + "scope": "common", + "docId": "kibControlsPluginApi", + "section": "def-common.PersistableControlGroupInput", + "text": "PersistableControlGroupInput" + }, + ") => void; setControlStyle: (payload: ", "ControlStyle", ") => void; setChainingSystem: (payload: ", "ControlGroupChainingSystem", @@ -265,6 +287,31 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupContainer.unsavedChanges", + "type": "Object", + "tags": [], + "label": "unsavedChanges", + "description": [ + "This currently reports the **entire** persistable control group input on unsaved changes" + ], + "signature": [ + "BehaviorSubject", + "<", + { + "pluginId": "controls", + "scope": "common", + "docId": "kibControlsPluginApi", + "section": "def-common.PersistableControlGroupInput", + "text": "PersistableControlGroupInput" + }, + " | undefined>" + ], + "path": "src/plugins/controls/public/control_group/embeddable/control_group_container.tsx", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "controls", "id": "def-public.ControlGroupContainer.fieldFilterPredicate", @@ -377,12 +424,12 @@ { "parentPluginId": "controls", "id": "def-public.ControlGroupContainer.Unnamed.$4", - "type": "Object", + "type": "CompoundType", "tags": [], - "label": "settings", + "label": "initialComponentState", "description": [], "signature": [ - "ControlGroupSettings", + "ControlGroupComponentState", " | undefined" ], "path": "src/plugins/controls/public/control_group/embeddable/control_group_container.tsx", @@ -409,6 +456,46 @@ ], "returnComment": [] }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupContainer.resetToLastSavedState", + "type": "Function", + "tags": [], + "label": "resetToLastSavedState", + "description": [], + "signature": [ + "() => void" + ], + "path": "src/plugins/controls/public/control_group/embeddable/control_group_container.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupContainer.getPersistableInput", + "type": "Function", + "tags": [], + "label": "getPersistableInput", + "description": [], + "signature": [ + "() => Pick, \"id\" | \"controlStyle\" | \"ignoreParentSettings\" | \"panels\" | \"chainingSystem\">" + ], + "path": "src/plugins/controls/public/control_group/embeddable/control_group_container.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, { "parentPluginId": "controls", "id": "def-public.ControlGroupContainer.updateInputAndReinitialize", @@ -1660,8 +1747,8 @@ "section": "def-public.ContainerOutput", "text": "ContainerOutput" }, - "> | undefined, settings?: ", - "ControlGroupSettings", + "> | undefined, initialComponentState?: ", + "ControlGroupComponentState", " | undefined, fieldFilterPredicate?: ", "FieldFilterPredicate", " | undefined) => Promise<", @@ -1740,12 +1827,12 @@ { "parentPluginId": "controls", "id": "def-public.ControlGroupContainerFactory.create.$3", - "type": "Object", + "type": "CompoundType", "tags": [], - "label": "settings", + "label": "initialComponentState", "description": [], "signature": [ - "ControlGroupSettings", + "ControlGroupComponentState", " | undefined" ], "path": "src/plugins/controls/public/control_group/embeddable/control_group_container_factory.ts", @@ -6132,6 +6219,30 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "controls", + "id": "def-common.getDefaultControlGroupPersistableInput", + "type": "Function", + "tags": [], + "label": "getDefaultControlGroupPersistableInput", + "description": [], + "signature": [ + "() => ", + { + "pluginId": "controls", + "scope": "common", + "docId": "kibControlsPluginApi", + "section": "def-common.PersistableControlGroupInput", + "text": "PersistableControlGroupInput" + } + ], + "path": "src/plugins/controls/common/control_group/control_group_persistence.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "controls", "id": "def-common.persistableControlGroupInputIsEqual", @@ -7099,17 +7210,13 @@ "type": "Type", "tags": [], "label": "PersistableControlGroupInput", - "description": [ - "\nOnly parts of the Control Group Input should be persisted" - ], + "description": [], "signature": [ "{ controlStyle: ", "ControlStyle", "; ignoreParentSettings?: ", "ParentIgnoreSettings", - " | undefined; chainingSystem: ", - "ControlGroupChainingSystem", - "; panels: ", + " | undefined; panels: ", { "pluginId": "controls", "scope": "common", @@ -7117,6 +7224,8 @@ "section": "def-common.ControlsPanels", "text": "ControlsPanels" }, + "; chainingSystem: ", + "ControlGroupChainingSystem", "; }" ], "path": "src/plugins/controls/common/control_group/types.ts", @@ -7124,6 +7233,23 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "controls", + "id": "def-common.persistableControlGroupInputKeys", + "type": "Array", + "tags": [], + "label": "persistableControlGroupInputKeys", + "description": [ + "\nOnly parts of the Control Group Input should be persisted" + ], + "signature": [ + "(\"controlStyle\" | \"ignoreParentSettings\" | \"panels\" | \"chainingSystem\")[]" + ], + "path": "src/plugins/controls/common/control_group/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "controls", "id": "def-common.RANGE_SLIDER_CONTROL", diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index e8075c2dd518c..27c914898a0e4 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 311 | 0 | 304 | 16 | +| 317 | 0 | 309 | 16 | ## Client diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 1d3bd260c24a9..59e036ba6ca42 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.devdocs.json b/api_docs/dashboard.devdocs.json index 84ab20dde07f6..8a5e494119338 100644 --- a/api_docs/dashboard.devdocs.json +++ b/api_docs/dashboard.devdocs.json @@ -319,13 +319,7 @@ "description": [], "signature": [ "(() => Partial<", - { - "pluginId": "dashboard", - "scope": "common", - "docId": "kibDashboardPluginApi", - "section": "def-common.DashboardContainerInput", - "text": "DashboardContainerInput" - }, + "SavedDashboardInput", ">) | undefined" ], "path": "src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container_factory.tsx", @@ -1739,27 +1733,6 @@ "deprecated": false, "trackAdoption": false }, - { - "parentPluginId": "dashboard", - "id": "def-common.DashboardContainerInput.controlGroupInput", - "type": "Object", - "tags": [], - "label": "controlGroupInput", - "description": [], - "signature": [ - { - "pluginId": "controls", - "scope": "common", - "docId": "kibControlsPluginApi", - "section": "def-common.PersistableControlGroupInput", - "text": "PersistableControlGroupInput" - }, - " | undefined" - ], - "path": "src/plugins/dashboard/common/dashboard_container/types.ts", - "deprecated": false, - "trackAdoption": false - }, { "parentPluginId": "dashboard", "id": "def-common.DashboardContainerInput.panels", @@ -2037,7 +2010,7 @@ "\nFor BWC reasons, dashboard state is stored with panels as an array instead of a map" ], "signature": [ - "{ id?: string | undefined; tags?: string[] | undefined; title?: string | undefined; description?: string | undefined; version?: string | undefined; query?: ", + "{ id?: string | undefined; tags?: string[] | undefined; title?: string | undefined; version?: string | undefined; query?: ", { "pluginId": "@kbn/es-query", "scope": "common", @@ -2053,7 +2026,7 @@ "section": "def-common.Filter", "text": "Filter" }, - "[] | undefined; refreshInterval?: ", + "[] | undefined; description?: string | undefined; refreshInterval?: ", { "pluginId": "data", "scope": "common", @@ -2093,15 +2066,7 @@ "section": "def-common.TimeRange", "text": "TimeRange" }, - " | undefined; timeslice?: [number, number] | undefined; controlGroupInput?: ", - { - "pluginId": "controls", - "scope": "common", - "docId": "kibControlsPluginApi", - "section": "def-common.PersistableControlGroupInput", - "text": "PersistableControlGroupInput" - }, - " | undefined; isEmbeddedExternally?: boolean | undefined; timeRestore?: boolean | undefined; useMargins?: boolean | undefined; panels?: ", + " | undefined; timeslice?: [number, number] | undefined; isEmbeddedExternally?: boolean | undefined; timeRestore?: boolean | undefined; useMargins?: boolean | undefined; panels?: ", "SavedDashboardPanel", "[] | undefined; }" ], diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 4d40665e74633..d2735fed17ed9 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 109 | 0 | 106 | 11 | +| 108 | 0 | 105 | 12 | ## Client diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index e0cbf930ea341..98f424d0dee73 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.devdocs.json b/api_docs/data.devdocs.json index 4fa861ea50f7c..ee1069ba27f3f 100644 --- a/api_docs/data.devdocs.json +++ b/api_docs/data.devdocs.json @@ -9262,7 +9262,7 @@ "section": "def-common.SerializableRecord", "text": "SerializableRecord" }, - " | undefined; schema?: string | undefined; enabled?: boolean | undefined; }" + " | undefined; enabled?: boolean | undefined; schema?: string | undefined; }" ], "path": "src/plugins/data/common/search/aggs/agg_config.ts", "deprecated": false, diff --git a/api_docs/data.mdx b/api_docs/data.mdx index f54fee931babc..076fdfc33b5cc 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3233 | 31 | 2582 | 23 | +| 3234 | 31 | 2583 | 23 | ## Client diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 237d49f8062cd..272c64f44cd7d 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3233 | 31 | 2582 | 23 | +| 3234 | 31 | 2583 | 23 | ## Client diff --git a/api_docs/data_search.devdocs.json b/api_docs/data_search.devdocs.json index d8432bd6b08a1..d05fccecd35ff 100644 --- a/api_docs/data_search.devdocs.json +++ b/api_docs/data_search.devdocs.json @@ -30763,7 +30763,7 @@ "section": "def-common.SerializableRecord", "text": "SerializableRecord" }, - " | undefined; schema?: string | undefined; enabled?: boolean | undefined; }" + " | undefined; enabled?: boolean | undefined; schema?: string | undefined; }" ], "path": "src/plugins/data/common/search/aggs/agg_config.ts", "deprecated": false, @@ -31712,7 +31712,7 @@ "section": "def-common.SerializableRecord", "text": "SerializableRecord" }, - " | undefined; schema?: string | undefined; enabled?: boolean | undefined; }" + " | undefined; enabled?: boolean | undefined; schema?: string | undefined; }" ], "path": "src/plugins/data/common/search/aggs/agg_configs.ts", "deprecated": false, @@ -31990,6 +31990,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.ESQL_ASYNC_SEARCH_STRATEGY", + "type": "string", + "tags": [], + "label": "ESQL_ASYNC_SEARCH_STRATEGY", + "description": [], + "signature": [ + "\"esql_async\"" + ], + "path": "src/plugins/data/common/search/strategies/esql_search/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.ESQL_SEARCH_STRATEGY", diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index c9ed1a59b5450..26a5aa0a3b4bf 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3233 | 31 | 2582 | 23 | +| 3234 | 31 | 2583 | 23 | ## Client diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index cf806d08ea16f..a9fac37ba4970 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index e1cf0575200f7..45811369e0a87 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index 4d00d33530f4c..9a58da77375ff 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.devdocs.json b/api_docs/data_views.devdocs.json index e4387c24f3d9e..08b4ffad98fc3 100644 --- a/api_docs/data_views.devdocs.json +++ b/api_docs/data_views.devdocs.json @@ -16545,7 +16545,7 @@ "signature": [ "Pick<", "Toast", - ", \"prefix\" | \"defaultValue\" | \"security\" | \"children\" | \"slot\" | \"style\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"spellCheck\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"iconType\" | \"onClose\" | \"toastLifeTimeMs\"> & { title?: string | ", + ", \"prefix\" | \"defaultValue\" | \"security\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"iconType\" | \"onClose\" | \"toastLifeTimeMs\"> & { title?: string | ", { "pluginId": "@kbn/core-mount-utils-browser", "scope": "common", @@ -21135,7 +21135,7 @@ "signature": [ "Pick<", "Toast", - ", \"prefix\" | \"defaultValue\" | \"security\" | \"children\" | \"slot\" | \"style\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"spellCheck\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"iconType\" | \"onClose\" | \"toastLifeTimeMs\"> & { title?: string | ", + ", \"prefix\" | \"defaultValue\" | \"security\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"iconType\" | \"onClose\" | \"toastLifeTimeMs\"> & { title?: string | ", { "pluginId": "@kbn/core-mount-utils-browser", "scope": "common", diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 70ff5ae83d530..f709d47800a12 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 8d1d9686a08f3..3e5b927fcfa05 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index 74ac1f4f80c9a..32d88c42b5b55 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index b48571204af97..66dcc11c639da 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -17,7 +17,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Referencing plugin(s) | Remove By | | ---------------|-----------|-----------| | | ml, stackAlerts | - | -| | share, uiActions, guidedOnboarding, home, serverless, management, spaces, savedObjects, indexManagement, devTools, console, visualizations, dashboard, savedObjectsTagging, expressionXY, lens, expressionMetricVis, expressionGauge, security, alerting, triggersActionsUi, cases, aiops, licenseManagement, advancedSettings, maps, dataVisualizer, ml, exploratoryView, fleet, metricsDataAccess, osquery, ingestPipelines, profiling, apm, expressionImage, expressionMetric, expressionError, expressionRevealImage, expressionRepeatImage, expressionShape, crossClusterReplication, graph, grokdebugger, indexLifecycleManagement, infra, logstash, monitoring, observabilityOnboarding, painlessLab, remoteClusters, rollup, searchprofiler, newsfeed, securitySolution, snapshotRestore, synthetics, transform, upgradeAssistant, uptime, ux, watcher, cloudDataMigration, filesManagement, kibanaOverview, visDefaultEditor, expressionHeatmap, expressionLegacyMetricVis, expressionPartitionVis, expressionTagcloud, visTypeTable, visTypeTimelion, visTypeTimeseries, visTypeVega, visTypeVislib | - | +| | share, uiActions, guidedOnboarding, home, serverless, management, spaces, savedObjects, indexManagement, devTools, console, visualizations, dashboard, savedObjectsTagging, expressionXY, lens, expressionMetricVis, expressionGauge, security, alerting, triggersActionsUi, cases, aiops, licenseManagement, maps, dataVisualizer, ml, exploratoryView, fleet, metricsDataAccess, osquery, ingestPipelines, profiling, apm, expressionImage, expressionMetric, expressionError, expressionRevealImage, expressionRepeatImage, expressionShape, crossClusterReplication, graph, grokdebugger, indexLifecycleManagement, infra, logstash, monitoring, observabilityOnboarding, painlessLab, remoteClusters, rollup, searchprofiler, newsfeed, securitySolution, snapshotRestore, synthetics, transform, upgradeAssistant, uptime, ux, watcher, cloudDataMigration, filesManagement, kibanaOverview, visDefaultEditor, expressionHeatmap, expressionLegacyMetricVis, expressionPartitionVis, expressionTagcloud, visTypeTable, visTypeTimelion, visTypeTimeseries, visTypeVega, visTypeVislib | - | | | encryptedSavedObjects, actions, data, ml, logstash, securitySolution, cloudChat | - | | | actions, ml, savedObjectsTagging, enterpriseSearch | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core, savedObjects, visualizations, aiops, ml, dataVisualizer, dashboardEnhanced, graph, lens, securitySolution, eventAnnotation, @kbn/core-saved-objects-browser-mocks | - | @@ -27,8 +27,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | dashboard, dataVisualizer, stackAlerts, expressionPartitionVis | - | | | stackAlerts, alerting, securitySolution, inputControlVis | - | | | triggersActionsUi | - | -| | inspector, data, savedObjects, console, runtimeFields, indexManagement, dataViewEditor, unifiedSearch, embeddable, visualizations, dashboard, licensing, savedObjectsTagging, dataViewFieldEditor, lens, security, triggersActionsUi, cases, observabilityShared, telemetry, advancedSettings, maps, exploratoryView, fleet, timelines, banners, reporting, cloudSecurityPosture, dashboardEnhanced, imageEmbeddable, graph, monitoring, securitySolution, synthetics, uptime, cloudLinks, dataViewManagement, eventAnnotationListing, filesManagement, uiActions, visTypeVislib | - | -| | @kbn/core, visualizations, triggersActionsUi, advancedSettings | - | +| | inspector, data, savedObjects, console, runtimeFields, indexManagement, dataViewEditor, unifiedSearch, embeddable, visualizations, dashboard, licensing, savedObjectsTagging, dataViewFieldEditor, lens, security, triggersActionsUi, cases, observabilityShared, telemetry, maps, exploratoryView, fleet, timelines, banners, reporting, cloudSecurityPosture, dashboardEnhanced, imageEmbeddable, graph, monitoring, securitySolution, synthetics, uptime, cloudLinks, dataViewManagement, eventAnnotationListing, filesManagement, uiActions, visTypeVislib | - | +| | @kbn/core, visualizations, triggersActionsUi | - | | | ruleRegistry, observability, infra, securitySolution, synthetics, uptime | - | | | alerting, discover, securitySolution | - | | | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, fleet, graph, lists, osquery, securitySolution, alerting | - | @@ -61,7 +61,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | data, discover, imageEmbeddable, embeddable | - | | | @kbn/core-plugins-browser-internal, @kbn/core-root-browser-internal, home, savedObjects, unifiedSearch, visualizations, fileUpload, dashboardEnhanced, transform, dashboard, discover, dataVisualizer | - | | | @kbn/core-saved-objects-browser-mocks, discover, @kbn/core-saved-objects-browser-internal | - | -| | @kbn/management-settings-field-definition, advancedSettings, discover | - | +| | @kbn/management-settings-field-definition, discover | - | | | monitoring | - | | | @kbn/core-saved-objects-api-browser, @kbn/core, savedObjects, savedObjectsManagement, visualizations, savedObjectsTagging, eventAnnotation, lens, graph, dashboard, savedObjectsTaggingOss, kibanaUtils, expressions, data, embeddable, controls, uiActionsEnhanced, maps, canvas, dashboardEnhanced, globalSearchProviders | - | | | @kbn/core-saved-objects-browser, @kbn/core-saved-objects-browser-internal, @kbn/core, home, savedObjects, visualizations, lens, visTypeTimeseries, @kbn/core-saved-objects-browser-mocks | - | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index f269d46230862..2abcbc4d4b525 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -342,17 +342,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] -## advancedSettings - -| Deprecated API | Reference location(s) | Remove By | -| ---------------|-----------|-----------| -| | [form.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/advanced_settings/public/management_app/components/form/form.tsx#:~:text=toMountPoint), [form.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/advanced_settings/public/management_app/components/form/form.tsx#:~:text=toMountPoint) | - | -| | [form.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/advanced_settings/public/management_app/components/form/form.tsx#:~:text=KibanaThemeProvider), [form.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/advanced_settings/public/management_app/components/form/form.tsx#:~:text=KibanaThemeProvider), [form.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/advanced_settings/public/management_app/components/form/form.tsx#:~:text=KibanaThemeProvider) | - | -| | [to_editable_config.ts](https://github.com/elastic/kibana/tree/main/src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts#:~:text=SavedObjectAttribute), [to_editable_config.ts](https://github.com/elastic/kibana/tree/main/src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts#:~:text=SavedObjectAttribute) | - | -| | [to_editable_config.ts](https://github.com/elastic/kibana/tree/main/src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts#:~:text=metric) | - | - - - ## aiops | Deprecated API | Reference location(s) | Remove By | @@ -466,7 +455,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [overview_tab.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/overview_tab.tsx#:~:text=indexPatternId) | - | -| | [take_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx#:~:text=toMountPoint), [take_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx#:~:text=toMountPoint) | - | +| | [take_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx#:~:text=toMountPoint), [take_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx#:~:text=toMountPoint), [take_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx#:~:text=toMountPoint) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index c16f4b5ec9cbd..880f93de880fe 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 897fe31347103..bc10cfae66734 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 2f426db5298e5..aaad1b08667f9 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 736e6e9d99a13..7d0a32bd7f137 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index 6d1047b0c722c..8f07e07542e5e 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index 9bebddea85c61..a2ba3feb54116 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.devdocs.json b/api_docs/embeddable.devdocs.json index 12d08b0a22894..f8c22cbbb6e89 100644 --- a/api_docs/embeddable.devdocs.json +++ b/api_docs/embeddable.devdocs.json @@ -11988,7 +11988,7 @@ "\nRenders the embeddable at the given node." ], "signature": [ - "(domNode: Element | HTMLElement) => void | N" + "(domNode: HTMLElement | Element) => void | N" ], "path": "src/plugins/embeddable/public/lib/embeddables/i_embeddable.ts", "deprecated": false, @@ -12002,7 +12002,7 @@ "label": "domNode", "description": [], "signature": [ - "Element | HTMLElement" + "HTMLElement | Element" ], "path": "src/plugins/embeddable/public/lib/embeddables/i_embeddable.ts", "deprecated": false, @@ -12032,7 +12032,7 @@ "section": "def-common.ErrorLike", "text": "ErrorLike" }, - ", domNode: Element | HTMLElement) => N | (() => void)) | undefined" + ", domNode: HTMLElement | Element) => N | (() => void)) | undefined" ], "path": "src/plugins/embeddable/public/lib/embeddables/i_embeddable.ts", "deprecated": false, @@ -12067,7 +12067,7 @@ "label": "domNode", "description": [], "signature": [ - "Element | HTMLElement" + "HTMLElement | Element" ], "path": "src/plugins/embeddable/public/lib/embeddables/i_embeddable.ts", "deprecated": false, diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index eeb81cd10b66e..a2bb914ef1085 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index eb021a8215421..cac96c3fb2ac6 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index 97cc8e4183c65..d85e67968cdd0 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index b0fc143dd4a91..80af58ca60ce4 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 013cb39590a01..42cb89e4cbb1e 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.devdocs.json b/api_docs/event_annotation.devdocs.json index 767d950210c22..1f5334176836c 100644 --- a/api_docs/event_annotation.devdocs.json +++ b/api_docs/event_annotation.devdocs.json @@ -1911,7 +1911,7 @@ "label": "options", "description": [], "signature": [ - "(\"alert\" | \"circle\" | \"tag\" | \"asterisk\" | \"bell\" | \"bolt\" | \"bug\" | \"editorComment\" | \"flag\" | \"heart\" | \"mapMarker\" | \"pinFilled\" | \"starEmpty\" | \"starFilled\" | \"triangle\")[]" + "(\"alert\" | \"tag\" | \"asterisk\" | \"bell\" | \"bolt\" | \"bug\" | \"editorComment\" | \"flag\" | \"heart\" | \"mapMarker\" | \"pinFilled\" | \"starEmpty\" | \"starFilled\" | \"circle\" | \"triangle\")[]" ], "path": "src/plugins/event_annotation/common/manual_event_annotation/index.ts", "deprecated": false, @@ -3033,7 +3033,7 @@ "label": "options", "description": [], "signature": [ - "(\"alert\" | \"circle\" | \"tag\" | \"asterisk\" | \"bell\" | \"bolt\" | \"bug\" | \"editorComment\" | \"flag\" | \"heart\" | \"mapMarker\" | \"pinFilled\" | \"starEmpty\" | \"starFilled\" | \"triangle\")[]" + "(\"alert\" | \"tag\" | \"asterisk\" | \"bell\" | \"bolt\" | \"bug\" | \"editorComment\" | \"flag\" | \"heart\" | \"mapMarker\" | \"pinFilled\" | \"starEmpty\" | \"starFilled\" | \"circle\" | \"triangle\")[]" ], "path": "src/plugins/event_annotation/common/query_point_event_annotation/index.ts", "deprecated": false, diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index ec57f62e0c8e9..16f16e0d0be50 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index 4810eb7ec6de1..f7e16018dccab 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.devdocs.json b/api_docs/event_log.devdocs.json index 5c0544398dadb..cbb17ce11942b 100644 --- a/api_docs/event_log.devdocs.json +++ b/api_docs/event_log.devdocs.json @@ -1450,7 +1450,7 @@ "label": "data", "description": [], "signature": [ - "(Readonly<{ log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; message?: string | undefined; tags?: string[] | undefined; rule?: Readonly<{ id?: string | undefined; name?: string | undefined; license?: string | undefined; description?: string | undefined; category?: string | undefined; uuid?: string | undefined; version?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; } & {}> | undefined; kibana?: Readonly<{ action?: Readonly<{ id?: string | undefined; name?: string | undefined; execution?: Readonly<{ source?: string | undefined; uuid?: string | undefined; gen_ai?: Readonly<{ usage?: Readonly<{ prompt_tokens?: string | number | undefined; completion_tokens?: string | number | undefined; total_tokens?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; alerting?: Readonly<{ summary?: Readonly<{ recovered?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; new?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; ongoing?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; outcome?: string | undefined; status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; revision?: string | number | undefined; execution?: Readonly<{ uuid?: string | undefined; status?: string | undefined; metrics?: Readonly<{ total_search_duration_ms?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_searches?: string | number | undefined; es_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; rule_type_run_duration_ms?: string | number | undefined; process_alerts_duration_ms?: string | number | undefined; trigger_actions_duration_ms?: string | number | undefined; process_rule_duration_ms?: string | number | undefined; claim_to_start_duration_ms?: string | number | undefined; persist_alerts_duration_ms?: string | number | undefined; prepare_rule_duration_ms?: string | number | undefined; total_run_duration_ms?: string | number | undefined; total_enrichment_duration_ms?: string | number | undefined; } & {}> | undefined; status_order?: string | number | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; uuid?: string | undefined; flapping?: boolean | undefined; maintenance_window_ids?: string[] | undefined; } & {}> | undefined; version?: string | undefined; server_uuid?: string | undefined; task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; space_agnostic?: boolean | undefined; } & {}>[] | undefined; space_ids?: string[] | undefined; } & {}> | undefined; event?: Readonly<{ type?: string[] | undefined; reason?: string | undefined; action?: string | undefined; id?: string | undefined; start?: string | undefined; end?: string | undefined; code?: string | undefined; category?: string[] | undefined; outcome?: string | undefined; duration?: string | number | undefined; timezone?: string | undefined; risk_score?: number | undefined; severity?: string | number | undefined; url?: string | undefined; created?: string | undefined; dataset?: string | undefined; hash?: string | undefined; ingested?: string | undefined; kind?: string | undefined; module?: string | undefined; original?: string | undefined; provider?: string | undefined; reference?: string | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; user?: Readonly<{ id?: string | undefined; name?: string | undefined; } & {}> | undefined; } & {}> | undefined)[]" + "(Readonly<{ log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; message?: string | undefined; tags?: string[] | undefined; rule?: Readonly<{ id?: string | undefined; name?: string | undefined; license?: string | undefined; uuid?: string | undefined; version?: string | undefined; category?: string | undefined; description?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; } & {}> | undefined; kibana?: Readonly<{ action?: Readonly<{ id?: string | undefined; name?: string | undefined; execution?: Readonly<{ source?: string | undefined; uuid?: string | undefined; gen_ai?: Readonly<{ usage?: Readonly<{ prompt_tokens?: string | number | undefined; completion_tokens?: string | number | undefined; total_tokens?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; alerting?: Readonly<{ outcome?: string | undefined; summary?: Readonly<{ recovered?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; new?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; ongoing?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; revision?: string | number | undefined; execution?: Readonly<{ uuid?: string | undefined; status?: string | undefined; metrics?: Readonly<{ total_search_duration_ms?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_searches?: string | number | undefined; es_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; rule_type_run_duration_ms?: string | number | undefined; process_alerts_duration_ms?: string | number | undefined; trigger_actions_duration_ms?: string | number | undefined; process_rule_duration_ms?: string | number | undefined; claim_to_start_duration_ms?: string | number | undefined; persist_alerts_duration_ms?: string | number | undefined; prepare_rule_duration_ms?: string | number | undefined; total_run_duration_ms?: string | number | undefined; total_enrichment_duration_ms?: string | number | undefined; } & {}> | undefined; status_order?: string | number | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; uuid?: string | undefined; flapping?: boolean | undefined; maintenance_window_ids?: string[] | undefined; } & {}> | undefined; version?: string | undefined; server_uuid?: string | undefined; task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; space_agnostic?: boolean | undefined; } & {}>[] | undefined; space_ids?: string[] | undefined; } & {}> | undefined; event?: Readonly<{ type?: string[] | undefined; reason?: string | undefined; action?: string | undefined; id?: string | undefined; start?: string | undefined; end?: string | undefined; outcome?: string | undefined; category?: string[] | undefined; duration?: string | number | undefined; timezone?: string | undefined; risk_score?: number | undefined; severity?: string | number | undefined; url?: string | undefined; created?: string | undefined; dataset?: string | undefined; code?: string | undefined; hash?: string | undefined; ingested?: string | undefined; kind?: string | undefined; module?: string | undefined; original?: string | undefined; provider?: string | undefined; reference?: string | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; user?: Readonly<{ id?: string | undefined; name?: string | undefined; } & {}> | undefined; } & {}> | undefined)[]" ], "path": "x-pack/plugins/event_log/server/es/cluster_client_adapter.ts", "deprecated": false, @@ -1470,7 +1470,7 @@ "label": "IEvent", "description": [], "signature": [ - "DeepPartial | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; message?: string | undefined; tags?: string[] | undefined; rule?: Readonly<{ id?: string | undefined; name?: string | undefined; license?: string | undefined; description?: string | undefined; category?: string | undefined; uuid?: string | undefined; version?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; } & {}> | undefined; kibana?: Readonly<{ action?: Readonly<{ id?: string | undefined; name?: string | undefined; execution?: Readonly<{ source?: string | undefined; uuid?: string | undefined; gen_ai?: Readonly<{ usage?: Readonly<{ prompt_tokens?: string | number | undefined; completion_tokens?: string | number | undefined; total_tokens?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; alerting?: Readonly<{ summary?: Readonly<{ recovered?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; new?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; ongoing?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; outcome?: string | undefined; status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; revision?: string | number | undefined; execution?: Readonly<{ uuid?: string | undefined; status?: string | undefined; metrics?: Readonly<{ total_search_duration_ms?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_searches?: string | number | undefined; es_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; rule_type_run_duration_ms?: string | number | undefined; process_alerts_duration_ms?: string | number | undefined; trigger_actions_duration_ms?: string | number | undefined; process_rule_duration_ms?: string | number | undefined; claim_to_start_duration_ms?: string | number | undefined; persist_alerts_duration_ms?: string | number | undefined; prepare_rule_duration_ms?: string | number | undefined; total_run_duration_ms?: string | number | undefined; total_enrichment_duration_ms?: string | number | undefined; } & {}> | undefined; status_order?: string | number | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; uuid?: string | undefined; flapping?: boolean | undefined; maintenance_window_ids?: string[] | undefined; } & {}> | undefined; version?: string | undefined; server_uuid?: string | undefined; task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; space_agnostic?: boolean | undefined; } & {}>[] | undefined; space_ids?: string[] | undefined; } & {}> | undefined; event?: Readonly<{ type?: string[] | undefined; reason?: string | undefined; action?: string | undefined; id?: string | undefined; start?: string | undefined; end?: string | undefined; code?: string | undefined; category?: string[] | undefined; outcome?: string | undefined; duration?: string | number | undefined; timezone?: string | undefined; risk_score?: number | undefined; severity?: string | number | undefined; url?: string | undefined; created?: string | undefined; dataset?: string | undefined; hash?: string | undefined; ingested?: string | undefined; kind?: string | undefined; module?: string | undefined; original?: string | undefined; provider?: string | undefined; reference?: string | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; user?: Readonly<{ id?: string | undefined; name?: string | undefined; } & {}> | undefined; } & {}>>> | undefined" + "DeepPartial | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; message?: string | undefined; tags?: string[] | undefined; rule?: Readonly<{ id?: string | undefined; name?: string | undefined; license?: string | undefined; uuid?: string | undefined; version?: string | undefined; category?: string | undefined; description?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; } & {}> | undefined; kibana?: Readonly<{ action?: Readonly<{ id?: string | undefined; name?: string | undefined; execution?: Readonly<{ source?: string | undefined; uuid?: string | undefined; gen_ai?: Readonly<{ usage?: Readonly<{ prompt_tokens?: string | number | undefined; completion_tokens?: string | number | undefined; total_tokens?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; alerting?: Readonly<{ outcome?: string | undefined; summary?: Readonly<{ recovered?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; new?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; ongoing?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; revision?: string | number | undefined; execution?: Readonly<{ uuid?: string | undefined; status?: string | undefined; metrics?: Readonly<{ total_search_duration_ms?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_searches?: string | number | undefined; es_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; rule_type_run_duration_ms?: string | number | undefined; process_alerts_duration_ms?: string | number | undefined; trigger_actions_duration_ms?: string | number | undefined; process_rule_duration_ms?: string | number | undefined; claim_to_start_duration_ms?: string | number | undefined; persist_alerts_duration_ms?: string | number | undefined; prepare_rule_duration_ms?: string | number | undefined; total_run_duration_ms?: string | number | undefined; total_enrichment_duration_ms?: string | number | undefined; } & {}> | undefined; status_order?: string | number | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; uuid?: string | undefined; flapping?: boolean | undefined; maintenance_window_ids?: string[] | undefined; } & {}> | undefined; version?: string | undefined; server_uuid?: string | undefined; task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; space_agnostic?: boolean | undefined; } & {}>[] | undefined; space_ids?: string[] | undefined; } & {}> | undefined; event?: Readonly<{ type?: string[] | undefined; reason?: string | undefined; action?: string | undefined; id?: string | undefined; start?: string | undefined; end?: string | undefined; outcome?: string | undefined; category?: string[] | undefined; duration?: string | number | undefined; timezone?: string | undefined; risk_score?: number | undefined; severity?: string | number | undefined; url?: string | undefined; created?: string | undefined; dataset?: string | undefined; code?: string | undefined; hash?: string | undefined; ingested?: string | undefined; kind?: string | undefined; module?: string | undefined; original?: string | undefined; provider?: string | undefined; reference?: string | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; user?: Readonly<{ id?: string | undefined; name?: string | undefined; } & {}> | undefined; } & {}>>> | undefined" ], "path": "x-pack/plugins/event_log/generated/schemas.ts", "deprecated": false, @@ -1485,7 +1485,7 @@ "label": "IValidatedEvent", "description": [], "signature": [ - "Readonly<{ log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; message?: string | undefined; tags?: string[] | undefined; rule?: Readonly<{ id?: string | undefined; name?: string | undefined; license?: string | undefined; description?: string | undefined; category?: string | undefined; uuid?: string | undefined; version?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; } & {}> | undefined; kibana?: Readonly<{ action?: Readonly<{ id?: string | undefined; name?: string | undefined; execution?: Readonly<{ source?: string | undefined; uuid?: string | undefined; gen_ai?: Readonly<{ usage?: Readonly<{ prompt_tokens?: string | number | undefined; completion_tokens?: string | number | undefined; total_tokens?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; alerting?: Readonly<{ summary?: Readonly<{ recovered?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; new?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; ongoing?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; outcome?: string | undefined; status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; revision?: string | number | undefined; execution?: Readonly<{ uuid?: string | undefined; status?: string | undefined; metrics?: Readonly<{ total_search_duration_ms?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_searches?: string | number | undefined; es_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; rule_type_run_duration_ms?: string | number | undefined; process_alerts_duration_ms?: string | number | undefined; trigger_actions_duration_ms?: string | number | undefined; process_rule_duration_ms?: string | number | undefined; claim_to_start_duration_ms?: string | number | undefined; persist_alerts_duration_ms?: string | number | undefined; prepare_rule_duration_ms?: string | number | undefined; total_run_duration_ms?: string | number | undefined; total_enrichment_duration_ms?: string | number | undefined; } & {}> | undefined; status_order?: string | number | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; uuid?: string | undefined; flapping?: boolean | undefined; maintenance_window_ids?: string[] | undefined; } & {}> | undefined; version?: string | undefined; server_uuid?: string | undefined; task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; space_agnostic?: boolean | undefined; } & {}>[] | undefined; space_ids?: string[] | undefined; } & {}> | undefined; event?: Readonly<{ type?: string[] | undefined; reason?: string | undefined; action?: string | undefined; id?: string | undefined; start?: string | undefined; end?: string | undefined; code?: string | undefined; category?: string[] | undefined; outcome?: string | undefined; duration?: string | number | undefined; timezone?: string | undefined; risk_score?: number | undefined; severity?: string | number | undefined; url?: string | undefined; created?: string | undefined; dataset?: string | undefined; hash?: string | undefined; ingested?: string | undefined; kind?: string | undefined; module?: string | undefined; original?: string | undefined; provider?: string | undefined; reference?: string | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; user?: Readonly<{ id?: string | undefined; name?: string | undefined; } & {}> | undefined; } & {}> | undefined" + "Readonly<{ log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; message?: string | undefined; tags?: string[] | undefined; rule?: Readonly<{ id?: string | undefined; name?: string | undefined; license?: string | undefined; uuid?: string | undefined; version?: string | undefined; category?: string | undefined; description?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; } & {}> | undefined; kibana?: Readonly<{ action?: Readonly<{ id?: string | undefined; name?: string | undefined; execution?: Readonly<{ source?: string | undefined; uuid?: string | undefined; gen_ai?: Readonly<{ usage?: Readonly<{ prompt_tokens?: string | number | undefined; completion_tokens?: string | number | undefined; total_tokens?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; } & {}> | undefined; alerting?: Readonly<{ outcome?: string | undefined; summary?: Readonly<{ recovered?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; new?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; ongoing?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; revision?: string | number | undefined; execution?: Readonly<{ uuid?: string | undefined; status?: string | undefined; metrics?: Readonly<{ total_search_duration_ms?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_searches?: string | number | undefined; es_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; rule_type_run_duration_ms?: string | number | undefined; process_alerts_duration_ms?: string | number | undefined; trigger_actions_duration_ms?: string | number | undefined; process_rule_duration_ms?: string | number | undefined; claim_to_start_duration_ms?: string | number | undefined; persist_alerts_duration_ms?: string | number | undefined; prepare_rule_duration_ms?: string | number | undefined; total_run_duration_ms?: string | number | undefined; total_enrichment_duration_ms?: string | number | undefined; } & {}> | undefined; status_order?: string | number | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; uuid?: string | undefined; flapping?: boolean | undefined; maintenance_window_ids?: string[] | undefined; } & {}> | undefined; version?: string | undefined; server_uuid?: string | undefined; task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; space_agnostic?: boolean | undefined; } & {}>[] | undefined; space_ids?: string[] | undefined; } & {}> | undefined; event?: Readonly<{ type?: string[] | undefined; reason?: string | undefined; action?: string | undefined; id?: string | undefined; start?: string | undefined; end?: string | undefined; outcome?: string | undefined; category?: string[] | undefined; duration?: string | number | undefined; timezone?: string | undefined; risk_score?: number | undefined; severity?: string | number | undefined; url?: string | undefined; created?: string | undefined; dataset?: string | undefined; code?: string | undefined; hash?: string | undefined; ingested?: string | undefined; kind?: string | undefined; module?: string | undefined; original?: string | undefined; provider?: string | undefined; reference?: string | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; user?: Readonly<{ id?: string | undefined; name?: string | undefined; } & {}> | undefined; } & {}> | undefined" ], "path": "x-pack/plugins/event_log/generated/schemas.ts", "deprecated": false, diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 99143a7510ee3..9c07b0b853151 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index 880f114feb569..758f2de0e9040 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 8a0c3bd9e4f6b..297decde921a4 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.devdocs.json b/api_docs/expression_gauge.devdocs.json index 896d8e7b0818a..753ab8e7b93eb 100644 --- a/api_docs/expression_gauge.devdocs.json +++ b/api_docs/expression_gauge.devdocs.json @@ -913,7 +913,7 @@ }, "<", "GoalDomainRange", - ">; base?: number | undefined; actual?: number | undefined; bandFillColor?: \"ignore\" | undefined; tickValueFormatter?: \"ignore\" | undefined; labelMajor?: string | ", + ">; actual?: number | undefined; base?: number | undefined; bandFillColor?: \"ignore\" | undefined; tickValueFormatter?: \"ignore\" | undefined; labelMajor?: string | ", "GoalLabelAccessor", " | undefined; labelMinor?: string | ", "GoalLabelAccessor", @@ -1207,7 +1207,7 @@ }, "<", "GoalDomainRange", - ">; base?: number | undefined; actual?: number | undefined; bandFillColor?: \"ignore\" | undefined; tickValueFormatter?: \"ignore\" | undefined; labelMajor?: string | ", + ">; actual?: number | undefined; base?: number | undefined; bandFillColor?: \"ignore\" | undefined; tickValueFormatter?: \"ignore\" | undefined; labelMajor?: string | ", "GoalLabelAccessor", " | undefined; labelMinor?: string | ", "GoalLabelAccessor", diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 29b48a8c6e195..7a013f92a2afc 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index 2678e48b832b8..5c8b5293fd556 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index 151dccfbc144c..46d535b8da717 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 86e41c6b93be3..7960e4daf78c1 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index ab809a16aecfe..bf22fbbcc1c77 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 177417deee0e1..8fdbd1df536b5 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index 47c3c3882d0b4..38913e659d9c1 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index 939d82c8fd808..ed30e9db3be5f 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index befec179d0363..45e30f6e9dafa 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index fd7eea12863a9..7b056c14a955c 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index 736633d6cef6d..441683ded598a 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.devdocs.json b/api_docs/expression_x_y.devdocs.json index 13af4d2e8b440..0d8facf97b737 100644 --- a/api_docs/expression_x_y.devdocs.json +++ b/api_docs/expression_x_y.devdocs.json @@ -1910,7 +1910,7 @@ "label": "overrides", "description": [], "signature": [ - "(Partial> | undefined>; title?: string | undefined; gridLine?: ", + ", \"gridLine\">> | undefined>; title?: string | undefined; children?: boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | undefined; gridLine?: ", { "pluginId": "@kbn/chart-expressions-common", "scope": "common", @@ -2147,7 +2147,7 @@ "label": "AllowedXYOverrides", "description": [], "signature": [ - "{ axisX?: { children?: boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | undefined; style?: ", + "{ axisX?: { style?: ", { "pluginId": "@kbn/chart-expressions-common", "scope": "common", @@ -2159,7 +2159,7 @@ "RecursivePartial", "> | undefined>; title?: string | undefined; gridLine?: ", + ", \"gridLine\">> | undefined>; title?: string | undefined; children?: boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | undefined; gridLine?: ", { "pluginId": "@kbn/chart-expressions-common", "scope": "common", @@ -2181,7 +2181,7 @@ }, "<", "YDomainRange", - " | undefined>; hide?: boolean | undefined; showOverlappingTicks?: boolean | undefined; showOverlappingLabels?: boolean | undefined; timeAxisLayerCount?: number | undefined; integersOnly?: boolean | undefined; tickFormat?: \"ignore\" | undefined; labelFormat?: \"ignore\" | undefined; showDuplicatedTicks?: boolean | undefined; } | undefined; axisLeft?: { children?: boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | undefined; style?: ", + " | undefined>; hide?: boolean | undefined; showOverlappingTicks?: boolean | undefined; showOverlappingLabels?: boolean | undefined; timeAxisLayerCount?: number | undefined; integersOnly?: boolean | undefined; tickFormat?: \"ignore\" | undefined; labelFormat?: \"ignore\" | undefined; showDuplicatedTicks?: boolean | undefined; } | undefined; axisLeft?: { style?: ", { "pluginId": "@kbn/chart-expressions-common", "scope": "common", @@ -2193,7 +2193,7 @@ "RecursivePartial", "> | undefined>; title?: string | undefined; gridLine?: ", + ", \"gridLine\">> | undefined>; title?: string | undefined; children?: boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | undefined; gridLine?: ", { "pluginId": "@kbn/chart-expressions-common", "scope": "common", @@ -2215,7 +2215,7 @@ }, "<", "YDomainRange", - " | undefined>; hide?: boolean | undefined; showOverlappingTicks?: boolean | undefined; showOverlappingLabels?: boolean | undefined; timeAxisLayerCount?: number | undefined; integersOnly?: boolean | undefined; tickFormat?: \"ignore\" | undefined; labelFormat?: \"ignore\" | undefined; showDuplicatedTicks?: boolean | undefined; } | undefined; axisRight?: { children?: boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | undefined; style?: ", + " | undefined>; hide?: boolean | undefined; showOverlappingTicks?: boolean | undefined; showOverlappingLabels?: boolean | undefined; timeAxisLayerCount?: number | undefined; integersOnly?: boolean | undefined; tickFormat?: \"ignore\" | undefined; labelFormat?: \"ignore\" | undefined; showDuplicatedTicks?: boolean | undefined; } | undefined; axisRight?: { style?: ", { "pluginId": "@kbn/chart-expressions-common", "scope": "common", @@ -2227,7 +2227,7 @@ "RecursivePartial", "> | undefined>; title?: string | undefined; gridLine?: ", + ", \"gridLine\">> | undefined>; title?: string | undefined; children?: boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | undefined; gridLine?: ", { "pluginId": "@kbn/chart-expressions-common", "scope": "common", @@ -2264,7 +2264,7 @@ "label": "AvailableReferenceLineIcon", "description": [], "signature": [ - "\"alert\" | \"circle\" | \"tag\" | \"asterisk\" | \"bell\" | \"bolt\" | \"bug\" | \"editorComment\" | \"empty\" | \"flag\" | \"heart\" | \"mapMarker\" | \"pinFilled\" | \"starEmpty\" | \"starFilled\" | \"triangle\"" + "\"alert\" | \"tag\" | \"asterisk\" | \"bell\" | \"bolt\" | \"bug\" | \"editorComment\" | \"empty\" | \"flag\" | \"heart\" | \"mapMarker\" | \"pinFilled\" | \"starEmpty\" | \"starFilled\" | \"circle\" | \"triangle\"" ], "path": "src/plugins/chart_expressions/expression_xy/common/types/expression_functions.ts", "deprecated": false, diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 84e4f32df3e51..32b971d6a3ada 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.devdocs.json b/api_docs/expressions.devdocs.json index cee623925a105..f4a94a9c84893 100644 --- a/api_docs/expressions.devdocs.json +++ b/api_docs/expressions.devdocs.json @@ -37965,7 +37965,7 @@ "\nMode of the expression render environment.\nThis value can be set from a consumer embedding an expression renderer and is accessible\nfrom within the active render function as part of the handlers.\nThe following modes are supported:\n* view (default): The chart is rendered in a container with the main purpose of viewing the chart (e.g. in a container like dashboard or canvas)\n* preview: The chart is rendered in very restricted space (below 100px width and height) and should only show a rough outline\n* edit: The chart is rendered within an editor and configuration elements within the chart should be displayed" ], "signature": [ - "\"view\" | \"edit\" | \"preview\"" + "\"edit\" | \"view\" | \"preview\"" ], "path": "src/plugins/expressions/common/expression_renderers/types.ts", "deprecated": false, diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index 9bf5252974756..799e95053403d 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index a34eac8e31980..bc76d13bd7d54 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index 1e09393a8f0cf..2249974068948 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 61524f0ba96c5..f40f79e8ca401 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.mdx b/api_docs/files.mdx index 18ac9f1aeb4e5..ef78a89ec52e7 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index bc9359076586b..e6fff8f296727 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index 1e63df687cbe1..024d3ff4814f8 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -25585,7 +25585,7 @@ "label": "RegistrySearchResult", "description": [], "signature": [ - "{ type?: \"input\" | \"integration\" | undefined; name: string; title: string; path: string; description: string; version: string; download: string; internal?: boolean | undefined; icons?: (", + "{ type?: \"input\" | \"integration\" | undefined; name: string; title: string; version: string; description: string; path: string; download: string; internal?: boolean | undefined; icons?: (", { "pluginId": "fleet", "scope": "common", diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 4f4eb25c64d3f..efb0b9bc42730 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index bb2fb99a701d7..5ce61b8569d6d 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx index 78d8c644b9776..ec230758dc949 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.devdocs.json b/api_docs/home.devdocs.json index 7e618e5389d23..2dbbb7f3ffe1b 100644 --- a/api_docs/home.devdocs.json +++ b/api_docs/home.devdocs.json @@ -1839,7 +1839,7 @@ "label": "ArtifactsSchema", "description": [], "signature": [ - "{ readonly application?: Readonly<{} & { label: string; path: string; }> | undefined; readonly exportedFields?: Readonly<{} & { documentationUrl: string; }> | undefined; readonly dashboards: Readonly<{ linkLabel?: string | undefined; } & { id: string; isOverview: boolean; }>[]; }" + "{ readonly application?: Readonly<{} & { path: string; label: string; }> | undefined; readonly exportedFields?: Readonly<{} & { documentationUrl: string; }> | undefined; readonly dashboards: Readonly<{ linkLabel?: string | undefined; } & { id: string; isOverview: boolean; }>[]; }" ], "path": "src/plugins/home/server/services/tutorials/lib/tutorial_schema.ts", "deprecated": false, @@ -1892,7 +1892,7 @@ "section": "def-common.Writable", "text": "Writable" }, - "[]; previewImagePath: string; overviewDashboard: string; dataIndices: Readonly<{ indexSettings?: Record | undefined; isDataStream?: boolean | undefined; } & { id: string; fields: Record; timeFields: string[]; dataPath: string; currentTimeMarker: string; preserveDayOfWeekTimeOfDay: boolean; }>[]; }>>[]; addSavedObjectsToSampleDataset: (id: string, savedObjects: ", + "[]; previewImagePath: string; overviewDashboard: string; dataIndices: Readonly<{ indexSettings?: Record | undefined; isDataStream?: boolean | undefined; } & { id: string; fields: Record; timeFields: string[]; dataPath: string; currentTimeMarker: string; preserveDayOfWeekTimeOfDay: boolean; }>[]; }>>[]; addSavedObjectsToSampleDataset: (id: string, savedObjects: ", { "pluginId": "@kbn/core-saved-objects-common", "scope": "common", @@ -1941,7 +1941,7 @@ "section": "def-common.Writable", "text": "Writable" }, - "[]; previewImagePath: string; overviewDashboard: string; dataIndices: Readonly<{ indexSettings?: Record | undefined; isDataStream?: boolean | undefined; } & { id: string; fields: Record; timeFields: string[]; dataPath: string; currentTimeMarker: string; preserveDayOfWeekTimeOfDay: boolean; }>[]; }>>" + "[]; previewImagePath: string; overviewDashboard: string; dataIndices: Readonly<{ indexSettings?: Record | undefined; isDataStream?: boolean | undefined; } & { id: string; fields: Record; timeFields: string[]; dataPath: string; currentTimeMarker: string; preserveDayOfWeekTimeOfDay: boolean; }>[]; }>>" ], "path": "src/plugins/home/server/services/sample_data/lib/sample_dataset_registry_types.ts", "deprecated": false, @@ -2013,7 +2013,7 @@ "section": "def-server.TutorialContext", "text": "TutorialContext" }, - ") => Readonly<{ savedObjects?: any[] | undefined; euiIconType?: string | undefined; isBeta?: boolean | undefined; previewImagePath?: string | undefined; moduleName?: string | undefined; completionTimeMinutes?: number | undefined; elasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; id: string; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; onPremElasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; id: string; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; artifacts?: Readonly<{ application?: Readonly<{} & { label: string; path: string; }> | undefined; exportedFields?: Readonly<{} & { documentationUrl: string; }> | undefined; } & { dashboards: Readonly<{ linkLabel?: string | undefined; } & { id: string; isOverview: boolean; }>[]; }> | undefined; savedObjectsInstallMsg?: string | undefined; customStatusCheckName?: string | undefined; integrationBrowserCategories?: string[] | undefined; eprPackageOverlap?: string | undefined; } & { id: string; name: string; category: \"security\" | \"metrics\" | \"other\" | \"logging\"; shortDescription: string; longDescription: string; onPrem: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; id: string; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }>; }>" + ") => Readonly<{ savedObjects?: any[] | undefined; euiIconType?: string | undefined; isBeta?: boolean | undefined; previewImagePath?: string | undefined; moduleName?: string | undefined; completionTimeMinutes?: number | undefined; elasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; id: string; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; onPremElasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; id: string; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; artifacts?: Readonly<{ application?: Readonly<{} & { path: string; label: string; }> | undefined; exportedFields?: Readonly<{} & { documentationUrl: string; }> | undefined; } & { dashboards: Readonly<{ linkLabel?: string | undefined; } & { id: string; isOverview: boolean; }>[]; }> | undefined; savedObjectsInstallMsg?: string | undefined; customStatusCheckName?: string | undefined; integrationBrowserCategories?: string[] | undefined; eprPackageOverlap?: string | undefined; } & { id: string; name: string; category: \"security\" | \"metrics\" | \"other\" | \"logging\"; shortDescription: string; longDescription: string; onPrem: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; id: string; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }>; }>" ], "path": "src/plugins/home/server/services/tutorials/lib/tutorials_registry_types.ts", "deprecated": false, @@ -2051,7 +2051,7 @@ "label": "TutorialSchema", "description": [], "signature": [ - "{ readonly savedObjects?: any[] | undefined; readonly euiIconType?: string | undefined; readonly isBeta?: boolean | undefined; readonly previewImagePath?: string | undefined; readonly moduleName?: string | undefined; readonly completionTimeMinutes?: number | undefined; readonly elasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; id: string; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; readonly onPremElasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; id: string; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; readonly artifacts?: Readonly<{ application?: Readonly<{} & { label: string; path: string; }> | undefined; exportedFields?: Readonly<{} & { documentationUrl: string; }> | undefined; } & { dashboards: Readonly<{ linkLabel?: string | undefined; } & { id: string; isOverview: boolean; }>[]; }> | undefined; readonly savedObjectsInstallMsg?: string | undefined; readonly customStatusCheckName?: string | undefined; readonly integrationBrowserCategories?: string[] | undefined; readonly eprPackageOverlap?: string | undefined; readonly id: string; readonly name: string; readonly category: \"security\" | \"metrics\" | \"other\" | \"logging\"; readonly shortDescription: string; readonly longDescription: string; readonly onPrem: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; id: string; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }>; }" + "{ readonly savedObjects?: any[] | undefined; readonly euiIconType?: string | undefined; readonly isBeta?: boolean | undefined; readonly previewImagePath?: string | undefined; readonly moduleName?: string | undefined; readonly completionTimeMinutes?: number | undefined; readonly elasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; id: string; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; readonly onPremElasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; id: string; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; readonly artifacts?: Readonly<{ application?: Readonly<{} & { path: string; label: string; }> | undefined; exportedFields?: Readonly<{} & { documentationUrl: string; }> | undefined; } & { dashboards: Readonly<{ linkLabel?: string | undefined; } & { id: string; isOverview: boolean; }>[]; }> | undefined; readonly savedObjectsInstallMsg?: string | undefined; readonly customStatusCheckName?: string | undefined; readonly integrationBrowserCategories?: string[] | undefined; readonly eprPackageOverlap?: string | undefined; readonly id: string; readonly name: string; readonly category: \"security\" | \"metrics\" | \"other\" | \"logging\"; readonly shortDescription: string; readonly longDescription: string; readonly onPrem: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; id: string; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }>; }" ], "path": "src/plugins/home/server/services/tutorials/lib/tutorial_schema.ts", "deprecated": false, @@ -2360,7 +2360,7 @@ "section": "def-common.Writable", "text": "Writable" }, - "[]; previewImagePath: string; overviewDashboard: string; dataIndices: Readonly<{ indexSettings?: Record | undefined; isDataStream?: boolean | undefined; } & { id: string; fields: Record; timeFields: string[]; dataPath: string; currentTimeMarker: string; preserveDayOfWeekTimeOfDay: boolean; }>[]; }>>[]; addSavedObjectsToSampleDataset: (id: string, savedObjects: ", + "[]; previewImagePath: string; overviewDashboard: string; dataIndices: Readonly<{ indexSettings?: Record | undefined; isDataStream?: boolean | undefined; } & { id: string; fields: Record; timeFields: string[]; dataPath: string; currentTimeMarker: string; preserveDayOfWeekTimeOfDay: boolean; }>[]; }>>[]; addSavedObjectsToSampleDataset: (id: string, savedObjects: ", { "pluginId": "@kbn/core-saved-objects-common", "scope": "common", diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 139b81ee676f1..311f60bc40853 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index db03827888a91..0fb1126eeb005 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index a06b1e877a1f2..5ca80f2163315 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.devdocs.json b/api_docs/index_management.devdocs.json index 961ae27f9be36..54c259862cbf5 100644 --- a/api_docs/index_management.devdocs.json +++ b/api_docs/index_management.devdocs.json @@ -878,7 +878,7 @@ "label": "IndexManagementConfig", "description": [], "signature": [ - "{ readonly ui: Readonly<{} & { enabled: boolean; }>; readonly enableIndexActions: boolean; readonly enableLegacyTemplates: boolean; readonly dev: Readonly<{} & { enableIndexDetailsPage: boolean; }>; readonly enableIndexStats: boolean; readonly editableIndexSettings: \"all\" | \"limited\"; readonly enableDataStreamsStorageColumn: boolean; readonly enableEmbeddedConsole: boolean; }" + "{ readonly ui: Readonly<{} & { enabled: boolean; }>; readonly enableIndexActions: boolean; readonly enableLegacyTemplates: boolean; readonly dev: Readonly<{} & { enableIndexDetailsPage: boolean; }>; readonly enableIndexStats: boolean; readonly editableIndexSettings: \"all\" | \"limited\"; readonly enableDataStreamsStorageColumn: boolean; }" ], "path": "x-pack/plugins/index_management/server/config.ts", "deprecated": false, diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 35680d4a0ad01..62e9d3534fc44 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index c195451d72266..f9e38284b1c44 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,14 +8,14 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; This plugin visualizes data from Filebeat and Metricbeat, and integrates with other Observability solutions -Contact [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) for questions regarding this plugin. +Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx index 3386a3aaef270..8211d4d5a88b6 100644 --- a/api_docs/ingest_pipelines.mdx +++ b/api_docs/ingest_pipelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ingestPipelines title: "ingestPipelines" image: https://source.unsplash.com/400x175/?github description: API docs for the ingestPipelines plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] --- import ingestPipelinesObj from './ingest_pipelines.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 4df703593f78f..151182ccbd42e 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index a8f90ec67e45d..3b2905dd572f5 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index f79211a4657ee..8bdcec34c0ffd 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index b959200843742..457c52017f607 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 4661562a07ae4..2026e8265f3af 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index d2dea1664a149..b39c18c5bf0e5 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index dcedef2c65e85..61494b141c439 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 107e35fd85333..d83c067ec1cf2 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index 4439961d6273b..e88444426ab5d 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 6cdd0ff78a971..33c97766fbba2 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index 6aecc6d3de214..535776073ea4b 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index 38d17d7b35044..476d2f7c18042 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index 7ae8e9bedc6ac..cd82320f7d7f5 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index 59abdb5440840..96de65e982df6 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index dc5884f8fdaab..c2d999466361d 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] --- import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index 90679326f140a..dbf0453c09066 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] --- import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index 30c3f0982e624..7a208b3b8b11a 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index aa9782f4b5893..5f25e6139169a 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 3d1546b28fa16..f1979024dc4ac 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 72be03d201a00..4fd92d0c0f980 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.devdocs.json b/api_docs/kbn_apm_synthtrace_client.devdocs.json index cdc477f6af102..7c7c53d407261 100644 --- a/api_docs/kbn_apm_synthtrace_client.devdocs.json +++ b/api_docs/kbn_apm_synthtrace_client.devdocs.json @@ -787,7 +787,7 @@ "label": "error", "description": [], "signature": [ - "({ message, type }: { message: string; type?: string | undefined; }) => ", + "({ message, type, culprit }: { message: string; type?: string | undefined; culprit?: string | undefined; }) => ", "ApmError" ], "path": "packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts", @@ -799,7 +799,7 @@ "id": "def-common.Instance.error.$1", "type": "Object", "tags": [], - "label": "{ message, type }", + "label": "{ message, type, culprit }", "description": [], "path": "packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts", "deprecated": false, @@ -829,6 +829,20 @@ "path": "packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.Instance.error.$1.culprit", + "type": "string", + "tags": [], + "label": "culprit", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts", + "deprecated": false, + "trackAdoption": false } ] } @@ -2512,7 +2526,7 @@ "GeoLocation", "; 'client.geo.region_iso_code': string; 'client.geo.region_name': string; 'client.ip': string; 'cloud.account.id': string; 'cloud.account.name': string; 'cloud.availability_zone': string; 'cloud.machine.type': string; 'cloud.project.id': string; 'cloud.project.name': string; 'cloud.provider': string; 'cloud.region': string; 'cloud.service.name': string; 'code.stacktrace': string; 'container.id': string; 'destination.address': string; 'destination.port': number; 'device.id': string; 'device.manufacturer': string; 'device.model.identifier': string; 'device.model.name': string; 'ecs.version': string; 'error.exception': ", "ApmException", - "[]; 'error.grouping_key': string; 'error.grouping_name': string; 'error.id': string; 'error.type': string; 'event.ingested': number; 'event.name': string; 'event.action': string; 'event.outcome': string; 'event.outcome_numeric': number | { sum: number; value_count: number; }; 'faas.coldstart': boolean; 'faas.execution': string; 'faas.id': string; 'faas.name': string; 'faas.trigger.type': string; 'faas.version': string; 'host.architecture': string; 'host.hostname': string; 'host.name': string; 'host.os.full': string; 'host.os.name': string; 'host.os.platform': string; 'host.os.type': string; 'host.os.version': string; 'http.request.method': string; 'http.response.status_code': number; 'kubernetes.pod.name': string; 'kubernetes.pod.uid': string; 'labels.name': string; 'labels.telemetry_auto_version': string; 'labels.lifecycle_state': string; 'metricset.name': string; 'network.carrier.icc': string; 'network.carrier.mcc': string; 'network.carrier.mnc': string; 'network.carrier.name': string; 'network.connection.subtype': string; 'network.connection.type': string; 'observer.type': string; 'observer.version_major': number; 'observer.version': string; 'parent.id': string; 'processor.event': string; 'processor.name': string; 'session.id': string; 'trace.id': string; 'transaction.aggregation.overflow_count': number; 'transaction.duration.us': number; 'transaction.id': string; 'transaction.name': string; 'transaction.type': string; 'transaction.duration.histogram': { values: number[]; counts: number[]; }; 'transaction.result': string; 'transaction.sampled': boolean; 'service.environment': string; 'service.framework.name': string; 'service.framework.version': string; 'service.language.name': string; 'service.language.version': string; 'service.name': string; 'service.node.name': string; 'service.runtime.name': string; 'service.runtime.version': string; 'service.target.name': string; 'service.target.type': string; 'service.version': string; 'span.action': string; 'span.destination.service.resource': string; 'span.destination.service.response_time.count': number; 'span.destination.service.response_time.sum.us': number; 'span.duration.us': number; 'span.id': string; 'span.name': string; 'span.stacktrace': ", + "[]; 'error.grouping_key': string; 'error.grouping_name': string; 'error.id': string; 'error.type': string; 'error.culprit': string; 'event.ingested': number; 'event.name': string; 'event.action': string; 'event.outcome': string; 'event.outcome_numeric': number | { sum: number; value_count: number; }; 'faas.coldstart': boolean; 'faas.execution': string; 'faas.id': string; 'faas.name': string; 'faas.trigger.type': string; 'faas.version': string; 'host.architecture': string; 'host.hostname': string; 'host.name': string; 'host.os.full': string; 'host.os.name': string; 'host.os.platform': string; 'host.os.type': string; 'host.os.version': string; 'http.request.method': string; 'http.response.status_code': number; 'kubernetes.pod.name': string; 'kubernetes.pod.uid': string; 'labels.name': string; 'labels.telemetry_auto_version': string; 'labels.lifecycle_state': string; 'metricset.name': string; 'network.carrier.icc': string; 'network.carrier.mcc': string; 'network.carrier.mnc': string; 'network.carrier.name': string; 'network.connection.subtype': string; 'network.connection.type': string; 'observer.type': string; 'observer.version_major': number; 'observer.version': string; 'parent.id': string; 'processor.event': string; 'processor.name': string; 'session.id': string; 'trace.id': string; 'transaction.aggregation.overflow_count': number; 'transaction.duration.us': number; 'transaction.id': string; 'transaction.name': string; 'transaction.type': string; 'transaction.duration.histogram': { values: number[]; counts: number[]; }; 'transaction.result': string; 'transaction.sampled': boolean; 'service.environment': string; 'service.framework.name': string; 'service.framework.version': string; 'service.language.name': string; 'service.language.version': string; 'service.name': string; 'service.node.name': string; 'service.runtime.name': string; 'service.runtime.version': string; 'service.target.name': string; 'service.target.type': string; 'service.version': string; 'span.action': string; 'span.destination.service.resource': string; 'span.destination.service.response_time.count': number; 'span.destination.service.response_time.sum.us': number; 'span.duration.us': number; 'span.id': string; 'span.name': string; 'span.stacktrace': ", "APMStacktrace", "[]; 'span.self_time.count': number; 'span.self_time.sum.us': number; 'span.subtype': string; 'span.type': string; 'span.links': { trace: { id: string; }; span: { id: string; }; }[]; 'url.original': string; }> & Partial<{ 'system.process.memory.size': number; 'system.memory.actual.free': number; 'system.memory.total': number; 'system.process.cgroup.memory.mem.limit.bytes': number; 'system.process.cgroup.memory.mem.usage.bytes': number; 'system.cpu.total.norm.pct': number; 'system.process.memory.rss.bytes': number; 'system.process.cpu.total.norm.pct': number; 'jvm.memory.heap.used': number; 'jvm.memory.non_heap.used': number; 'jvm.thread.count': number; 'faas.billed_duration': number; 'faas.timeout': number; 'faas.coldstart_duration': number; 'faas.duration': number; 'application.launch.time': number; }> & Partial<{ 'metricset.interval': string; 'transaction.duration.summary': string; }>" ], diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index 71a9bfd161e52..2e3d2fced01c7 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 188 | 0 | 188 | 28 | +| 189 | 0 | 189 | 28 | ## Common diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 1bfec8c47e10d..860c588876470 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 469a772714274..96419db02fd34 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index e2fa88541566f..92118e7115bfc 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index 832108a5c4f26..6b23bed5ff3d4 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index edcaa27dd6d5a..f23eabfb8b0a4 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index c9ba6747a282a..c152d4fc65eb9 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 9247851e59239..79e2385b776c2 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index b81d639596817..b076e16380999 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index fc4bbd977b5d0..96248a86c2b47 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index d55867c919335..4d56a3343fdbf 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index 2656355e7afe2..ae097d2dff529 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index 20f48244032e8..0f6384e383c6d 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index 6a36650d21777..b6eb8e38845b3 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 5208e1ab21b8c..6fc721f91cdb6 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index cebe278f7f6eb..1fdfe0c4356fa 100644 --- a/api_docs/kbn_code_editor_mock.mdx +++ b/api_docs/kbn_code_editor_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mock title: "@kbn/code-editor-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mock plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index d8b2a81ef6bcc..832a04c1c673e 100644 --- a/api_docs/kbn_code_owners.mdx +++ b/api_docs/kbn_code_owners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners title: "@kbn/code-owners" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-owners plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index d18e497bc7617..1ea5c68aa7f00 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index 3680ce545abb6..d80748a3f547f 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 9d35118456345..25b530a255954 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index 9419b075ac6f5..da1ec235b7bdf 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index c6fb4220f3f41..253562776665e 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index 9cf2eb6fcd06a..a3881f6bc4029 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index c761e6d6882f7..27f52cc21c28f 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index cfa99b0799a61..c774550320b77 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index b4cae656c4771..b855b72b03b61 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index bc0209715b11e..006e4a8521709 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index ff3281cbd5e26..9820f4094ca55 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index 2a5b70c9fed3a..807061a7a8a7f 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index ac09e173d3c7c..8b8ad6d6335c4 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 1d727b80948f3..68a251e702bf6 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index d7a177ad61ed2..b0634e541d263 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index 97c34310171ef..2314e896b72e1 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index c869644d34c93..44a3936950a92 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index bfc3f3b8fa7a6..4ef23b90e8bf3 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index 5baadaa28e24e..c91f4775b2d2b 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index 14dfe8c139c8b..752eb3a247cd4 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index 66371c995f9ad..0224539e64b01 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal'] --- import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx index 3b265838231f7..861b419cdfa15 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index 1e180734e5203..769822a9698c3 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 7ee4fbf0f8507..4085e17f1c4b9 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index 14b3d39d655d8..a4a0018f9ab9e 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index 42b1866126b65..0f4cf32c7f808 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index 6ae565d8c6c18..8bd78d9272297 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index 7e3be23d4fdf2..223019dad1821 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index 1c53bb69d343e..380f3e175200d 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index 4e8a5fa92df28..230790130ff2c 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index fec87554cf252..372eaf7021c44 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index 17184a4a1b52b..fb1e529ec5529 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index bfbe043dc7b16..ee549cb466db6 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index ce1ea204aea2a..4e1fcd0f7bbbe 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index eeade29e6fc82..04c225fb74db2 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index f86cb1a250d33..9360f425fb3fd 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index 2bbf32cfea300..f950163dfbfac 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index 99a12c77b517c..c8eec4292dfbe 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index 4fe2916e44c0f..47057af1db19c 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index 2948ad3952fdf..a8ae13eb9c619 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index a954c6eb4f5e1..6a2255991f506 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 8eeb0c21fd277..49183fed2363f 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index 8dca0efd15999..1883515f550b8 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index 0ce77640301d6..1ea25d7c195d3 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index a1c297b220eaf..ab146389f3029 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index d4fdcec78ef3e..910c203ab9ee7 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index 8c41e8d46f1c8..81fa99b5fac74 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index d7d6eba532639..da7f913f514db 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index 91f9a721468a3..9b4305d1a4b53 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index c28aee90a2651..16b181fccdc76 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index 448b33f2e67f4..913d87132e8aa 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index afcce5c0bb5a1..f11861bdec6e1 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index 7ce72217804bd..21d42834065c0 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index bba3861d3670f..61e1ce8c71ecc 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index a1bc44aa15784..a38a8c7b088f7 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index e11a31c19e08c..145e7f42c1a02 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index 1e73eb13c5b2b..9f4ad8e08c80b 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index 88a435553de07..fa7c7298cc6e8 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index 5dce66a867f15..279587b90b2fa 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index 11a837608d432..8e47ad4ad7f1f 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index 0f27d703ce2b2..f37da23e84b48 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index 3838ba03f030b..fa0700e0fb995 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index f2c2a5de4f4fd..f7d1b5038b3ff 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index ce6d1512b1d4c..eb2bbf2c47ce5 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index 9be298de932d2..67f0ca8617cc8 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index cec48bcc82f4e..75c06993ff9a3 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index a7e0391d1d5b8..395e547c5164b 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index b3c976efd8b09..728afb7f49d41 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index ce968630700bc..c3c0fbb4d9771 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index dc588d8eecb9b..93ab1153fa2d6 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index 0c22e63dd2416..c613b02ec1d2b 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index f92521093fb77..0e5d5569cae07 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index 178c3f3a1eb09..ab96ccea2a9bd 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx index e3587dbecbcbe..c3e7f42952aad 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index 582e086cab037..d1d4d7d7deaf4 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index 13acd04d07074..ab4ef9436cd16 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index 079e178785637..e4a9daa6f3325 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 8129c7d65b3ed..d5c2376e1c1d2 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index 03d97749a5e92..508b1e38252b2 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index 19e2fa1999fb5..9b8676b2df198 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -6386,10 +6386,6 @@ "plugin": "elasticAssistant", "path": "x-pack/plugins/elastic_assistant/server/routes/knowledge_base/post_knowledge_base.ts" }, - { - "plugin": "elasticAssistant", - "path": "x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.ts" - }, { "plugin": "globalSearch", "path": "x-pack/plugins/global_search/server/routes/find.ts" @@ -9160,6 +9156,10 @@ "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/analytics.ts" }, + { + "plugin": "enterpriseSearch", + "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts" + }, { "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler_crawl_rules.ts" @@ -13506,6 +13506,10 @@ "plugin": "elasticAssistant", "path": "x-pack/plugins/elastic_assistant/server/routes/capabilities/get_capabilities_route.ts" }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/evaluate/get_evaluate.ts" + }, { "plugin": "logsShared", "path": "x-pack/plugins/logs_shared/server/lib/adapters/framework/kibana_framework_adapter.ts" @@ -14824,6 +14828,10 @@ "plugin": "ecsDataQualityDashboard", "path": "x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/post_results.ts" }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.ts" + }, { "plugin": "logsShared", "path": "x-pack/plugins/logs_shared/server/lib/adapters/framework/kibana_framework_adapter.ts" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 4bcad517c21f5..5e85f5cdf0563 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index e0a50897faf6d..30c7373bbc070 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index d3ae0d7c09fad..2291f409008d8 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index 3b5c440ea6393..22194d2034843 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index b1eff441bc5c3..1d5a6de2e0a07 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index dec8bf268a179..bd4178b6b6c68 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index cc09d3b3c7240..78d2d8092c7cd 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index f6c9a86f1f0fb..1a2d2046f8ce3 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index da3c0fa5134f7..5ba45eb609025 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index 0a41b609c8bc1..8ee1c32c6b9fc 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index 9da4d6be752db..c93e63133f13b 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index 752d9a0b028ef..4684c7d48c03d 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index 7d10e3d4c9250..7449a1de2435f 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index cf3689e34a7c7..c6e346aecffbd 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index 8e24f86f961fa..6ccfb0e474b6e 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index 12cfa4519c47b..0c072da6f3d81 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index 7061cbc283dfa..922f7453a2a13 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 6b32d5b5fac0f..28dbbc6e87ce3 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index 86aeaafa7dfea..f8ad568a4ef20 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index 900e465135015..ff24a7d4d56cd 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index 2348c8e9a737e..14c40a263393d 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index 8bd13bf956fe1..ff0a2d25513ed 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index ad283af308139..88d0bfb50ecfa 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index 1b57d099e0108..fdc0f7ab871a0 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index 5fed069727771..cad05e94b93d5 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index 736d9a7e27cef..be69d8a159c9a 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index d2b781db785e0..a0f401921be03 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index da7f742417ec7..dcde783dfae87 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index 22f3cdb913229..886d3d59c003f 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.devdocs.json b/api_docs/kbn_core_notifications_browser.devdocs.json index 3237e70e94b48..e6e8647c4f4c8 100644 --- a/api_docs/kbn_core_notifications_browser.devdocs.json +++ b/api_docs/kbn_core_notifications_browser.devdocs.json @@ -736,7 +736,7 @@ "signature": [ "Pick<", "Toast", - ", \"prefix\" | \"defaultValue\" | \"security\" | \"children\" | \"slot\" | \"style\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"spellCheck\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"iconType\" | \"onClose\" | \"toastLifeTimeMs\"> & { title?: string | ", + ", \"prefix\" | \"defaultValue\" | \"security\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"iconType\" | \"onClose\" | \"toastLifeTimeMs\"> & { title?: string | ", { "pluginId": "@kbn/core-mount-utils-browser", "scope": "common", @@ -795,7 +795,7 @@ "signature": [ "Pick<", "Toast", - ", \"prefix\" | \"defaultValue\" | \"security\" | \"children\" | \"slot\" | \"style\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"spellCheck\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"iconType\" | \"onClose\" | \"toastLifeTimeMs\"> & { title?: string | ", + ", \"prefix\" | \"defaultValue\" | \"security\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"iconType\" | \"onClose\" | \"toastLifeTimeMs\"> & { title?: string | ", { "pluginId": "@kbn/core-mount-utils-browser", "scope": "common", diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index e5d11c20ebe24..5e339a3f8657b 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index 18ec7543d3576..a49d4be851b11 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index bdbde151dd1cd..aa98083964194 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index 9830ddf0e6fc5..ad52b5a57492b 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index 768babc2419dd..5f2533699653a 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index d9fbd58bdefb2..883bd1abc1901 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx index c879f08bd2b64..5055864bcba14 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser'] --- import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx index 7f18841406868..dabcb030c1676 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index 873443d7ab094..74ce6ce55c85b 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index 57c2022c2192c..ec7c864e1abee 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 6119fafca05c8..17062749f1534 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index 7cfe950f6c57e..4440edc52c18e 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index d4f76173caefd..7424ad1982517 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index 091f95b57028b..53f52941a66b6 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index 0421f6741956f..2d31d5ef2f997 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index 89f4d0d6b13a5..536b88f612326 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index 17a38330691c5..0710d0de7db14 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index 95646e274e261..ff84c6182a2ac 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 93323e4c4fc4e..aba750d6dadd7 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 294493f53d343..1d78520a3ed71 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 79dc2f52abb5c..32136afe4148a 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index cbfab4bdfd0e6..a5a8f6caa2058 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index b3f1e55727323..610301d9c0df2 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index f03b04b3b8dc6..fc1618ae4b8f8 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index 508a802332b5a..6b62598c9092c 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index 45a919ae0a790..191f799b15445 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.devdocs.json b/api_docs/kbn_core_saved_objects_common.devdocs.json index 4ece71332c098..2475968f454ab 100644 --- a/api_docs/kbn_core_saved_objects_common.devdocs.json +++ b/api_docs/kbn_core_saved_objects_common.devdocs.json @@ -1547,14 +1547,6 @@ "plugin": "triggersActionsUi", "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_reducer.ts" }, - { - "plugin": "advancedSettings", - "path": "src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts" - }, - { - "plugin": "advancedSettings", - "path": "src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts" - }, { "plugin": "@kbn/core", "path": "src/core/types/index.ts" diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index 4dfa7534da2d4..f7e8559a26848 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index bacce662057fe..b7c2976ce30e9 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index b5dde5df8961b..44dc7343120e1 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index 7828aee9ece49..2892cbb5ddb71 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index 056ad756ba077..cd90f0c5ff162 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 7b3a34cde56fd..afc0f84ca3de4 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index e4e3b7f0d6002..91a96990f6525 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index cac0ded66453b..d394bbe89555f 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index 5fb0485bd73da..9724411aaea25 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index 0a3e5a76c8a5c..a7618dec2e7f9 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index 7376937280f05..1e72332b5fbf1 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index fd0691269f7fd..df1b7846414f8 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server'] --- import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx index 31f761e749f85..6c2e631d9be11 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal'] --- import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx index f21192e7c7bc3..8d0bfc27e0d15 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks'] --- import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index 842ccf7225460..ea45d7db1093a 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index 45efb7295c927..2199b09420cfe 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index 6b5d9e7a89998..c9135727f4e4b 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index 5eefeaf6161d0..0a26eb5717232 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index 0f6a0def75c55..f04a87f2a7e3b 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index 32a92acdfc770..b29db1f3dbe0a 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index 0c3a03eb8b3ed..a9fd4e5088971 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 6f590bf71a925..3a61b04b4f391 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.devdocs.json b/api_docs/kbn_core_ui_settings_browser.devdocs.json index db4b4e223d17c..8165f9a3c7ea9 100644 --- a/api_docs/kbn_core_ui_settings_browser.devdocs.json +++ b/api_docs/kbn_core_ui_settings_browser.devdocs.json @@ -605,7 +605,7 @@ "section": "def-common.UiSettingsScope", "text": "UiSettingsScope" }, - " | undefined; order?: number | undefined; name?: string | undefined; description?: string | undefined; category?: string[] | undefined; optionLabels?: Record | undefined; requiresPageReload?: boolean | undefined; readonly?: boolean | undefined; readonlyMode?: ", + " | undefined; order?: number | undefined; name?: string | undefined; category?: string[] | undefined; description?: string | undefined; metric?: { type: string; name: string; } | undefined; optionLabels?: Record | undefined; requiresPageReload?: boolean | undefined; readonly?: boolean | undefined; readonlyMode?: ", { "pluginId": "@kbn/core-ui-settings-common", "scope": "common", @@ -621,7 +621,7 @@ "section": "def-common.DeprecationSettings", "text": "DeprecationSettings" }, - " | undefined; metric?: { type: string; name: string; } | undefined; }" + " | undefined; }" ], "path": "packages/core/ui-settings/core-ui-settings-browser/src/types.ts", "deprecated": false, diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index b14c9e39286b1..a6555817244c5 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index a61906d57d1c4..533e19848a3f3 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index 49c3d761e43f4..f0bb6d14258e6 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.devdocs.json b/api_docs/kbn_core_ui_settings_common.devdocs.json index d8e254e16f2a1..ec91de536fbbe 100644 --- a/api_docs/kbn_core_ui_settings_common.devdocs.json +++ b/api_docs/kbn_core_ui_settings_common.devdocs.json @@ -357,10 +357,6 @@ "plugin": "@kbn/management-settings-field-definition", "path": "packages/kbn-management/settings/field_definition/get_definition.ts" }, - { - "plugin": "advancedSettings", - "path": "src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts" - }, { "plugin": "discover", "path": "src/plugins/discover/server/ui_settings.ts" @@ -517,7 +513,7 @@ "\nUI element type to represent the settings." ], "signature": [ - "\"string\" | \"number\" | \"boolean\" | \"undefined\" | \"select\" | \"image\" | \"color\" | \"json\" | \"array\" | \"markdown\"" + "\"string\" | \"number\" | \"boolean\" | \"undefined\" | \"color\" | \"image\" | \"select\" | \"json\" | \"array\" | \"markdown\"" ], "path": "packages/core/ui-settings/core-ui-settings-common/src/ui_settings.ts", "deprecated": false, diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index c9efaf0aae642..ea5b866165a06 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 2698235448d9b..39d688491cd95 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index 8738e8424dd2c..4189a5041ba0c 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal'] --- import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx index e42caf692d23f..3c77253890d88 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks'] --- import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index 164cdefbb4627..40cf742c97751 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx index 6db393dbb79f6..722863fb4a633 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] --- import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx index 5acb454161066..885b712bdaccd 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index d6360c1a0759e..66eb39733be26 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_internal.mdx b/api_docs/kbn_core_user_settings_server_internal.mdx index 94506d191138a..e73c31fcb13c6 100644 --- a/api_docs/kbn_core_user_settings_server_internal.mdx +++ b/api_docs/kbn_core_user_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-internal title: "@kbn/core-user-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-internal plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-internal'] --- import kbnCoreUserSettingsServerInternalObj from './kbn_core_user_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 2f4a393ed2eaf..70ff64fe82c8e 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index aff352f1caf4a..ea9bed0ea6c4e 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index 69b7cfacc45a1..ad021e5de8f7d 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index 9a3aae337f1f5..d902aa26a8305 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index 5314c78cec4b1..64143a482a366 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index d8728b517dd70..4cdbb302060a0 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx index 4cff78cdb36a6..59882cad2f877 100644 --- a/api_docs/kbn_data_forge.mdx +++ b/api_docs/kbn_data_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-forge title: "@kbn/data-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-forge plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge'] --- import kbnDataForgeObj from './kbn_data_forge.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index aceff9614257f..a8b29d8f91679 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx index c0796a1c599b8..6f3148d2cea67 100644 --- a/api_docs/kbn_data_stream_adapter.mdx +++ b/api_docs/kbn_data_stream_adapter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-stream-adapter title: "@kbn/data-stream-adapter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-stream-adapter plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter'] --- import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json'; diff --git a/api_docs/kbn_datemath.devdocs.json b/api_docs/kbn_datemath.devdocs.json index 6d6da3f87394b..71d5b783708c0 100644 --- a/api_docs/kbn_datemath.devdocs.json +++ b/api_docs/kbn_datemath.devdocs.json @@ -119,7 +119,7 @@ "label": "Unit", "description": [], "signature": [ - "\"m\" | \"s\" | \"y\" | \"M\" | \"w\" | \"d\" | \"h\" | \"ms\"" + "\"m\" | \"y\" | \"M\" | \"w\" | \"d\" | \"h\" | \"s\" | \"ms\"" ], "path": "packages/kbn-datemath/index.ts", "deprecated": false, @@ -200,7 +200,7 @@ "label": "UnitsMap", "description": [], "signature": [ - "{ m: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; s: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; y: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; M: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; w: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; d: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; h: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; ms: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; }" + "{ m: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; y: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; M: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; w: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; d: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; h: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; s: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; ms: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; }" ], "path": "packages/kbn-datemath/index.ts", "deprecated": false, diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index ca0900ce860ba..fc03ed3ccb3de 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index be94108cde6fb..8ba108bfa7fbd 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index 85d3349261d01..d13d470f5c44c 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index 83b26ab7ebe33..9fe880d9db55c 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.devdocs.json b/api_docs/kbn_deeplinks_ml.devdocs.json index 15449e28dcf5a..855a0b5a16ee3 100644 --- a/api_docs/kbn_deeplinks_ml.devdocs.json +++ b/api_docs/kbn_deeplinks_ml.devdocs.json @@ -45,7 +45,7 @@ "label": "DeepLinkId", "description": [], "signature": [ - "\"ml\" | \"ml:nodes\" | \"ml:notifications\" | \"ml:overview\" | \"ml:settings\" | \"ml:dataVisualizer\" | \"ml:memoryUsage\" | \"ml:anomalyDetection\" | \"ml:anomalyExplorer\" | \"ml:singleMetricViewer\" | \"ml:dataDrift\" | \"ml:dataFrameAnalytics\" | \"ml:resultExplorer\" | \"ml:analyticsMap\" | \"ml:aiOps\" | \"ml:logRateAnalysis\" | \"ml:logPatternAnalysis\" | \"ml:changePointDetections\" | \"ml:modelManagement\" | \"ml:nodesOverview\" | \"ml:fileUpload\" | \"ml:indexDataVisualizer\" | \"ml:calendarSettings\" | \"ml:filterListsSettings\"" + "\"ml\" | \"ml:nodes\" | \"ml:notifications\" | \"ml:overview\" | \"ml:memoryUsage\" | \"ml:settings\" | \"ml:dataVisualizer\" | \"ml:anomalyDetection\" | \"ml:anomalyExplorer\" | \"ml:singleMetricViewer\" | \"ml:dataDrift\" | \"ml:dataFrameAnalytics\" | \"ml:resultExplorer\" | \"ml:analyticsMap\" | \"ml:aiOps\" | \"ml:logRateAnalysis\" | \"ml:logPatternAnalysis\" | \"ml:changePointDetections\" | \"ml:modelManagement\" | \"ml:nodesOverview\" | \"ml:fileUpload\" | \"ml:indexDataVisualizer\" | \"ml:calendarSettings\" | \"ml:filterListsSettings\"" ], "path": "packages/deeplinks/ml/deep_links.ts", "deprecated": false, @@ -60,7 +60,7 @@ "label": "LinkId", "description": [], "signature": [ - "\"nodes\" | \"notifications\" | \"overview\" | \"settings\" | \"dataVisualizer\" | \"memoryUsage\" | \"anomalyDetection\" | \"anomalyExplorer\" | \"singleMetricViewer\" | \"dataDrift\" | \"dataFrameAnalytics\" | \"resultExplorer\" | \"analyticsMap\" | \"aiOps\" | \"logRateAnalysis\" | \"logPatternAnalysis\" | \"changePointDetections\" | \"modelManagement\" | \"nodesOverview\" | \"fileUpload\" | \"indexDataVisualizer\" | \"calendarSettings\" | \"filterListsSettings\"" + "\"nodes\" | \"notifications\" | \"overview\" | \"memoryUsage\" | \"settings\" | \"dataVisualizer\" | \"anomalyDetection\" | \"anomalyExplorer\" | \"singleMetricViewer\" | \"dataDrift\" | \"dataFrameAnalytics\" | \"resultExplorer\" | \"analyticsMap\" | \"aiOps\" | \"logRateAnalysis\" | \"logPatternAnalysis\" | \"changePointDetections\" | \"modelManagement\" | \"nodesOverview\" | \"fileUpload\" | \"indexDataVisualizer\" | \"calendarSettings\" | \"filterListsSettings\"" ], "path": "packages/deeplinks/ml/deep_links.ts", "deprecated": false, diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index 761fc256b88fa..a6249c8643247 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.devdocs.json b/api_docs/kbn_deeplinks_observability.devdocs.json index 31cd9a96e1f1e..5a36771ff4d8b 100644 --- a/api_docs/kbn_deeplinks_observability.devdocs.json +++ b/api_docs/kbn_deeplinks_observability.devdocs.json @@ -444,7 +444,7 @@ "label": "AppId", "description": [], "signature": [ - "\"metrics\" | \"synthetics\" | \"apm\" | \"logs\" | \"observability-overview\" | \"observability-log-explorer\" | \"observabilityOnboarding\"" + "\"metrics\" | \"synthetics\" | \"apm\" | \"logs\" | \"observability-overview\" | \"observability-logs-explorer\" | \"observabilityOnboarding\"" ], "path": "packages/deeplinks/observability/deep_links.ts", "deprecated": false, @@ -572,13 +572,13 @@ }, { "parentPluginId": "@kbn/deeplinks-observability", - "id": "def-common.OBSERVABILITY_LOG_EXPLORER_APP_ID", + "id": "def-common.OBSERVABILITY_LOGS_EXPLORER_APP_ID", "type": "string", "tags": [], - "label": "OBSERVABILITY_LOG_EXPLORER_APP_ID", + "label": "OBSERVABILITY_LOGS_EXPLORER_APP_ID", "description": [], "signature": [ - "\"observability-log-explorer\"" + "\"observability-logs-explorer\"" ], "path": "packages/deeplinks/observability/constants.ts", "deprecated": false, diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 3cc1bdd00a350..83b03ecdd9689 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index 771d9127a1a9b..aa9ea0f95e8fa 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index c5a361b46351e..13216ccd2afb5 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index c789108ad8dc4..69ed6c26f539e 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index 5d347386f98a8..6a790aeb510ef 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index b5e1255a156fe..86cdebcaef6a2 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 494a5ad30fadd..4cfb37e5dee33 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index 09f651e6d401d..dd5624cfe0eaf 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 31c93ce4e74e2..7e1b068de1fd3 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index a67e392e24cc0..7b420e212a10e 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 129a8fe5796c7..11e99cb478283 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.devdocs.json b/api_docs/kbn_doc_links.devdocs.json index 5e9bd89ba93b7..9b772c4ce3b2e 100644 --- a/api_docs/kbn_doc_links.devdocs.json +++ b/api_docs/kbn_doc_links.devdocs.json @@ -952,7 +952,7 @@ "label": "serverlessSearch", "description": [], "signature": [ - "{ readonly gettingStartedExplore: string; readonly gettingStartedIngest: string; readonly gettingStartedSearch: string; readonly integrations: string; readonly integrationsBeats: string; readonly integrationsConnectorClient: string; readonly integrationsConnectorClientRunFromSource: string; readonly integrationsConnectorClientRunWithDocker: string; readonly integrationsLogstash: string; }" + "{ readonly gettingStartedExplore: string; readonly gettingStartedIngest: string; readonly gettingStartedSearch: string; readonly integrations: string; readonly integrationsBeats: string; readonly integrationsConnectorClient: string; readonly integrationsConnectorClientAvailableConnectors: string; readonly integrationsConnectorClientRunFromSource: string; readonly integrationsConnectorClientRunWithDocker: string; readonly integrationsLogstash: string; }" ], "path": "packages/kbn-doc-links/src/types.ts", "deprecated": false, diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index d8c8048a4138b..bdd2a60d032a1 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index c8fccbaf3640c..41e6503b16028 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index 20847765cce58..36d2dcdca96d6 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 65c450de7485d..f8948c530abc4 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs.mdx b/api_docs/kbn_ecs.mdx index 306a49d505070..fc13702066dc0 100644 --- a/api_docs/kbn_ecs.mdx +++ b/api_docs/kbn_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs title: "@kbn/ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs'] --- import kbnEcsObj from './kbn_ecs.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index deec68881b81c..a29c7ecb80309 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_agent_utils.devdocs.json b/api_docs/kbn_elastic_agent_utils.devdocs.json index 7d999aacc3ca5..9814a2afd0fa3 100644 --- a/api_docs/kbn_elastic_agent_utils.devdocs.json +++ b/api_docs/kbn_elastic_agent_utils.devdocs.json @@ -431,7 +431,7 @@ "label": "AgentName", "description": [], "signature": [ - "\"ruby\" | \"java\" | \"go\" | \"dotnet\" | \"php\" | \"otlp\" | \"android/java\" | \"iOS/swift\" | \"rum-js\" | \"js-base\" | \"opentelemetry/webjs\" | \"opentelemetry/java\" | \"nodejs\" | \"python\" | \"opentelemetry/cpp\" | \"opentelemetry/dotnet\" | \"opentelemetry/erlang\" | \"opentelemetry/go\" | \"opentelemetry/nodejs\" | \"opentelemetry/php\" | \"opentelemetry/python\" | \"opentelemetry/ruby\" | \"opentelemetry/rust\" | \"opentelemetry/swift\" | \"opentelemetry/android\"" + "\"java\" | \"ruby\" | \"go\" | \"dotnet\" | \"php\" | \"otlp\" | \"android/java\" | \"iOS/swift\" | \"rum-js\" | \"js-base\" | \"opentelemetry/webjs\" | \"opentelemetry/java\" | \"nodejs\" | \"python\" | \"opentelemetry/cpp\" | \"opentelemetry/dotnet\" | \"opentelemetry/erlang\" | \"opentelemetry/go\" | \"opentelemetry/nodejs\" | \"opentelemetry/php\" | \"opentelemetry/python\" | \"opentelemetry/ruby\" | \"opentelemetry/rust\" | \"opentelemetry/swift\" | \"opentelemetry/android\"" ], "path": "packages/kbn-elastic-agent-utils/src/agent_names.ts", "deprecated": false, @@ -470,7 +470,7 @@ "\nWe cannot mark these arrays as const and derive their type\nbecause we need to be able to assign them as mutable entities for ES queries." ], "signature": [ - "\"ruby\" | \"java\" | \"go\" | \"dotnet\" | \"php\" | \"android/java\" | \"iOS/swift\" | \"rum-js\" | \"js-base\" | \"nodejs\" | \"python\"" + "\"java\" | \"ruby\" | \"go\" | \"dotnet\" | \"php\" | \"android/java\" | \"iOS/swift\" | \"rum-js\" | \"js-base\" | \"nodejs\" | \"python\"" ], "path": "packages/kbn-elastic-agent-utils/src/agent_names.ts", "deprecated": false, diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index 505e530286e1c..cd0563317f2a6 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.devdocs.json b/api_docs/kbn_elastic_assistant.devdocs.json index e030fde8ab4f7..46cde1beda927 100644 --- a/api_docs/kbn_elastic_assistant.devdocs.json +++ b/api_docs/kbn_elastic_assistant.devdocs.json @@ -1456,7 +1456,7 @@ "\nThis interface is used to pass a default or base set of contexts to the Elastic AI Assistant when\ninitializing it. This is used to provide 'category' options when users create Quick Prompts.\nAlso, useful for collating all of a solutions' prompts in one place.\n\ne.g. see Security Solution's x-pack/plugins/security_solution/public/assistant/prompt_contexts/index.tsx" ], "signature": [ - "{ description: string; category: string; tooltip: React.ReactNode; suggestedUserPrompt?: string | undefined; }" + "{ category: string; description: string; tooltip: React.ReactNode; suggestedUserPrompt?: string | undefined; }" ], "path": "x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_context/types.ts", "deprecated": false, diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index 802adf54308d1..888d9cf88a210 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.devdocs.json b/api_docs/kbn_elastic_assistant_common.devdocs.json index 70868de1afb0b..20d99ef3d3124 100644 --- a/api_docs/kbn_elastic_assistant_common.devdocs.json +++ b/api_docs/kbn_elastic_assistant_common.devdocs.json @@ -471,6 +471,36 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.Dataset", + "type": "Type", + "tags": [], + "label": "Dataset", + "description": [], + "signature": [ + "{ input: string; reference: string; id?: string | undefined; prediction?: string | undefined; tags?: string[] | undefined; }[]" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DatasetItem", + "type": "Type", + "tags": [], + "label": "DatasetItem", + "description": [], + "signature": [ + "{ input: string; reference: string; id?: string | undefined; prediction?: string | undefined; tags?: string[] | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/elastic-assistant-common", "id": "def-common.GetCapabilitiesResponse", @@ -485,9 +515,251 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.GetEvaluateResponse", + "type": "Type", + "tags": [], + "label": "GetEvaluateResponse", + "description": [], + "signature": [ + "{ agentExecutors: string[]; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/get_evaluate_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.INTERNAL_API_ACCESS", + "type": "string", + "tags": [], + "label": "INTERNAL_API_ACCESS", + "description": [], + "signature": [ + "\"internal\"" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.OutputIndex", + "type": "Type", + "tags": [], + "label": "OutputIndex", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.PostEvaluateBody", + "type": "Type", + "tags": [], + "label": "PostEvaluateBody", + "description": [], + "signature": [ + "{ dataset?: { input: string; reference: string; id?: string | undefined; prediction?: string | undefined; tags?: string[] | undefined; }[] | undefined; evalPrompt?: string | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.PostEvaluateRequestBody", + "type": "Type", + "tags": [], + "label": "PostEvaluateRequestBody", + "description": [], + "signature": [ + "{ dataset?: { input: string; reference: string; id?: string | undefined; prediction?: string | undefined; tags?: string[] | undefined; }[] | undefined; evalPrompt?: string | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.PostEvaluateRequestBodyInput", + "type": "Type", + "tags": [], + "label": "PostEvaluateRequestBodyInput", + "description": [], + "signature": [ + "{ dataset?: { input: string; reference: string; id?: string | undefined; prediction?: string | undefined; tags?: string[] | undefined; }[] | undefined; evalPrompt?: string | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.PostEvaluateRequestQuery", + "type": "Type", + "tags": [], + "label": "PostEvaluateRequestQuery", + "description": [], + "signature": [ + "{ agents: string; models: string; outputIndex: string; datasetName?: string | undefined; evaluationType?: string | undefined; evalModel?: string | undefined; projectName?: string | undefined; runName?: string | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.PostEvaluateRequestQueryInput", + "type": "Type", + "tags": [], + "label": "PostEvaluateRequestQueryInput", + "description": [], + "signature": [ + "{ agents: string; models: string; outputIndex: string; datasetName?: string | undefined; evaluationType?: string | undefined; evalModel?: string | undefined; projectName?: string | undefined; runName?: string | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.PostEvaluateResponse", + "type": "Type", + "tags": [], + "label": "PostEvaluateResponse", + "description": [], + "signature": [ + "{ success: boolean; evaluationId: string; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.PUBLIC_API_ACCESS", + "type": "string", + "tags": [], + "label": "PUBLIC_API_ACCESS", + "description": [], + "signature": [ + "\"public\"" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false } ], "objects": [ + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.API_VERSIONS", + "type": "Object", + "tags": [], + "label": "API_VERSIONS", + "description": [], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.API_VERSIONS.public", + "type": "Object", + "tags": [], + "label": "public", + "description": [], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.API_VERSIONS.public.v1", + "type": "string", + "tags": [], + "label": "v1", + "description": [], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.API_VERSIONS.internal", + "type": "Object", + "tags": [], + "label": "internal", + "description": [], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.API_VERSIONS.internal.v1", + "type": "string", + "tags": [], + "label": "v1", + "description": [], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.Dataset", + "type": "Object", + "tags": [], + "label": "Dataset", + "description": [], + "signature": [ + "Zod.ZodDefault; input: Zod.ZodString; prediction: Zod.ZodOptional; reference: Zod.ZodString; tags: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { input: string; reference: string; id?: string | undefined; prediction?: string | undefined; tags?: string[] | undefined; }, { input: string; reference: string; id?: string | undefined; prediction?: string | undefined; tags?: string[] | undefined; }>, \"many\">>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.DatasetItem", + "type": "Object", + "tags": [], + "label": "DatasetItem", + "description": [], + "signature": [ + "Zod.ZodObject<{ id: Zod.ZodOptional; input: Zod.ZodString; prediction: Zod.ZodOptional; reference: Zod.ZodString; tags: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { input: string; reference: string; id?: string | undefined; prediction?: string | undefined; tags?: string[] | undefined; }, { input: string; reference: string; id?: string | undefined; prediction?: string | undefined; tags?: string[] | undefined; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/elastic-assistant-common", "id": "def-common.defaultAssistantFeatures", @@ -519,6 +791,96 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.GetEvaluateResponse", + "type": "Object", + "tags": [], + "label": "GetEvaluateResponse", + "description": [], + "signature": [ + "Zod.ZodObject<{ agentExecutors: Zod.ZodArray; }, \"strip\", Zod.ZodTypeAny, { agentExecutors: string[]; }, { agentExecutors: string[]; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/get_evaluate_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.OutputIndex", + "type": "Object", + "tags": [], + "label": "OutputIndex", + "description": [], + "signature": [ + "Zod.ZodString" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.PostEvaluateBody", + "type": "Object", + "tags": [], + "label": "PostEvaluateBody", + "description": [], + "signature": [ + "Zod.ZodObject<{ dataset: Zod.ZodOptional; input: Zod.ZodString; prediction: Zod.ZodOptional; reference: Zod.ZodString; tags: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { input: string; reference: string; id?: string | undefined; prediction?: string | undefined; tags?: string[] | undefined; }, { input: string; reference: string; id?: string | undefined; prediction?: string | undefined; tags?: string[] | undefined; }>, \"many\">>>; evalPrompt: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { dataset?: { input: string; reference: string; id?: string | undefined; prediction?: string | undefined; tags?: string[] | undefined; }[] | undefined; evalPrompt?: string | undefined; }, { dataset?: { input: string; reference: string; id?: string | undefined; prediction?: string | undefined; tags?: string[] | undefined; }[] | undefined; evalPrompt?: string | undefined; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.PostEvaluateRequestBody", + "type": "Object", + "tags": [], + "label": "PostEvaluateRequestBody", + "description": [], + "signature": [ + "Zod.ZodObject<{ dataset: Zod.ZodOptional; input: Zod.ZodString; prediction: Zod.ZodOptional; reference: Zod.ZodString; tags: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { input: string; reference: string; id?: string | undefined; prediction?: string | undefined; tags?: string[] | undefined; }, { input: string; reference: string; id?: string | undefined; prediction?: string | undefined; tags?: string[] | undefined; }>, \"many\">>>; evalPrompt: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { dataset?: { input: string; reference: string; id?: string | undefined; prediction?: string | undefined; tags?: string[] | undefined; }[] | undefined; evalPrompt?: string | undefined; }, { dataset?: { input: string; reference: string; id?: string | undefined; prediction?: string | undefined; tags?: string[] | undefined; }[] | undefined; evalPrompt?: string | undefined; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.PostEvaluateRequestQuery", + "type": "Object", + "tags": [], + "label": "PostEvaluateRequestQuery", + "description": [], + "signature": [ + "Zod.ZodObject<{ agents: Zod.ZodString; datasetName: Zod.ZodOptional; evaluationType: Zod.ZodOptional; evalModel: Zod.ZodOptional; models: Zod.ZodString; outputIndex: Zod.ZodString; projectName: Zod.ZodOptional; runName: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { agents: string; models: string; outputIndex: string; datasetName?: string | undefined; evaluationType?: string | undefined; evalModel?: string | undefined; projectName?: string | undefined; runName?: string | undefined; }, { agents: string; models: string; outputIndex: string; datasetName?: string | undefined; evaluationType?: string | undefined; evalModel?: string | undefined; projectName?: string | undefined; runName?: string | undefined; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.PostEvaluateResponse", + "type": "Object", + "tags": [], + "label": "PostEvaluateResponse", + "description": [], + "signature": [ + "Zod.ZodObject<{ evaluationId: Zod.ZodString; success: Zod.ZodBoolean; }, \"strip\", Zod.ZodTypeAny, { success: boolean; evaluationId: string; }, { success: boolean; evaluationId: string; }>" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.gen.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false } ] } diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index c26cdba43916d..0d710a1c4870c 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 34 | 0 | 32 | 0 | +| 59 | 0 | 57 | 0 | ## Common diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 806bfa95069ac..40d4cdc525fc6 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.devdocs.json b/api_docs/kbn_es_archiver.devdocs.json index 5d85480e5222b..e9b050f6f497b 100644 --- a/api_docs/kbn_es_archiver.devdocs.json +++ b/api_docs/kbn_es_archiver.devdocs.json @@ -435,7 +435,15 @@ "\nJust like load, but skips any existing index\n" ], "signature": [ - "(name: string) => Promise Promise>" ], @@ -457,6 +465,28 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "@kbn/es-archiver", + "id": "def-common.EsArchiver.loadIfNeeded.$2", + "type": "Object", + "tags": [], + "label": "performance", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-archiver", + "scope": "common", + "docId": "kibKbnEsArchiverPluginApi", + "section": "def-common.LoadActionPerfOptions", + "text": "LoadActionPerfOptions" + }, + " | undefined" + ], + "path": "packages/kbn-es-archiver/src/es_archiver.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false } ], "returnComment": [] diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index 231c6f5c92e5d..8c177cdba4b2f 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kiban | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 31 | 0 | 18 | 1 | +| 32 | 0 | 19 | 1 | ## Common diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index 493badbded104..89fa27dad0fd7 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index caef60f944df7..23c320f4d3bec 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index d123a1e35c056..a0a022fdbe7f9 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index d1c7aa5fa2373..e7f8386eafe26 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.devdocs.json b/api_docs/kbn_event_annotation_common.devdocs.json index 6ff4540b70920..a9fa9aea231b0 100644 --- a/api_docs/kbn_event_annotation_common.devdocs.json +++ b/api_docs/kbn_event_annotation_common.devdocs.json @@ -521,7 +521,7 @@ "label": "AvailableAnnotationIcon", "description": [], "signature": [ - "\"alert\" | \"circle\" | \"tag\" | \"asterisk\" | \"bell\" | \"bolt\" | \"bug\" | \"editorComment\" | \"flag\" | \"heart\" | \"mapMarker\" | \"pinFilled\" | \"starEmpty\" | \"starFilled\" | \"triangle\"" + "\"alert\" | \"tag\" | \"asterisk\" | \"bell\" | \"bolt\" | \"bug\" | \"editorComment\" | \"flag\" | \"heart\" | \"mapMarker\" | \"pinFilled\" | \"starEmpty\" | \"starFilled\" | \"circle\" | \"triangle\"" ], "path": "packages/kbn-event-annotation-common/types.ts", "deprecated": false, diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index fc139464d8696..72bcc533184e3 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index e27f9794eb244..716caecfe352a 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index fe2a47cf566f7..b5b6114af438b 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index f23bfd9273cb9..9b4c578e9862e 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index 199303d574eb3..f51a1548d1b83 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 9b9d4d074bb93..f1222038a80b9 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index f1efebded763e..7cef3497dc15f 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index 2d29e9efa47f7..085def5d07de8 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.mdx +++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services title: "@kbn/ftr-common-functional-ui-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-ui-services plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index 1a1e5a9330b8e..68ea55293ea03 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index d4814ca947b26..b8a3f88594796 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.devdocs.json b/api_docs/kbn_generate_csv.devdocs.json index bae04bb221d40..2c04fe339b8d4 100644 --- a/api_docs/kbn_generate_csv.devdocs.json +++ b/api_docs/kbn_generate_csv.devdocs.json @@ -448,25 +448,7 @@ } ], "enums": [], - "misc": [ - { - "parentPluginId": "@kbn/generate-csv", - "id": "def-server.CsvPagingStrategy", - "type": "Type", - "tags": [], - "label": "CsvPagingStrategy", - "description": [ - "\nDuplicated from @kbn/reporting-export-types-csv-common to reduce dependencies" - ], - "signature": [ - "\"scroll\" | \"pit\"" - ], - "path": "packages/kbn-generate-csv/types.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - } - ], + "misc": [], "objects": [] }, "common": { diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index f4616a4fb961f..4806f3871b58e 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 26 | 0 | 25 | 1 | +| 25 | 0 | 25 | 1 | ## Server @@ -31,6 +31,3 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh ### Interfaces -### Consts, variables and types - - diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 28a28a70c57f9..458ce29dea08b 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index ed9c068ea0dee..30d6ed11788fb 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index ad3a20db0d999..a0c7b5f4ec7bc 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index 8b113c005b018..54c059bd2258c 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.devdocs.json b/api_docs/kbn_home_sample_data_card.devdocs.json index 7bc80108253eb..73cb743b47a75 100644 --- a/api_docs/kbn_home_sample_data_card.devdocs.json +++ b/api_docs/kbn_home_sample_data_card.devdocs.json @@ -633,7 +633,7 @@ "\nParameters drawn from the Storybook arguments collection that customize a component story." ], "signature": [ - "{ name: any; description: any; status: any; includeAppLinks: any; simulateErrors: any; }" + "{ name: any; status: any; description: any; includeAppLinks: any; simulateErrors: any; }" ], "path": "packages/home/sample_data_card/src/mocks/index.ts", "deprecated": false, diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index 88fcbe114d2ae..1f4639d32a971 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index 6b2d6d0a10d3e..18635d3454e5a 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index 48f57f6471171..3ec2a6bb99768 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index 34e9adf53e413..5c707f8fab700 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index 4b5c26f1f85d0..93d89c073dad4 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index e9a3cb255464e..e83c51029be1e 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 5d8c12c4cc102..fc2322bc78663 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index d86269a03cb76..bd4735ac34f92 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 010329466d131..d86130f1ec725 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx index 77f22b4c7dc8e..c2b333fa46a7b 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index cda8578037c32..4b35f39fa05df 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index e1044f2dfefec..d8edeb4e9dbed 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index 8c942b7565fd1..4ba4a9b25bc7a 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 4a2e67adc7494..3840630fec598 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx index 8806be33b58a3..1c5e3bb4a4cd1 100644 --- a/api_docs/kbn_lens_formula_docs.mdx +++ b/api_docs/kbn_lens_formula_docs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-formula-docs title: "@kbn/lens-formula-docs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-formula-docs plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] --- import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 5962e103242d3..23621eacd6460 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index bdf4c612aa140..0f91c93890e24 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx index 3589cf5f32224..04ea7afc43325 100644 --- a/api_docs/kbn_managed_content_badge.mdx +++ b/api_docs/kbn_managed_content_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-content-badge title: "@kbn/managed-content-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-content-badge plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge'] --- import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index dcce58d12dd9e..d4f7f519373a4 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index 660b5fa539f39..c70d52a5d0dd6 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.devdocs.json b/api_docs/kbn_management_settings_application.devdocs.json index b9bda648adcb9..77e40adbad7ea 100644 --- a/api_docs/kbn_management_settings_application.devdocs.json +++ b/api_docs/kbn_management_settings_application.devdocs.json @@ -27,7 +27,7 @@ "label": "KibanaSettingsApplication", "description": [], "signature": [ - "({ docLinks, i18n, notifications, settings, theme, history, }: ", + "({ docLinks, i18n, notifications, settings, theme, history, sectionRegistry, application, chrome, }: ", { "pluginId": "@kbn/management-settings-application", "scope": "common", @@ -46,7 +46,7 @@ "id": "def-common.KibanaSettingsApplication.$1", "type": "CompoundType", "tags": [], - "label": "{\n docLinks,\n i18n,\n notifications,\n settings,\n theme,\n history,\n}", + "label": "{\n docLinks,\n i18n,\n notifications,\n settings,\n theme,\n history,\n sectionRegistry,\n application,\n chrome,\n}", "description": [], "signature": [ { diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index 2b4c67a7d206f..e8d25e87935db 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index c3bca4e3c98f7..81f1b45ee2aba 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index fb1b2151368f2..f5ee266d82943 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.devdocs.json b/api_docs/kbn_management_settings_components_field_row.devdocs.json index cd5f91dc13d4c..052a3e23ff500 100644 --- a/api_docs/kbn_management_settings_components_field_row.devdocs.json +++ b/api_docs/kbn_management_settings_components_field_row.devdocs.json @@ -203,7 +203,7 @@ "section": "def-common.UiSettingsType", "text": "UiSettingsType" }, - "; id: string; defaultValue?: string | number | boolean | (string | number)[] | null | undefined; name: string; displayName: string; groupId: string; isCustom: boolean; isOverridden: boolean; ariaAttributes: { ariaLabel: string; ariaDescribedBy?: string | undefined; }; savedValue?: string | number | boolean | (string | number)[] | null | undefined; defaultValueDisplay: string; isDefaultValue: boolean; unsavedFieldId: string; }" + "; id: string; defaultValue?: string | number | boolean | (string | number)[] | null | undefined; name: string; groupId: string; displayName: string; isCustom: boolean; isOverridden: boolean; ariaAttributes: { ariaLabel: string; ariaDescribedBy?: string | undefined; }; savedValue?: string | number | boolean | (string | number)[] | null | undefined; defaultValueDisplay: string; isDefaultValue: boolean; unsavedFieldId: string; }" ], "path": "packages/kbn-management/settings/components/field_row/field_row.tsx", "deprecated": false, diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index cecc9ea19d31d..828a4cdeaea29 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index 338f0ad098f1a..a30c7329f2519 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index 1725f484044b3..8c59f99161e67 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index 87ecfa6dd312a..b88a3b2f60a78 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index aaf2603a6482b..46bd2184e70b6 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.devdocs.json b/api_docs/kbn_management_settings_types.devdocs.json index 7e5559286fffd..613c085d5a7a8 100644 --- a/api_docs/kbn_management_settings_types.devdocs.json +++ b/api_docs/kbn_management_settings_types.devdocs.json @@ -482,6 +482,108 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.SettingsCapabilities", + "type": "Interface", + "tags": [], + "label": "SettingsCapabilities", + "description": [], + "path": "packages/kbn-management/settings/types/capabilities.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.SettingsCapabilities.spaceSettings", + "type": "Object", + "tags": [], + "label": "spaceSettings", + "description": [], + "signature": [ + "SettingCapability" + ], + "path": "packages/kbn-management/settings/types/capabilities.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.SettingsCapabilities.globalSettings", + "type": "Object", + "tags": [], + "label": "globalSettings", + "description": [], + "signature": [ + "SettingCapability" + ], + "path": "packages/kbn-management/settings/types/capabilities.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.SettingsTabs", + "type": "Interface", + "tags": [], + "label": "SettingsTabs", + "description": [], + "path": "packages/kbn-management/settings/types/tab.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.SettingsTabs.Unnamed", + "type": "IndexSignature", + "tags": [], + "label": "[id: string]: { name: string; fields: FieldDefinition[]; categoryCounts: CategoryCounts; callOutTitle: string; callOutText: string; sections: RegistryEntry[]; isSavingEnabled: boolean; }", + "description": [], + "signature": [ + "[id: string]: { name: string; fields: ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.FieldDefinition", + "text": "FieldDefinition" + }, + "<", + { + "pluginId": "@kbn/core-ui-settings-common", + "scope": "common", + "docId": "kibKbnCoreUiSettingsCommonPluginApi", + "section": "def-common.UiSettingsType", + "text": "UiSettingsType" + }, + ", string | number | boolean | (string | number)[] | null | undefined>[]; categoryCounts: ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.CategoryCounts", + "text": "CategoryCounts" + }, + "; callOutTitle: string; callOutText: string; sections: ", + { + "pluginId": "@kbn/management-settings-section-registry", + "scope": "common", + "docId": "kibKbnManagementSettingsSectionRegistryPluginApi", + "section": "def-common.RegistryEntry", + "text": "RegistryEntry" + }, + "[]; isSavingEnabled: boolean; }" + ], + "path": "packages/kbn-management/settings/types/tab.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/management-settings-types", "id": "def-common.UiSettingMetadata", @@ -1169,7 +1271,7 @@ "\nThis is a narrowing type, which finds the correct primitive type based on a\ngiven {@link SettingType}." ], "signature": [ - "T extends \"string\" | \"select\" | \"image\" | \"color\" | \"json\" | \"markdown\" ? string : T extends \"boolean\" ? boolean : T extends \"number\" | \"bigint\" ? number : T extends \"array\" ? (string | number)[] : T extends \"undefined\" ? undefined : never" + "T extends \"string\" | \"color\" | \"image\" | \"select\" | \"json\" | \"markdown\" ? string : T extends \"boolean\" ? boolean : T extends \"number\" | \"bigint\" ? number : T extends \"array\" ? (string | number)[] : T extends \"undefined\" ? undefined : never" ], "path": "packages/kbn-management/settings/types/setting_type.ts", "deprecated": false, @@ -1527,7 +1629,7 @@ "\nThis is a local type equivalent to {@link UiSettingsType} for flexibility." ], "signature": [ - "\"string\" | \"number\" | \"boolean\" | \"undefined\" | \"select\" | \"image\" | \"color\" | \"json\" | \"array\" | \"markdown\"" + "\"string\" | \"number\" | \"boolean\" | \"undefined\" | \"color\" | \"image\" | \"select\" | \"json\" | \"array\" | \"markdown\"" ], "path": "packages/kbn-management/settings/types/setting_type.ts", "deprecated": false, @@ -1568,7 +1670,7 @@ "\nA narrowing type representing all {@link SettingType} values that correspond\nto an `string` primitive type value." ], "signature": [ - "\"string\" | \"select\" | \"image\" | \"color\" | \"json\" | \"markdown\"" + "\"string\" | \"color\" | \"image\" | \"select\" | \"json\" | \"markdown\"" ], "path": "packages/kbn-management/settings/types/setting_type.ts", "deprecated": false, diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index b4897ee080237..8e65b7aed3981 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/platform-deployment-management](https://github.com/orgs/elasti | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 83 | 0 | 5 | 0 | +| 88 | 0 | 10 | 0 | ## Common diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index bd26144824221..833fac8fddc37 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index 682a8c24be44f..25e10fcda4a22 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.devdocs.json b/api_docs/kbn_mapbox_gl.devdocs.json index 0be4f729b7150..b3517dd00c74b 100644 --- a/api_docs/kbn_mapbox_gl.devdocs.json +++ b/api_docs/kbn_mapbox_gl.devdocs.json @@ -9009,7 +9009,7 @@ "label": "sourceDataType", "description": [], "signature": [ - "\"metadata\" | \"content\" | \"visibility\" | \"idle\"" + "\"content\" | \"metadata\" | \"visibility\" | \"idle\"" ], "path": "node_modules/maplibre-gl/dist/maplibre-gl.d.ts", "deprecated": false, @@ -9592,7 +9592,7 @@ "label": "MapEvent", "description": [], "signature": [ - "\"error\" | \"data\" | \"remove\" | \"render\" | \"rotate\" | \"resize\" | \"idle\" | \"zoom\" | \"load\" | \"move\" | \"mousedown\" | \"mouseup\" | \"mouseover\" | \"mousemove\" | \"click\" | \"dblclick\" | \"mouseenter\" | \"mouseleave\" | \"mouseout\" | \"contextmenu\" | \"wheel\" | \"touchstart\" | \"touchend\" | \"touchmove\" | \"touchcancel\" | \"movestart\" | \"moveend\" | \"dragstart\" | \"drag\" | \"dragend\" | \"zoomstart\" | \"zoomend\" | \"rotatestart\" | \"rotateend\" | \"pitchstart\" | \"pitch\" | \"pitchend\" | \"boxzoomstart\" | \"boxzoomend\" | \"boxzoomcancel\" | \"webglcontextlost\" | \"webglcontextrestored\" | \"styledata\" | \"sourcedata\" | \"dataloading\" | \"styledataloading\" | \"sourcedataloading\" | \"styleimagemissing\" | \"style.load\" | \"terrain\" | \"dataabort\" | \"sourcedataabort\"" + "\"error\" | \"remove\" | \"data\" | \"render\" | \"rotate\" | \"resize\" | \"idle\" | \"zoom\" | \"load\" | \"move\" | \"mousedown\" | \"mouseup\" | \"mouseover\" | \"mousemove\" | \"click\" | \"dblclick\" | \"mouseenter\" | \"mouseleave\" | \"mouseout\" | \"contextmenu\" | \"wheel\" | \"touchstart\" | \"touchend\" | \"touchmove\" | \"touchcancel\" | \"movestart\" | \"moveend\" | \"dragstart\" | \"drag\" | \"dragend\" | \"zoomstart\" | \"zoomend\" | \"rotatestart\" | \"rotateend\" | \"pitchstart\" | \"pitch\" | \"pitchend\" | \"boxzoomstart\" | \"boxzoomend\" | \"boxzoomcancel\" | \"webglcontextlost\" | \"webglcontextrestored\" | \"styledata\" | \"sourcedata\" | \"dataloading\" | \"styledataloading\" | \"sourcedataloading\" | \"styleimagemissing\" | \"style.load\" | \"terrain\" | \"dataabort\" | \"sourcedataabort\"" ], "path": "node_modules/maplibre-gl/dist/maplibre-gl.d.ts", "deprecated": false, diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index ef9400e91ccbd..68144949ec041 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index a18f554074f77..0e895f803b90e 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index a89b698df3ac2..230118c3c04ec 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index 8c2a1d7c21870..f26ff8d353dd7 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index 6d54e9fda12ac..72bbfa6c4c9ae 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index fa30a6bdb1c5a..eb69ef0f06518 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index 60baaa3a47535..85d0853f7e40d 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index 4d31683b6154d..6c4f3efce7760 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 409b4caae6a3b..823d56c46d1ee 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index ec3cc8e2ace37..16eccdec6a753 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index e68510843a590..503ab56558e99 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 9ed5b0e73cfa6..6a24ac8826efa 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index 24c88b956268b..e8bd0c206256f 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined'] --- import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index 65167254fde5b..478f60e9d2f8f 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index c2786dbb9c28a..cd469c09b8f20 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index 881cf4467557f..28ab58699b355 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage'] --- import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json'; diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx index 5586301b1c085..1ebf656eefcce 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index 12f7e2fb767bc..bd657f7376c62 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 2415d055d6b6e..1d26c36b0c20d 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index 2b714ab9c18df..b82a2d4a2130c 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index 0452a7496d376..3be009fc8474e 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index b0c6e5b82f6e2..9e00f0f7a51cb 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index c514fa5a6d45a..4c2be914f1058 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index c9ce6d58d5301..2a1b2d2703223 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index b838ada545d7e..7b5bb49720e7f 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] --- import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 67ea0618937d4..767a70b5e8b79 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index 4257a72892fd5..7c86f005a70f6 100644 --- a/api_docs/kbn_mock_idp_utils.mdx +++ b/api_docs/kbn_mock_idp_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mock-idp-utils title: "@kbn/mock-idp-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mock-idp-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils'] --- import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 8149b79d06def..2027c90e14538 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index 125144e265b05..010cff2cec554 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index 09849284c9c6d..5048ccfdc1e6d 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index da184512d77b9..286d8ee59ec1c 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx index 55a90b307ba91..b33178647525d 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index 347b74807d742..596241133c49b 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler'] --- import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index e12a73ebc3de2..a689678c63774 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index be6ff42bb2013..df89575c87953 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index 3d3a924afb8fc..4e6fee3f5c581 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index d1f1d4ae38048..c7da788960af3 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index 1be6c960ffae2..9ff15fd62fbc9 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader'] --- import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 80f6a3603f8ca..a9743ad36a05a 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_check.mdx b/api_docs/kbn_plugin_check.mdx index ea92bcb310208..4881bdd71a047 100644 --- a/api_docs/kbn_plugin_check.mdx +++ b/api_docs/kbn_plugin_check.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-check title: "@kbn/plugin-check" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-check plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-check'] --- import kbnPluginCheckObj from './kbn_plugin_check.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 6a0d7f069f4bf..8a075737c25e1 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index 252adcf7d5fdc..a2470bdb7296b 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index 525d79171c501..c0aa8f7897fc9 100644 --- a/api_docs/kbn_presentation_containers.mdx +++ b/api_docs/kbn_presentation_containers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-containers title: "@kbn/presentation-containers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-containers plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; diff --git a/api_docs/kbn_presentation_library.mdx b/api_docs/kbn_presentation_library.mdx index d840b1436231b..483051639f6b3 100644 --- a/api_docs/kbn_presentation_library.mdx +++ b/api_docs/kbn_presentation_library.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-library title: "@kbn/presentation-library" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-library plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-library'] --- import kbnPresentationLibraryObj from './kbn_presentation_library.devdocs.json'; diff --git a/api_docs/kbn_presentation_publishing.devdocs.json b/api_docs/kbn_presentation_publishing.devdocs.json index 335105fe51e89..a308785690636 100644 --- a/api_docs/kbn_presentation_publishing.devdocs.json +++ b/api_docs/kbn_presentation_publishing.devdocs.json @@ -233,7 +233,7 @@ "label": "apiIsOfType", "description": [], "signature": [ - "(api: unknown, typeToCheck: string) => api is ", + "(api: unknown, typeToCheck: T) => api is ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", @@ -265,12 +265,12 @@ { "parentPluginId": "@kbn/presentation-publishing", "id": "def-common.apiIsOfType.$2", - "type": "string", + "type": "Uncategorized", "tags": [], "label": "typeToCheck", "description": [], "signature": [ - "string" + "T" ], "path": "packages/presentation/presentation_publishing/interfaces/has_type.ts", "deprecated": false, @@ -6483,7 +6483,7 @@ "label": "ViewMode", "description": [], "signature": [ - "\"view\" | \"edit\" | \"print\" | \"preview\"" + "\"edit\" | \"view\" | \"print\" | \"preview\"" ], "path": "packages/presentation/presentation_publishing/interfaces/publishes_view_mode.ts", "deprecated": false, diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index dbd3fc487ee61..d311642fcc51d 100644 --- a/api_docs/kbn_presentation_publishing.mdx +++ b/api_docs/kbn_presentation_publishing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-publishing title: "@kbn/presentation-publishing" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-publishing plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 53584e2ac55fe..fe2d2af283996 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 06b4bb1282b4f..4ef52da35cae6 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index b84fc599c3c03..220db35d74a8f 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index 7d1eb9f1e1070..9953c25af5a36 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index d13eed39393b9..44c29aa11edb3 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index ed67848895281..a8429808c7457 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 7b61988658841..b2ee89160fa10 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index d5ba4ccaf6876..dd627fb9cfe9c 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index fc85146e3a6ce..dc332c3c4c881 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index de1689846ff02..1142de6be7f01 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index e151654d53be8..5992fad292958 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index b5e7b8f552b34..310bab6041394 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index 58bf76d5037dd..20188b132ce74 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index 6472286656558..628455c60ca83 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 80 | 0 | 72 | 8 | +| 80 | 0 | 72 | 9 | ## Common diff --git a/api_docs/kbn_reporting_export_types_csv.devdocs.json b/api_docs/kbn_reporting_export_types_csv.devdocs.json index eaca8ba4c5542..a5211d7f01ce1 100644 --- a/api_docs/kbn_reporting_export_types_csv.devdocs.json +++ b/api_docs/kbn_reporting_export_types_csv.devdocs.json @@ -245,13 +245,7 @@ " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", "LayoutSelectorDictionary", "> | undefined; zoom?: number | undefined; } | undefined; pagingStrategy: ", - { - "pluginId": "@kbn/generate-csv", - "scope": "server", - "docId": "kibKbnGenerateCsvPluginApi", - "section": "def-server.CsvPagingStrategy", - "text": "CsvPagingStrategy" - }, + "CsvPagingStrategy", "; }>" ], "path": "packages/kbn-reporting/export_types/csv/csv_searchsource.ts", @@ -979,7 +973,7 @@ "section": "def-common.KibanaRequest", "text": "KibanaRequest" }, - ") => Promise<{ title: string; objectType: string; isDeprecated: boolean; version: string; layout?: { id?: ", + ") => Promise<{ title: string; objectType: \"search\"; pagingStrategy: \"scroll\" | \"pit\"; version: string; layout?: { id?: ", { "pluginId": "screenshotting", "scope": "common", @@ -999,7 +993,7 @@ "section": "def-common.SerializableRecord", "text": "SerializableRecord" }, - ">[]; browserTimezone: string; pagingStrategy?: \"scroll\" | \"pit\" | undefined; }>" + ">[]; browserTimezone: string; }>" ], "path": "packages/kbn-reporting/export_types/csv/csv_v2.ts", "deprecated": false, @@ -1120,7 +1114,7 @@ { "parentPluginId": "@kbn/reporting-export-types-csv", "id": "def-server.CsvV2ExportType.runTask.$2", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "job", "description": [], diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index 2c6437d1083d8..df8f591c3c4a4 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.devdocs.json b/api_docs/kbn_reporting_export_types_csv_common.devdocs.json index b8e38bafbb458..d94d29fb6f26b 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.devdocs.json +++ b/api_docs/kbn_reporting_export_types_csv_common.devdocs.json @@ -278,6 +278,59 @@ } ], "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.TaskPayloadCsvFromSavedObject", + "type": "Interface", + "tags": [], + "label": "TaskPayloadCsvFromSavedObject", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-csv-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesCsvCommonPluginApi", + "section": "def-common.TaskPayloadCsvFromSavedObject", + "text": "TaskPayloadCsvFromSavedObject" + }, + " extends CsvFromSavedObjectBase,", + "BasePayloadV2" + ], + "path": "packages/kbn-reporting/export_types/csv_common/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.TaskPayloadCsvFromSavedObject.objectType", + "type": "string", + "tags": [], + "label": "objectType", + "description": [], + "signature": [ + "\"search\"" + ], + "path": "packages/kbn-reporting/export_types/csv_common/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.TaskPayloadCsvFromSavedObject.pagingStrategy", + "type": "CompoundType", + "tags": [], + "label": "pagingStrategy", + "description": [], + "signature": [ + "\"scroll\" | \"pit\"" + ], + "path": "packages/kbn-reporting/export_types/csv_common/index.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false } ], "enums": [], @@ -452,22 +505,6 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/reporting-export-types-csv-common", - "id": "def-common.TaskPayloadCsvFromSavedObject", - "type": "Type", - "tags": [], - "label": "TaskPayloadCsvFromSavedObject", - "description": [], - "signature": [ - "CsvFromSavedObjectBase & ", - "BasePayloadV2" - ], - "path": "packages/kbn-reporting/export_types/csv_common/index.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false } ], "objects": [] diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index 91a9110783c7b..06162dc6bc19e 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 23 | 0 | 20 | 0 | +| 25 | 0 | 22 | 0 | ## Common diff --git a/api_docs/kbn_reporting_export_types_pdf.devdocs.json b/api_docs/kbn_reporting_export_types_pdf.devdocs.json index 8afb0ed02ab2f..722f19df9f31e 100644 --- a/api_docs/kbn_reporting_export_types_pdf.devdocs.json +++ b/api_docs/kbn_reporting_export_types_pdf.devdocs.json @@ -254,7 +254,9 @@ }, " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", "LayoutSelectorDictionary", - "> | undefined; zoom?: number | undefined; }; objectType: string; title: string; version: string; pagingStrategy?: \"scroll\" | \"pit\" | undefined; }>" + "> | undefined; zoom?: number | undefined; }; objectType: string; title: string; version: string; pagingStrategy?: ", + "CsvPagingStrategy", + " | undefined; }>" ], "path": "packages/kbn-reporting/export_types/pdf/printable_pdf_v2.ts", "deprecated": false, @@ -663,7 +665,9 @@ }, " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", "LayoutSelectorDictionary", - "> | undefined; zoom?: number | undefined; }; browserTimezone: string; objectType: string; title: string; version: string; pagingStrategy?: \"scroll\" | \"pit\" | undefined; }>" + "> | undefined; zoom?: number | undefined; }; browserTimezone: string; objectType: string; title: string; version: string; pagingStrategy?: ", + "CsvPagingStrategy", + " | undefined; }>" ], "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts", "deprecated": false, diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index 3f75e913ed50d..f0aca0219fae7 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.devdocs.json b/api_docs/kbn_reporting_export_types_pdf_common.devdocs.json index 84cd007bb1c0e..bbb24d39fd57b 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.devdocs.json +++ b/api_docs/kbn_reporting_export_types_pdf_common.devdocs.json @@ -195,7 +195,9 @@ "section": "def-common.SerializableRecord", "text": "SerializableRecord" }, - ">[]; objectType: string; pagingStrategy?: \"scroll\" | \"pit\" | undefined; }" + ">[]; objectType: string; pagingStrategy?: ", + "CsvPagingStrategy", + " | undefined; }" ], "path": "packages/kbn-reporting/export_types/pdf_common/index.ts", "deprecated": false, diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index 5a7235a12b00e..e73d098e2c80a 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.devdocs.json b/api_docs/kbn_reporting_export_types_png.devdocs.json index d808c17084fbe..3e2f7774afc75 100644 --- a/api_docs/kbn_reporting_export_types_png.devdocs.json +++ b/api_docs/kbn_reporting_export_types_png.devdocs.json @@ -256,7 +256,9 @@ }, " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", "LayoutSelectorDictionary", - "> | undefined; zoom?: number | undefined; }; objectType: string; title: string; version: string; pagingStrategy?: \"scroll\" | \"pit\" | undefined; }>" + "> | undefined; zoom?: number | undefined; }; objectType: string; title: string; version: string; pagingStrategy?: ", + "CsvPagingStrategy", + " | undefined; }>" ], "path": "packages/kbn-reporting/export_types/png/png_v2.ts", "deprecated": false, diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index 39dd72b2924a4..6c4cdec334be5 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index 451cc72c846ca..9fdf548fd4508 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index 78594e935a79f..029c1efadd8f4 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index bdf88e0accfc1..3880105de5695 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.devdocs.json b/api_docs/kbn_reporting_server.devdocs.json index 0322fb71d9965..ba3aa4ff9e65d 100644 --- a/api_docs/kbn_reporting_server.devdocs.json +++ b/api_docs/kbn_reporting_server.devdocs.json @@ -124,9 +124,7 @@ "section": "def-common.KibanaRequest", "text": "KibanaRequest" }, - ") => Promise>" + ") => Promise>" ], "path": "packages/kbn-reporting/server/export_type.ts", "deprecated": false, diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index 03f621f73e64b..12d9f4cf20450 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index 2a79f8a9771e1..81c0dce7172ee 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 8ed28beca2c87..ed7ce7c0333ec 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index 95d1a2c030520..806756c1dc8a5 100644 --- a/api_docs/kbn_router_utils.mdx +++ b/api_docs/kbn_router_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils title: "@kbn/router-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils'] --- import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index 6dab81dcbb0bc..9462cc162fd7c 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 2be2bb282478a..4f39d07f07970 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index 360bdf6e012dc..aaf490f6deeb9 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index f14800a85e1df..893bdc09fbaf7 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.devdocs.json b/api_docs/kbn_search_connectors.devdocs.json index da566d21fe55b..ca29ee312e7c0 100644 --- a/api_docs/kbn_search_connectors.devdocs.json +++ b/api_docs/kbn_search_connectors.devdocs.json @@ -4948,7 +4948,7 @@ "section": "def-common.ConnectorFeatures", "text": "ConnectorFeatures" }, - "; description: string | null; status: ", + "; status: ", { "pluginId": "@kbn/search-connectors", "scope": "common", @@ -4956,7 +4956,7 @@ "section": "def-common.ConnectorStatus", "text": "ConnectorStatus" }, - "; language: string | null; configuration: ", + "; description: string | null; language: string | null; configuration: ", { "pluginId": "@kbn/search-connectors", "scope": "common", @@ -5134,7 +5134,7 @@ "section": "def-common.IngestPipelineParams", "text": "IngestPipelineParams" }, - " | null; service_type: string | null; }; metadata: Record; status: ", + " | null; service_type: string | null; }; status: ", { "pluginId": "@kbn/search-connectors", "scope": "common", @@ -5142,7 +5142,7 @@ "section": "def-common.SyncStatus", "text": "SyncStatus" }, - "; created_at: string; job_type: ", + "; created_at: string; metadata: Record; job_type: ", { "pluginId": "@kbn/search-connectors", "scope": "common", diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index 288dc3e47a0ed..fee9ddcb3772d 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index 04f8ac7afede4..82d267f2a682c 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index cda846cdb49e4..9ad994768c843 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 36dfdb0297e0b..b93a95889a781 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index 3b388b1e0f549..8f84c0cd52749 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index 16219b2101606..afaf4d102621f 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 56dc33ec750b0..0bb3857ad2921 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.devdocs.json b/api_docs/kbn_security_solution_features.devdocs.json index ec6f97556d3cc..ff07b6dd43ca4 100644 --- a/api_docs/kbn_security_solution_features.devdocs.json +++ b/api_docs/kbn_security_solution_features.devdocs.json @@ -49,7 +49,7 @@ "label": "baseKibanaFeature", "description": [], "signature": [ - "{ id: string; order?: number | undefined; name: string; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; description?: string | undefined; category: ", + "{ id: string; order?: number | undefined; name: string; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; category: ", { "pluginId": "@kbn/core-application-common", "scope": "common", @@ -57,7 +57,7 @@ "section": "def-common.AppCategory", "text": "AppCategory" }, - "; management?: { [sectionId: string]: readonly string[]; } | undefined; privileges: { all: ", + "; description?: string | undefined; management?: { [sectionId: string]: readonly string[]; } | undefined; privileges: { all: ", { "pluginId": "features", "scope": "common", @@ -353,7 +353,7 @@ "label": "BaseKibanaFeatureConfig", "description": [], "signature": [ - "{ id: string; order?: number | undefined; name: string; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; description?: string | undefined; category: ", + "{ id: string; order?: number | undefined; name: string; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; category: ", { "pluginId": "@kbn/core-application-common", "scope": "common", @@ -361,7 +361,7 @@ "section": "def-common.AppCategory", "text": "AppCategory" }, - "; management?: { [sectionId: string]: readonly string[]; } | undefined; privileges: { all: ", + "; description?: string | undefined; management?: { [sectionId: string]: readonly string[]; } | undefined; privileges: { all: ", { "pluginId": "features", "scope": "common", diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 0f1e873d48c43..1f9d3ff668842 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index 201eef035d8b1..7029b517a81cd 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index 0af1a5fa26e68..7507454d859e5 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index b501ec1199d93..ddecd8e1af2e5 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index a60e76422f136..ad8544d330f2f 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index d144428394c1c..83eba86e7b2e3 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index 7db0def80655c..83dfd6edefa0f 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index da1a3b8bcc43a..0267e48301c5a 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.devdocs.json b/api_docs/kbn_securitysolution_exception_list_components.devdocs.json index 22435ff854ee1..641f77f998bfb 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.devdocs.json +++ b/api_docs/kbn_securitysolution_exception_list_components.devdocs.json @@ -834,7 +834,7 @@ "label": "formattedDateComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"source\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | React.ComponentType | \"a\" | \"abbr\" | \"address\" | \"area\" | \"article\" | \"aside\" | \"audio\" | \"b\" | \"base\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"body\" | \"br\" | \"button\" | \"canvas\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"data\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"form\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"input\" | \"ins\" | \"kbd\" | \"keygen\" | \"label\" | \"legend\" | \"li\" | \"main\" | \"mark\" | \"menu\" | \"menuitem\" | \"meta\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"output\" | \"p\" | \"param\" | \"picture\" | \"pre\" | \"progress\" | \"q\" | \"rp\" | \"rt\" | \"ruby\" | \"s\" | \"samp\" | \"slot\" | \"script\" | \"section\" | \"select\" | \"span\" | \"strong\" | \"style\" | \"summary\" | \"table\" | \"template\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"time\" | \"title\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"svg\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"image\" | \"line\" | \"linearGradient\" | \"marker\" | \"mask\" | \"metadata\" | \"mpath\" | \"path\" | \"pattern\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"stop\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" + "\"symbol\" | \"object\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"source\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"meta\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"table\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/meta/index.tsx", "deprecated": false, @@ -848,7 +848,7 @@ "label": "securityLinkAnchorComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"source\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | React.ComponentType | \"a\" | \"abbr\" | \"address\" | \"area\" | \"article\" | \"aside\" | \"audio\" | \"b\" | \"base\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"body\" | \"br\" | \"button\" | \"canvas\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"data\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"form\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"input\" | \"ins\" | \"kbd\" | \"keygen\" | \"label\" | \"legend\" | \"li\" | \"main\" | \"mark\" | \"menu\" | \"menuitem\" | \"meta\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"output\" | \"p\" | \"param\" | \"picture\" | \"pre\" | \"progress\" | \"q\" | \"rp\" | \"rt\" | \"ruby\" | \"s\" | \"samp\" | \"slot\" | \"script\" | \"section\" | \"select\" | \"span\" | \"strong\" | \"style\" | \"summary\" | \"table\" | \"template\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"time\" | \"title\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"svg\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"image\" | \"line\" | \"linearGradient\" | \"marker\" | \"mask\" | \"metadata\" | \"mpath\" | \"path\" | \"pattern\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"stop\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" + "\"symbol\" | \"object\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"source\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"meta\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"table\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/meta/index.tsx", "deprecated": false, @@ -987,7 +987,7 @@ "label": "securityLinkAnchorComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"source\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | React.ComponentType | \"a\" | \"abbr\" | \"address\" | \"area\" | \"article\" | \"aside\" | \"audio\" | \"b\" | \"base\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"body\" | \"br\" | \"button\" | \"canvas\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"data\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"form\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"input\" | \"ins\" | \"kbd\" | \"keygen\" | \"label\" | \"legend\" | \"li\" | \"main\" | \"mark\" | \"menu\" | \"menuitem\" | \"meta\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"output\" | \"p\" | \"param\" | \"picture\" | \"pre\" | \"progress\" | \"q\" | \"rp\" | \"rt\" | \"ruby\" | \"s\" | \"samp\" | \"slot\" | \"script\" | \"section\" | \"select\" | \"span\" | \"strong\" | \"style\" | \"summary\" | \"table\" | \"template\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"time\" | \"title\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"svg\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"image\" | \"line\" | \"linearGradient\" | \"marker\" | \"mask\" | \"metadata\" | \"mpath\" | \"path\" | \"pattern\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"stop\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" + "\"symbol\" | \"object\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"source\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"meta\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"table\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/exception_item_card.tsx", "deprecated": false, @@ -1001,7 +1001,7 @@ "label": "formattedDateComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"source\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | React.ComponentType | \"a\" | \"abbr\" | \"address\" | \"area\" | \"article\" | \"aside\" | \"audio\" | \"b\" | \"base\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"body\" | \"br\" | \"button\" | \"canvas\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"data\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"form\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"input\" | \"ins\" | \"kbd\" | \"keygen\" | \"label\" | \"legend\" | \"li\" | \"main\" | \"mark\" | \"menu\" | \"menuitem\" | \"meta\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"output\" | \"p\" | \"param\" | \"picture\" | \"pre\" | \"progress\" | \"q\" | \"rp\" | \"rt\" | \"ruby\" | \"s\" | \"samp\" | \"slot\" | \"script\" | \"section\" | \"select\" | \"span\" | \"strong\" | \"style\" | \"summary\" | \"table\" | \"template\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"time\" | \"title\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"svg\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"image\" | \"line\" | \"linearGradient\" | \"marker\" | \"mask\" | \"metadata\" | \"mpath\" | \"path\" | \"pattern\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"stop\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" + "\"symbol\" | \"object\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"source\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"meta\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"table\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/exception_item_card.tsx", "deprecated": false, diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index 804e2283c8ef6..866ed7081722a 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_grouping.devdocs.json b/api_docs/kbn_securitysolution_grouping.devdocs.json index f30f0953d436e..86037516e7000 100644 --- a/api_docs/kbn_securitysolution_grouping.devdocs.json +++ b/api_docs/kbn_securitysolution_grouping.devdocs.json @@ -242,9 +242,9 @@ "Type for dynamic grouping component props where T is the consumer `GroupingAggregation`" ], "signature": [ - "{ data?: ", + "{ isLoading: boolean; data?: ", "ParsedGroupingAggregation", - " | undefined; isLoading: boolean; activePage: number; itemsPerPage: number; groupingLevel?: number | undefined; inspectButton?: JSX.Element | undefined; onChangeGroupsItemsPerPage?: ((size: number) => void) | undefined; onChangeGroupsPage?: ((index: number) => void) | undefined; renderChildComponent: (groupFilter: ", + " | undefined; activePage: number; itemsPerPage: number; groupingLevel?: number | undefined; inspectButton?: JSX.Element | undefined; onChangeGroupsItemsPerPage?: ((size: number) => void) | undefined; onChangeGroupsPage?: ((index: number) => void) | undefined; renderChildComponent: (groupFilter: ", { "pluginId": "@kbn/es-query", "scope": "common", diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index da1a447f249f6..c79149dd273ea 100644 --- a/api_docs/kbn_securitysolution_grouping.mdx +++ b/api_docs/kbn_securitysolution_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping title: "@kbn/securitysolution-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-grouping plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping'] --- import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 4ebc74033d515..ce206e1c9a509 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index aa5588a13dc13..977ae4a35925e 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.devdocs.json b/api_docs/kbn_securitysolution_io_ts_list_types.devdocs.json index 8bce51b9ef333..46341eb4040cf 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.devdocs.json +++ b/api_docs/kbn_securitysolution_io_ts_list_types.devdocs.json @@ -4452,6 +4452,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.ListOperatorType", + "type": "Type", + "tags": [], + "label": "ListOperatorType", + "description": [], + "signature": [ + "\"match\" | \"wildcard\" | \"nested\" | \"list\" | \"exists\" | \"match_any\"" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/list_operator/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/securitysolution-io-ts-list-types", "id": "def-common.ListSchema", @@ -9983,6 +9998,22 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-list-types", + "id": "def-common.listOperatorType", + "type": "Object", + "tags": [], + "label": "listOperatorType", + "description": [], + "signature": [ + "KeyofC", + "<{ nested: null; match: null; match_any: null; wildcard: null; exists: null; list: null; }>" + ], + "path": "packages/kbn-securitysolution-io-ts-list-types/src/common/list_operator/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/securitysolution-io-ts-list-types", "id": "def-common.listSchema", diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index d62eb2ee1afd9..ba14cb164078d 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-detection-engine](https://github.com/orgs/elastic/tea | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 532 | 0 | 519 | 0 | +| 534 | 0 | 521 | 0 | ## Common diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index 642ee071bb92a..bff691169e658 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index 64f665fc636da..1d65de70bdda2 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index 6e72a3066bdb1..d25383c3ab0b9 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 4a085d5937607..9d7db6320aa65 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index c8df4d80896a5..d8f6b7bef32b7 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index 6678f3cb88c8b..fe8cf5a77290c 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index 2164846468e9f..575a06c312685 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index 2f6c89715babd..8c3fc5989a9db 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index 9b0d406dc72d3..f926ae5430ace 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 53050cac245c1..f3dcff85f5187 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 344f5851b2814..44243da4e998f 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index 9cbe198c93e20..e181b3c54b21c 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index 66fbb422897db..3a457e4b2fc25 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index d50aa2f4ba455..5cda73ab54504 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index dddd77929f377..82c9626b3cd2c 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index fb52faaabc32d..3e5d76f415aa1 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index e3d9f03b896fa..6e7c8b382b5ae 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 0f58fabcfabe7..907816b9aef17 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index 583e5151eceb0..d720df95271eb 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index ca3f90ae04fbd..720546828acbb 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.devdocs.json b/api_docs/kbn_shared_ux_button_toolbar.devdocs.json index 5990f6769f161..cbf27e1fbcb79 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.devdocs.json +++ b/api_docs/kbn_shared_ux_button_toolbar.devdocs.json @@ -469,7 +469,7 @@ "Button size" ], "signature": [ - "\"m\" | \"s\" | \"compressed\" | undefined" + "\"m\" | \"compressed\" | \"s\" | undefined" ], "path": "packages/shared-ux/button_toolbar/src/buttons/icon_button_group/icon_button_group.tsx", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 644b30546dbb2..af624611ac4d3 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.devdocs.json b/api_docs/kbn_shared_ux_card_no_data.devdocs.json index adf37265e0b70..c4346d8b39563 100644 --- a/api_docs/kbn_shared_ux_card_no_data.devdocs.json +++ b/api_docs/kbn_shared_ux_card_no_data.devdocs.json @@ -132,7 +132,7 @@ "signature": [ "Partial> & { button?: React.ReactNode; onClick?: React.MouseEventHandler | undefined; description?: React.ReactNode; category?: string | undefined; canAccessFleet?: boolean | undefined; }" + ", \"className\" | \"title\" | \"href\">> & { button?: React.ReactNode; onClick?: React.MouseEventHandler | undefined; description?: React.ReactNode; category?: string | undefined; canAccessFleet?: boolean | undefined; }" ], "path": "packages/shared-ux/card/no_data/types/index.d.ts", "deprecated": false, @@ -170,7 +170,7 @@ "signature": [ "Partial> & { button?: React.ReactNode; onClick?: React.MouseEventHandler | undefined; description?: React.ReactNode; category?: string | undefined; canAccessFleet?: boolean | undefined; }" + ", \"className\" | \"title\" | \"href\">> & { button?: React.ReactNode; onClick?: React.MouseEventHandler | undefined; description?: React.ReactNode; category?: string | undefined; canAccessFleet?: boolean | undefined; }" ], "path": "packages/shared-ux/card/no_data/types/index.d.ts", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index 1013d6df8c22d..a244e22635ac0 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.devdocs.json b/api_docs/kbn_shared_ux_card_no_data_mocks.devdocs.json index 9e1cfa16386c8..7930da59139f4 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.devdocs.json +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.devdocs.json @@ -505,7 +505,7 @@ "\nStorybook parameters provided from the controls addon." ], "signature": [ - "{ button: any; title: any; description: any; category: any; canAccessFleet: any; }" + "{ title: any; category: any; description: any; button: any; canAccessFleet: any; }" ], "path": "packages/shared-ux/card/no_data/mocks/src/storybook.ts", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index d1473341b1427..c0091b06f525e 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index 93c9e946ce535..d9b4d5962e2e6 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index 9ea89900ac4b0..4094316ec0c75 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 3d12ab3e32555..a84cfeb3b3ff9 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index 2f1ea2254c1b8..3253f6322eaba 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index 421fbb5adb040..a254b50e5d03c 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index 662ba5c3bda99..122c53be58956 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index 21625b56a615b..77e7c0743d7d8 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index b118acd19431d..e81f5a9e897a5 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index 186d838c43e86..0b521e687ec0b 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index c45ad5dcb8b5d..6e559f0abd75d 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index a7d44fbde0052..80e12d9143517 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index dc91fec32c24d..fff725a768ddf 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index 37675b3a8a174..b2e8f2c53b754 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index a940239799a28..d0d6b35354489 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index 803133b135fdc..94df6d43c03be 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index d275ddfeeea93..07cc4420cc55e 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index ec9fb93e61026..03a718b98a735 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index c57acc5538b0e..7975c3c5e5bed 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index 60c884fed69f2..9735f1a242365 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index 6a9f63048cf5f..f2c83952c02d0 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index 8bd4733913550..3fd29e167d3b0 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index b25a8f625c410..12a77f5ab2049 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index fe5bdcf7b6f67..273bb548c497e 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index 687f79129d9c0..b68348608763d 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index 6c74398b75dcd..feb4767d5497a 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index 0835460a336a8..1e0ff3b979215 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index 0155aec4101c6..69f0aa05ebca8 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index 7911529b92466..9d850cf4357d5 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index 34eda8380798a..906d4bc589a4d 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router'] --- import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx index f1f657b80f562..0e1d91c307c9f 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks'] --- import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index 837b4e1ef3b04..2d0dec7f8b887 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index f26243df37405..f78e254fb8d99 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.devdocs.json b/api_docs/kbn_shared_ux_utility.devdocs.json index 5d184997b8bfb..b75d4b863c6d6 100644 --- a/api_docs/kbn_shared_ux_utility.devdocs.json +++ b/api_docs/kbn_shared_ux_utility.devdocs.json @@ -19,6 +19,70 @@ "common": { "classes": [], "functions": [ + { + "parentPluginId": "@kbn/shared-ux-utility", + "id": "def-common.dynamic", + "type": "Function", + "tags": [], + "label": "dynamic", + "description": [ + "\nLazy load and wrap with Suspense any component.\n" + ], + "signature": [ + "(loader: Loader, options: ", + { + "pluginId": "@kbn/shared-ux-utility", + "scope": "common", + "docId": "kibKbnSharedUxUtilityPluginApi", + "section": "def-common.DynamicOptions", + "text": "DynamicOptions" + }, + ") => React.ForwardRefExoticComponent> & React.RefAttributes>" + ], + "path": "packages/kbn-shared-ux-utility/src/dynamic/dynamic.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/shared-ux-utility", + "id": "def-common.dynamic.$1", + "type": "Function", + "tags": [], + "label": "loader", + "description": [], + "signature": [ + "Loader" + ], + "path": "packages/kbn-shared-ux-utility/src/dynamic/dynamic.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/shared-ux-utility", + "id": "def-common.dynamic.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "@kbn/shared-ux-utility", + "scope": "common", + "docId": "kibKbnSharedUxUtilityPluginApi", + "section": "def-common.DynamicOptions", + "text": "DynamicOptions" + } + ], + "path": "packages/kbn-shared-ux-utility/src/dynamic/dynamic.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/shared-ux-utility", "id": "def-common.Fallback", @@ -187,6 +251,36 @@ } ], "interfaces": [ + { + "parentPluginId": "@kbn/shared-ux-utility", + "id": "def-common.DynamicOptions", + "type": "Interface", + "tags": [], + "label": "DynamicOptions", + "description": [ + "\nOptions for the lazy loaded component" + ], + "path": "packages/kbn-shared-ux-utility/src/dynamic/dynamic.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/shared-ux-utility", + "id": "def-common.DynamicOptions.fallback", + "type": "CompoundType", + "tags": [], + "label": "fallback", + "description": [], + "signature": [ + "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + ], + "path": "packages/kbn-shared-ux-utility/src/dynamic/dynamic.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/shared-ux-utility", "id": "def-common.WithSuspenseExtendedDeps", diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 06a7b41b2754a..69f5773f1955c 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 11 | 0 | 3 | 0 | +| 16 | 0 | 6 | 0 | ## Common diff --git a/api_docs/kbn_slo_schema.devdocs.json b/api_docs/kbn_slo_schema.devdocs.json index 2353ee0fc18cd..2842169076891 100644 --- a/api_docs/kbn_slo_schema.devdocs.json +++ b/api_docs/kbn_slo_schema.devdocs.json @@ -304,6 +304,22 @@ "trackAdoption": false, "children": [], "returnComment": [] + }, + { + "parentPluginId": "@kbn/slo-schema", + "id": "def-common.Duration.asMinutes", + "type": "Function", + "tags": [], + "label": "asMinutes", + "description": [], + "signature": [ + "() => number" + ], + "path": "x-pack/packages/kbn-slo-schema/src/models/duration.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] } ], "initialIsOpen": false @@ -795,7 +811,15 @@ "label": "GetPreviewDataParams", "description": [], "signature": [ - "{ indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; range: { start: number; end: number; }; }" + "{ indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; range: { start: number; end: number; }; } & { objective?: ({ target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: ", + { + "pluginId": "@kbn/slo-schema", + "scope": "common", + "docId": "kibKbnSloSchemaPluginApi", + "section": "def-common.Duration", + "text": "Duration" + }, + " | undefined; }) | undefined; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -982,6 +1006,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/slo-schema", + "id": "def-common.Objective", + "type": "Type", + "tags": [], + "label": "Objective", + "description": [], + "signature": [ + "{ target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }" + ], + "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/slo-schema", "id": "def-common.ResetSLOParams", @@ -3138,6 +3177,8 @@ "signature": [ "TypeC", "<{ body: ", + "IntersectionC", + "<[", "TypeC", "<{ indicator: ", "UnionC", @@ -3475,7 +3516,29 @@ "NumberC", "; end: ", "NumberC", - "; }>; }>; }>" + "; }>; }>, ", + "PartialC", + "<{ objective: ", + "IntersectionC", + "<[", + "TypeC", + "<{ target: ", + "NumberC", + "; }>, ", + "PartialC", + "<{ timesliceTarget: ", + "NumberC", + "; timesliceWindow: ", + "Type", + "<", + { + "pluginId": "@kbn/slo-schema", + "scope": "common", + "docId": "kibKbnSloSchemaPluginApi", + "section": "def-common.Duration", + "text": "Duration" + }, + ", string, unknown>; }>]>; }>]>; }>" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index 0e091c6fc3d80..e38dea2eab00a 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 144 | 0 | 144 | 0 | +| 146 | 0 | 146 | 0 | ## Common diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index c2a419383cfbe..03da54287508e 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx index ff56210c6a762..6a61c66f268d0 100644 --- a/api_docs/kbn_sort_predicates.mdx +++ b/api_docs/kbn_sort_predicates.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-predicates title: "@kbn/sort-predicates" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-predicates plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 63e47bd847ab1..c72ff20fcad22 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index 55212ac7f8a44..f00791ff7c4a1 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index 5712c553b4484..f46aca8b5b8c5 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 4122d9bc32f12..d4fa47b667361 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.devdocs.json b/api_docs/kbn_test.devdocs.json index 972794e06a19c..7e272241534db 100644 --- a/api_docs/kbn_test.devdocs.json +++ b/api_docs/kbn_test.devdocs.json @@ -3303,7 +3303,7 @@ "signature": [ "Pick<", "ServerlessOptions", - ", \"image\" | \"host\" | \"tag\" | \"resources\" | \"kibanaUrl\" | \"projectType\"> | undefined" + ", \"host\" | \"tag\" | \"image\" | \"resources\" | \"kibanaUrl\" | \"projectType\"> | undefined" ], "path": "packages/kbn-test/src/es/test_es_cluster.ts", "deprecated": false, diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 0b917d0c8e808..e5ab38ddf7a77 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx index bf5ce913b136b..a3c567384cfb0 100644 --- a/api_docs/kbn_test_eui_helpers.mdx +++ b/api_docs/kbn_test_eui_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-eui-helpers title: "@kbn/test-eui-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-eui-helpers plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers'] --- import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 01d72a515733a..283972b5f986a 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx index 9656e20d57ac0..d3ae475ea3be0 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index 7830befbc3044..683fbcbe7739b 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 6d821b2a3617b..d736e9e4a7a26 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index 34577f0d4034e..d630416c52ffd 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index dff38abb0a173..f66977917f7cd 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index 7da97a821ba7e..35b679f61b508 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index 959517e3294ad..0010b5ee43ae7 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index 5b943e447ea84..57da360458803 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index 8107939738724..45d7fb7175f54 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index dd78add52a7e2..f55ee7578418b 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index 425ec630a8811..63f86f119191f 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index 7691e69d6aeee..935aba001c906 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index 9fe32d6fd257c..8e012a2f74bd7 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_url_state.mdx b/api_docs/kbn_url_state.mdx index 48b2b7f7ed604..96f199fa13f98 100644 --- a/api_docs/kbn_url_state.mdx +++ b/api_docs/kbn_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-url-state title: "@kbn/url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/url-state plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/url-state'] --- import kbnUrlStateObj from './kbn_url_state.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 68638aa905d1b..9b8077562545f 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index a7acf90331044..d2389fe123afd 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index 17bea913c6093..4ce9d22ace60f 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] --- import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json'; diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index ed6c1f671669a..f82078385fad2 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] --- import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json'; diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index 1c4a6f353a4ae..156d1ec99a1c1 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index a2eb5346600d5..02d239620b949 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index 533858ebba702..c65c81d48648e 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index 713e95770ab5c..5359862738241 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 7d90b71300a32..60a6673cd2234 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index c41a0808e3b3b..fbf73f617eb90 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 384b747f4db7c..6a4fa3db21298 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.devdocs.json b/api_docs/kibana_react.devdocs.json index 44778dc832884..047ff42231895 100644 --- a/api_docs/kibana_react.devdocs.json +++ b/api_docs/kibana_react.devdocs.json @@ -1079,18 +1079,6 @@ "plugin": "licenseManagement", "path": "x-pack/plugins/license_management/public/application/app_providers.tsx" }, - { - "plugin": "advancedSettings", - "path": "src/plugins/advanced_settings/public/management_app/components/form/form.tsx" - }, - { - "plugin": "advancedSettings", - "path": "src/plugins/advanced_settings/public/management_app/components/form/form.tsx" - }, - { - "plugin": "advancedSettings", - "path": "src/plugins/advanced_settings/public/management_app/components/form/form.tsx" - }, { "plugin": "maps", "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx" @@ -2780,14 +2768,6 @@ "plugin": "telemetry", "path": "src/plugins/telemetry/public/services/telemetry_notifications/render_opt_in_status_notice_banner.tsx" }, - { - "plugin": "advancedSettings", - "path": "src/plugins/advanced_settings/public/management_app/components/form/form.tsx" - }, - { - "plugin": "advancedSettings", - "path": "src/plugins/advanced_settings/public/management_app/components/form/form.tsx" - }, { "plugin": "maps", "path": "x-pack/plugins/maps/public/render_app.tsx" @@ -2992,6 +2972,10 @@ "plugin": "cloudSecurityPosture", "path": "x-pack/plugins/cloud_security_posture/public/components/take_action.tsx" }, + { + "plugin": "cloudSecurityPosture", + "path": "x-pack/plugins/cloud_security_posture/public/components/take_action.tsx" + }, { "plugin": "dashboardEnhanced", "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx" diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 17157385e16d1..9eb38ccd81bfe 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 8acbf90f6f759..89ccef47339b9 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index 717658285628c..079da9ced6304 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index 202587a8468b5..09064262d23de 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -636,7 +636,7 @@ "\n" ], "signature": [ - "(domNode: Element | HTMLElement) => void" + "(domNode: HTMLElement | Element) => void" ], "path": "x-pack/plugins/lens/public/embeddable/embeddable.tsx", "deprecated": false, @@ -650,7 +650,7 @@ "label": "domNode", "description": [], "signature": [ - "Element | HTMLElement" + "HTMLElement | Element" ], "path": "x-pack/plugins/lens/public/embeddable/embeddable.tsx", "deprecated": false, @@ -989,7 +989,48 @@ "initialIsOpen": false } ], - "functions": [], + "functions": [ + { + "parentPluginId": "lens", + "id": "def-public.apiHasLensConfig", + "type": "Function", + "tags": [], + "label": "apiHasLensConfig", + "description": [], + "signature": [ + "(api: unknown) => api is ", + { + "pluginId": "lens", + "scope": "public", + "docId": "kibLensPluginApi", + "section": "def-public.HasLensConfig", + "text": "HasLensConfig" + } + ], + "path": "x-pack/plugins/lens/public/embeddable/interfaces/has_lens_config.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "lens", + "id": "def-public.apiHasLensConfig.$1", + "type": "Unknown", + "tags": [], + "label": "api", + "description": [], + "signature": [ + "unknown" + ], + "path": "x-pack/plugins/lens/public/embeddable/interfaces/has_lens_config.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], "interfaces": [ { "parentPluginId": "lens", @@ -9226,7 +9267,7 @@ "label": "overrides", "description": [], "signature": [ - "(Partial> | undefined>; title?: string | undefined; gridLine?: ", + ", \"gridLine\">> | undefined>; title?: string | undefined; children?: boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | undefined; gridLine?: ", { "pluginId": "@kbn/chart-expressions-common", "scope": "common", @@ -10625,6 +10666,30 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "lens", + "id": "def-public.HasLensConfig", + "type": "Type", + "tags": [], + "label": "HasLensConfig", + "description": [], + "signature": [ + { + "pluginId": "@kbn/presentation-publishing", + "scope": "common", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-common.HasType", + "text": "HasType" + }, + "<\"lens\"> & { getSavedVis: () => Readonly<", + "Document", + " | undefined>; }" + ], + "path": "x-pack/plugins/lens/public/embeddable/interfaces/has_lens_config.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "lens", "id": "def-public.HeatmapVisualizationState", @@ -10744,7 +10809,7 @@ "label": "LensSavedObjectAttributes", "description": [], "signature": [ - "{ title: string; description?: string | undefined; state: { datasourceStates: Record; visualization: unknown; query: ", + "{ title: string; state: { datasourceStates: Record; visualization: unknown; query: ", { "pluginId": "@kbn/es-query", "scope": "common", @@ -10784,7 +10849,7 @@ "section": "def-common.SavedObjectReference", "text": "SavedObjectReference" }, - "[]; visualizationType: string | null; }" + "[]; description?: string | undefined; visualizationType: string | null; }" ], "path": "x-pack/plugins/lens/public/embeddable/embeddable.tsx", "deprecated": false, @@ -11317,7 +11382,7 @@ }, "<", "GoalDomainRange", - ">; base?: number | undefined; actual?: number | undefined; bandFillColor?: \"ignore\" | undefined; tickValueFormatter?: \"ignore\" | undefined; labelMajor?: string | ", + ">; actual?: number | undefined; base?: number | undefined; bandFillColor?: \"ignore\" | undefined; tickValueFormatter?: \"ignore\" | undefined; labelMajor?: string | ", "GoalLabelAccessor", " | undefined; labelMinor?: string | ", "GoalLabelAccessor", @@ -11343,7 +11408,7 @@ }, "<{ duration: number; } | undefined>; valueGetter?: ", "ValueGetter", - " | undefined; fillOutside?: boolean | undefined; radiusOutside?: number | undefined; fillRectangleWidth?: number | undefined; fillRectangleHeight?: number | undefined; topGroove?: number | undefined; percentFormatter?: \"ignore\" | undefined; clockwiseSectors?: boolean | undefined; maxRowCount?: number | undefined; specialFirstInnermostSector?: boolean | undefined; smallMultiples?: string | undefined; drilldown?: boolean | undefined; }>> | Partial> | Partial> | undefined>; title?: string | undefined; gridLine?: ", + ", \"gridLine\">> | undefined>; title?: string | undefined; children?: boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | undefined; gridLine?: ", { "pluginId": "@kbn/chart-expressions-common", "scope": "common", diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 8f9f2a5175872..0414f69bddd35 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; @@ -21,13 +21,16 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 658 | 0 | 557 | 61 | +| 661 | 0 | 560 | 61 | ## Client ### Objects +### Functions + + ### Classes diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 6b1799b8c6b0e..080914241f88b 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index f3ff84a77852a..90cf3afc10870 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index 22011469715de..984ea88a4e7b6 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.mdx b/api_docs/links.mdx index 5b3312ad1fe04..c8f113363e4b1 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 500b39c6ba825..71c35b3b3efc9 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index e9400d1bb690d..4f2eb6d770c96 100644 --- a/api_docs/logs_explorer.mdx +++ b/api_docs/logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsExplorer title: "logsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logsExplorer plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsExplorer'] --- import logsExplorerObj from './logs_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.devdocs.json b/api_docs/logs_shared.devdocs.json index ee1cc16b8f92e..d24e8baf6dac3 100644 --- a/api_docs/logs_shared.devdocs.json +++ b/api_docs/logs_shared.devdocs.json @@ -270,7 +270,7 @@ "label": "LogAIAssistant", "description": [], "signature": [ - "(props: ", + "React.ForwardRefExoticComponent<", { "pluginId": "logsShared", "scope": "public", @@ -278,7 +278,7 @@ "section": "def-public.LogAIAssistantProps", "text": "LogAIAssistantProps" }, - ") => JSX.Element" + " & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -293,9 +293,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -310,9 +310,9 @@ "label": "LogColumnHeader", "description": [], "signature": [ - "(props: { columnWidth: ", + "React.ForwardRefExoticComponent<{ columnWidth: ", "LogEntryColumnWidth", - "; 'data-test-subj'?: string | undefined; } & { children?: React.ReactNode; }) => JSX.Element" + "; 'data-test-subj'?: string | undefined; } & { children?: React.ReactNode; } & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -327,9 +327,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -344,7 +344,7 @@ "label": "LogColumnHeadersWrapper", "description": [], "signature": [ - "(props: StyledComponentPropsWithAs | keyof JSX.IntrinsicElements, ", + "React.ForwardRefExoticComponent<(Pick & Partial>, \"theme\"> & { theme?: ", { "pluginId": "@kbn/react-kibana-context-styled", "scope": "common", @@ -352,7 +352,15 @@ "section": "def-common.EuiTheme", "text": "EuiTheme" }, - ", { role: React.AriaRole; }, \"role\">) => JSX.Element" + " | undefined; } & { as?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; }, string | number | symbol> | Pick & Partial>, \"theme\"> & { theme?: ", + { + "pluginId": "@kbn/react-kibana-context-styled", + "scope": "common", + "docId": "kibKbnReactKibanaContextStyledPluginApi", + "section": "def-common.EuiTheme", + "text": "EuiTheme" + }, + " | undefined; } & { children?: React.ReactNode; } & { as?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; }, string | number | symbol>) & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -367,9 +375,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -384,7 +392,7 @@ "label": "LogEntryColumn", "description": [], "signature": [ - "(props: StyledComponentPropsWithAs | keyof JSX.IntrinsicElements, ", + "React.ForwardRefExoticComponent<(Pick & Partial>, \"theme\"> & { theme?: ", { "pluginId": "@kbn/react-kibana-context-styled", "scope": "common", @@ -392,7 +400,15 @@ "section": "def-common.EuiTheme", "text": "EuiTheme" }, - ", { role: \"cell\"; } & LogEntryColumnProps, \"role\">) => JSX.Element" + " | undefined; } & { as?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; }, string | number | symbol> | Pick & Partial>, \"theme\"> & { theme?: ", + { + "pluginId": "@kbn/react-kibana-context-styled", + "scope": "common", + "docId": "kibKbnReactKibanaContextStyledPluginApi", + "section": "def-common.EuiTheme", + "text": "EuiTheme" + }, + " | undefined; } & { children?: React.ReactNode; } & { as?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; }, string | number | symbol>) & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -407,9 +423,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -424,9 +440,9 @@ "label": "LogEntryContextMenu", "description": [], "signature": [ - "(props: ", + "React.ForwardRefExoticComponent<", "LogEntryContextMenuProps", - " & { children?: React.ReactNode; }) => JSX.Element" + " & { children?: React.ReactNode; } & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -441,9 +457,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -458,9 +474,9 @@ "label": "LogEntryFieldColumn", "description": [], "signature": [ - "(props: ", + "React.ForwardRefExoticComponent<", "LogEntryFieldColumnProps", - " & { children?: React.ReactNode; }) => JSX.Element" + " & { children?: React.ReactNode; } & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -475,9 +491,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -527,9 +543,9 @@ "label": "LogEntryMessageColumn", "description": [], "signature": [ - "(props: ", + "React.ForwardRefExoticComponent<", "LogEntryMessageColumnProps", - ") => JSX.Element" + " & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -544,9 +560,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -561,7 +577,7 @@ "label": "LogEntryRowWrapper", "description": [], "signature": [ - "(props: StyledComponentPropsWithAs | keyof JSX.IntrinsicElements, ", + "React.ForwardRefExoticComponent<(Pick & Partial>, \"theme\"> & { theme?: ", { "pluginId": "@kbn/react-kibana-context-styled", "scope": "common", @@ -569,7 +585,15 @@ "section": "def-common.EuiTheme", "text": "EuiTheme" }, - ", { role: \"row\"; } & LogEntryRowWrapperProps, \"role\">) => JSX.Element" + " | undefined; } & { as?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; }, string | number | symbol> | Pick & Partial>, \"theme\"> & { theme?: ", + { + "pluginId": "@kbn/react-kibana-context-styled", + "scope": "common", + "docId": "kibKbnReactKibanaContextStyledPluginApi", + "section": "def-common.EuiTheme", + "text": "EuiTheme" + }, + " | undefined; } & { children?: React.ReactNode; } & { as?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; }, string | number | symbol>) & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -584,9 +608,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -601,9 +625,9 @@ "label": "LogEntryTimestampColumn", "description": [], "signature": [ - "(props: ", + "React.ForwardRefExoticComponent<", "LogEntryTimestampColumnProps", - ") => JSX.Element" + " & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -618,9 +642,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -731,7 +755,7 @@ "label": "LogStream", "description": [], "signature": [ - "(props: ", + "React.ForwardRefExoticComponent<", { "pluginId": "logsShared", "scope": "public", @@ -739,7 +763,7 @@ "section": "def-public.LogStreamProps", "text": "LogStreamProps" }, - ") => JSX.Element" + " & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -754,9 +778,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -1041,9 +1065,19 @@ "label": "ScrollableLogTextStreamView", "description": [], "signature": [ - "(props: ", + "React.ForwardRefExoticComponent JSX.Element" + " & React.RefAttributes<", + { + "pluginId": "logsShared", + "scope": "public", + "docId": "kibLogsSharedPluginApi", + "section": "def-public.ScrollableLogTextStreamView", + "text": "ScrollableLogTextStreamView" + }, + ">, \"key\" | \"css\" | keyof ", + "ScrollableLogTextStreamViewProps", + "> & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -1058,9 +1092,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 1fceb514228c1..d986fddd75047 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 302 | 0 | 287 | 32 | +| 302 | 0 | 276 | 32 | ## Client diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 0060ced3aaf9c..ccd3935a0b221 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 029a9163d1f47..8f8876107c4e1 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index 8e3425a5e1c6e..381b29411b0b4 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.devdocs.json b/api_docs/metrics_data_access.devdocs.json index e068f2e83b611..cb36df7a2609f 100644 --- a/api_docs/metrics_data_access.devdocs.json +++ b/api_docs/metrics_data_access.devdocs.json @@ -873,7 +873,7 @@ "DashboardModel", "; }; kpi: { get: ({ metricsDataViewId, options, }: { metricsDataViewId?: string | undefined; options?: Pick<{ title: string; dataset?: ", "LensDataset", - " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"s\" | \"d\" | \"h\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", + " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"d\" | \"h\" | \"s\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", "LensBreakdownConfig", " | undefined; trendLine?: boolean | undefined; subtitle?: string | undefined; }, \"subtitle\" | \"seriesColor\"> | undefined; }) => ", "DashboardModel", diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index 2c759ff880014..dfb980ada5700 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index cccdc88b9c3be..b50ccf299e8e9 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx index 71b88e86bb231..7753ae513ecd5 100644 --- a/api_docs/mock_idp_plugin.mdx +++ b/api_docs/mock_idp_plugin.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin title: "mockIdpPlugin" image: https://source.unsplash.com/400x175/?github description: API docs for the mockIdpPlugin plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin'] --- import mockIdpPluginObj from './mock_idp_plugin.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index d362a37ac33fd..a6c2883f18176 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index a01fb6050df0f..714999b93a814 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 6fa72ff89b482..c9f18f099f6b8 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index d2f00df31af3c..392fe4540d826 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index 5b71a0706082f..1ccf176cfce54 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 3a24b760e1996..50db9cf355c95 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index f4f338f2c25cb..57cac0c0530e2 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -786,7 +786,7 @@ }, " | undefined; list: () => string[]; }; selectedAlertId?: string | undefined; } & ", "CommonProps", - " & { as?: \"div\" | undefined; } & _EuiFlyoutProps & Omit, HTMLDivElement>, keyof _EuiFlyoutProps> & Omit, HTMLDivElement>, \"key\" | keyof React.HTMLAttributes | \"css\"> & { ref?: ((instance: HTMLDivElement | null) => void) | React.RefObject | null | undefined; }, \"type\" | \"prefix\" | \"key\" | \"id\" | \"defaultValue\" | \"security\" | \"children\" | \"ref\" | \"slot\" | \"style\" | \"title\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"spellCheck\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"paddingSize\" | \"size\" | \"onClose\" | \"maxWidth\" | \"ownFocus\" | \"hideCloseButton\" | \"closeButtonProps\" | \"closeButtonPosition\" | \"maskProps\" | \"outsideClickCloses\" | \"side\" | \"pushMinBreakpoint\" | \"pushAnimation\" | \"focusTrapProps\" | \"includeFixedHeadersInFocusTrap\" | \"as\">, \"type\" | \"prefix\" | \"key\" | \"id\" | \"defaultValue\" | \"security\" | \"alert\" | \"children\" | \"slot\" | \"style\" | \"title\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"spellCheck\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"alerts\" | \"paddingSize\" | \"size\" | \"onClose\" | \"maxWidth\" | \"ownFocus\" | \"hideCloseButton\" | \"closeButtonProps\" | \"closeButtonPosition\" | \"maskProps\" | \"outsideClickCloses\" | \"side\" | \"pushMinBreakpoint\" | \"pushAnimation\" | \"focusTrapProps\" | \"includeFixedHeadersInFocusTrap\" | \"as\" | \"rawAlert\" | \"isInApp\" | \"observabilityRuleTypeRegistry\" | \"selectedAlertId\"> & { ref?: ((instance: HTMLDivElement | null) => void) | React.RefObject | null | undefined; }> & { readonly _result: ({ alert, rawAlert, alerts, isInApp, observabilityRuleTypeRegistry, onClose, selectedAlertId, }: AlertsFlyoutProps) => JSX.Element | null; }" + " & { as?: \"div\" | undefined; } & _EuiFlyoutProps & Omit, HTMLDivElement>, keyof _EuiFlyoutProps> & Omit, HTMLDivElement>, \"key\" | keyof React.HTMLAttributes | \"css\"> & { ref?: ((instance: HTMLDivElement | null) => void) | React.RefObject | null | undefined; }, \"type\" | \"prefix\" | \"key\" | \"id\" | \"defaultValue\" | \"security\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"title\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"paddingSize\" | \"size\" | \"onClose\" | \"ref\" | \"maxWidth\" | \"ownFocus\" | \"hideCloseButton\" | \"closeButtonProps\" | \"closeButtonPosition\" | \"maskProps\" | \"outsideClickCloses\" | \"side\" | \"pushMinBreakpoint\" | \"pushAnimation\" | \"focusTrapProps\" | \"includeFixedHeadersInFocusTrap\" | \"as\">, \"type\" | \"prefix\" | \"key\" | \"id\" | \"defaultValue\" | \"security\" | \"alert\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"title\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"alerts\" | \"paddingSize\" | \"size\" | \"onClose\" | \"maxWidth\" | \"ownFocus\" | \"hideCloseButton\" | \"closeButtonProps\" | \"closeButtonPosition\" | \"maskProps\" | \"outsideClickCloses\" | \"side\" | \"pushMinBreakpoint\" | \"pushAnimation\" | \"focusTrapProps\" | \"includeFixedHeadersInFocusTrap\" | \"as\" | \"rawAlert\" | \"isInApp\" | \"observabilityRuleTypeRegistry\" | \"selectedAlertId\"> & { ref?: ((instance: HTMLDivElement | null) => void) | React.RefObject | null | undefined; }> & { readonly _result: ({ alert, rawAlert, alerts, isInApp, observabilityRuleTypeRegistry, onClose, selectedAlertId, }: AlertsFlyoutProps) => JSX.Element | null; }" ], "path": "x-pack/plugins/observability/public/index.ts", "deprecated": false, @@ -8125,6 +8125,71 @@ ], "returnComment": [], "initialIsOpen": false + }, + { + "parentPluginId": "observability", + "id": "def-server.wildcardQuery", + "type": "Function", + "tags": [], + "label": "wildcardQuery", + "description": [], + "signature": [ + "(field: T, value: string | undefined, opts: { leadingWildcard: boolean; }) => ", + "QueryDslQueryContainer", + "[]" + ], + "path": "x-pack/plugins/observability/server/utils/queries.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observability", + "id": "def-server.wildcardQuery.$1", + "type": "Uncategorized", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "T" + ], + "path": "x-pack/plugins/observability/server/utils/queries.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "observability", + "id": "def-server.wildcardQuery.$2", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/observability/server/utils/queries.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "observability", + "id": "def-server.wildcardQuery.$3", + "type": "Object", + "tags": [], + "label": "opts", + "description": [], + "signature": [ + "{ leadingWildcard: boolean; }" + ], + "path": "x-pack/plugins/observability/server/utils/queries.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false } ], "interfaces": [ @@ -8399,6 +8464,8 @@ "; \"POST /internal/observability/slos/_preview\": { endpoint: \"POST /internal/observability/slos/_preview\"; params?: ", "TypeC", "<{ body: ", + "IntersectionC", + "<[", "TypeC", "<{ indicator: ", "UnionC", @@ -8736,7 +8803,29 @@ "NumberC", "; end: ", "NumberC", - "; }>; }>; }> | undefined; handler: ({}: ", + "; }>; }>, ", + "PartialC", + "<{ objective: ", + "IntersectionC", + "<[", + "TypeC", + "<{ target: ", + "NumberC", + "; }>, ", + "PartialC", + "<{ timesliceTarget: ", + "NumberC", + "; timesliceWindow: ", + "Type", + "<", + { + "pluginId": "@kbn/slo-schema", + "scope": "common", + "docId": "kibKbnSloSchemaPluginApi", + "section": "def-common.Duration", + "text": "Duration" + }, + ", string, unknown>; }>]>; }>]>; }> | undefined; handler: ({}: ", { "pluginId": "observability", "scope": "server", @@ -8744,7 +8833,15 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params: { body: { indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; range: { start: number; end: number; }; }; }; }) => Promise<({ date: string; sliValue: number; } & { events?: { good: number; bad: number; total: number; } | undefined; })[]>; } & ", + " & { params: { body: { indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; range: { start: number; end: number; }; } & { objective?: ({ target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: ", + { + "pluginId": "@kbn/slo-schema", + "scope": "common", + "docId": "kibKbnSloSchemaPluginApi", + "section": "def-common.Duration", + "text": "Duration" + }, + " | undefined; }) | undefined; }; }; }) => Promise<({ date: string; sliValue: number; } & { events?: { good: number; bad: number; total: number; } | undefined; })[]>; } & ", { "pluginId": "observability", "scope": "server", @@ -10675,6 +10772,8 @@ "; \"POST /internal/observability/slos/_preview\": { endpoint: \"POST /internal/observability/slos/_preview\"; params?: ", "TypeC", "<{ body: ", + "IntersectionC", + "<[", "TypeC", "<{ indicator: ", "UnionC", @@ -11012,7 +11111,29 @@ "NumberC", "; end: ", "NumberC", - "; }>; }>; }> | undefined; handler: ({}: ", + "; }>; }>, ", + "PartialC", + "<{ objective: ", + "IntersectionC", + "<[", + "TypeC", + "<{ target: ", + "NumberC", + "; }>, ", + "PartialC", + "<{ timesliceTarget: ", + "NumberC", + "; timesliceWindow: ", + "Type", + "<", + { + "pluginId": "@kbn/slo-schema", + "scope": "common", + "docId": "kibKbnSloSchemaPluginApi", + "section": "def-common.Duration", + "text": "Duration" + }, + ", string, unknown>; }>]>; }>]>; }> | undefined; handler: ({}: ", { "pluginId": "observability", "scope": "server", @@ -11020,7 +11141,15 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params: { body: { indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; range: { start: number; end: number; }; }; }; }) => Promise<({ date: string; sliValue: number; } & { events?: { good: number; bad: number; total: number; } | undefined; })[]>; } & ", + " & { params: { body: { indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; range: { start: number; end: number; }; } & { objective?: ({ target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: ", + { + "pluginId": "@kbn/slo-schema", + "scope": "common", + "docId": "kibKbnSloSchemaPluginApi", + "section": "def-common.Duration", + "text": "Duration" + }, + " | undefined; }) | undefined; }; }; }) => Promise<({ date: string; sliValue: number; } & { events?: { good: number; bad: number; total: number; } | undefined; })[]>; } & ", { "pluginId": "observability", "scope": "server", @@ -14498,7 +14627,7 @@ "label": "value", "description": [], "signature": [ - "false" + "true" ], "path": "x-pack/plugins/observability/server/ui_settings.ts", "deprecated": false, @@ -14512,7 +14641,7 @@ "label": "requiresPageReload", "description": [], "signature": [ - "false" + "true" ], "path": "x-pack/plugins/observability/server/ui_settings.ts", "deprecated": false, @@ -17609,7 +17738,7 @@ "label": "TimeUnitChar", "description": [], "signature": [ - "\"m\" | \"s\" | \"d\" | \"h\"" + "\"m\" | \"d\" | \"h\" | \"s\"" ], "path": "x-pack/plugins/observability/common/utils/formatters/duration.ts", "deprecated": false, diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 612252e480ab6..652eb9422ceba 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 615 | 2 | 606 | 17 | +| 619 | 2 | 610 | 17 | ## Client diff --git a/api_docs/observability_a_i_assistant.devdocs.json b/api_docs/observability_a_i_assistant.devdocs.json index 1c17941059fad..78ec525b7157e 100644 --- a/api_docs/observability_a_i_assistant.devdocs.json +++ b/api_docs/observability_a_i_assistant.devdocs.json @@ -858,7 +858,7 @@ "Readable", ">; } & ", "ObservabilityAIAssistantRouteCreateOptions", - "; }, TEndpoint> & Omit & { signal: AbortSignal | null; }>) => Promise<", + "; }, TEndpoint> & Omit & { signal: AbortSignal | null; }>) => Promise<", { "pluginId": "@kbn/server-route-repository", "scope": "common", diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 6b16e970cea5c..8c9f1561cb54d 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_logs_explorer.devdocs.json b/api_docs/observability_logs_explorer.devdocs.json index 93f27162c10f6..b77b6ab973f90 100644 --- a/api_docs/observability_logs_explorer.devdocs.json +++ b/api_docs/observability_logs_explorer.devdocs.json @@ -396,10 +396,10 @@ "misc": [ { "parentPluginId": "observabilityLogsExplorer", - "id": "def-common.OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY", + "id": "def-common.OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY", "type": "string", "tags": [], - "label": "OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY", + "label": "OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY", "description": [], "signature": [ "\"pageState\"" diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx index 984f137b14d61..9e7a241616ef4 100644 --- a/api_docs/observability_logs_explorer.mdx +++ b/api_docs/observability_logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogsExplorer title: "observabilityLogsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogsExplorer plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer'] --- import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 89ae145317a0b..1567a600bedcc 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 4f117ca4d9168..bd3f72c735bf9 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index df3c0245561b9..76f4e355962ed 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index 79e8b8bb50eda..3d67017cec38d 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index e01f50d05ba60..38f8c05e0a229 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,20 +15,20 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a
public API | Number of teams | |--------------|----------|------------------------| -| 749 | 641 | 42 | +| 749 | 641 | 40 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 79420 | 230 | 68016 | 1713 | +| 79459 | 229 | 68044 | 1713 | ## Plugin Directory | Plugin name           | Maintaining team | Description | API Cnt | Any Cnt | Missing
comments | Missing
exports | |--------------|----------------|-----------|--------------|----------|---------------|--------| | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 276 | 0 | 270 | 31 | -| | [@elastic/appex-sharedux @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 17 | 1 | 15 | 2 | +| | [@elastic/appex-sharedux @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 2 | 0 | 2 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 70 | 1 | 4 | 1 | @@ -51,13 +51,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | The cloud security posture plugin | 14 | 0 | 2 | 2 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 29 | 0 | 23 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Content management app | 149 | 0 | 126 | 6 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Controls Plugin contains embeddable components intended to create a simple query interface for end users, and a powerful editing suite that allows dashboard authors to build controls | 311 | 0 | 304 | 16 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Controls Plugin contains embeddable components intended to create a simple query interface for end users, and a powerful editing suite that allows dashboard authors to build controls | 317 | 0 | 309 | 16 | | crossClusterReplication | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | | customBranding | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Enables customization of Kibana | 0 | 0 | 0 | 0 | | | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 268 | 0 | 249 | 1 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 109 | 0 | 106 | 11 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 108 | 0 | 105 | 12 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 54 | 0 | 51 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3233 | 31 | 2582 | 23 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3234 | 31 | 2583 | 23 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin provides the ability to create data views via a modal flyout inside Kibana apps | 35 | 0 | 25 | 5 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Reusable data view field editor across Kibana | 72 | 0 | 33 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data view management app | 2 | 0 | 2 | 0 | @@ -109,7 +109,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Image embeddable | 3 | 0 | 3 | 1 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 4 | 0 | 4 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 215 | 0 | 210 | 4 | -| | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | This plugin visualizes data from Filebeat and Metricbeat, and integrates with other Observability solutions | 32 | 0 | 29 | 8 | +| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin visualizes data from Filebeat and Metricbeat, and integrates with other Observability solutions | 32 | 0 | 29 | 8 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 4 | 0 | 4 | 0 | | inputControlVis | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds Input Control visualization to Kibana | 0 | 0 | 0 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 127 | 2 | 100 | 4 | @@ -119,14 +119,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | kibanaUsageCollection | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 609 | 3 | 416 | 9 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 5 | 0 | 5 | 1 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 658 | 0 | 557 | 61 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 661 | 0 | 560 | 61 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 8 | 0 | 8 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 4 | 0 | 4 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 117 | 0 | 42 | 10 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | A dashboard panel for creating links to dashboards or external links. | 57 | 0 | 57 | 6 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 224 | 0 | 96 | 51 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin provides a LogExplorer component using the Discover customization framework, offering several affordances specifically designed for log consumption. | 87 | 0 | 87 | 16 | -| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | Exposes the shared components and APIs to access and visualize logs. | 302 | 0 | 287 | 32 | +| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | Exposes the shared components and APIs to access and visualize logs. | 302 | 0 | 276 | 32 | | logstash | [@elastic/logstash](https://github.com/orgs/elastic/teams/logstash) | - | 0 | 0 | 0 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 45 | 0 | 45 | 7 | | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | - | 261 | 0 | 260 | 28 | @@ -140,7 +140,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | -| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 615 | 2 | 606 | 17 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 619 | 2 | 610 | 17 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 75 | 0 | 73 | 13 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin exposes and registers observability log consumption features. | 18 | 0 | 18 | 1 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 14 | 0 | 14 | 0 | @@ -185,7 +185,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 1 | 0 | 1 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 0 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 24 | 0 | 9 | 0 | -| | [@elastic/protections-experience](https://github.com/orgs/elastic/teams/protections-experience) | Elastic threat intelligence helps you see if you are open to or have been subject to current or historical known threats | 30 | 0 | 14 | 5 | +| | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | Elastic threat intelligence helps you see if you are open to or have been subject to current or historical known threats | 30 | 0 | 14 | 5 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 240 | 1 | 196 | 17 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the transforms features provided by Elastic. Transforms enable you to convert existing Elasticsearch indices into summarized indices, which provide opportunities for new insights and analytics. | 4 | 0 | 4 | 1 | | translations | [@elastic/kibana-localization](https://github.com/orgs/elastic/teams/kibana-localization) | - | 0 | 0 | 0 | 0 | @@ -214,7 +214,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Registers the vega visualization. Is the elastic version of vega and vega-lite libraries. | 2 | 0 | 2 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the vislib visualizations. These are the classical area/line/bar, gauge/goal and heatmap charts. We want to replace them with elastic-charts. | 1 | 0 | 1 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the new xy-axis chart using the elastic-charts library, which will eventually replace the vislib xy-axis charts including bar, area, and line. | 52 | 0 | 50 | 5 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the shared architecture among all the legacy visualizations, e.g. the visualization type registry or the visualization embeddable. | 840 | 12 | 809 | 19 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the shared architecture among all the legacy visualizations, e.g. the visualization type registry or the visualization embeddable. | 839 | 12 | 808 | 19 | | watcher | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | ## Package Directory @@ -239,7 +239,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 22 | 0 | 1 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 44 | 0 | 44 | 8 | -| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 188 | 0 | 188 | 28 | +| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 189 | 0 | 189 | 28 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 11 | 0 | 11 | 0 | | | [@elastic/kibana-qa](https://github.com/orgs/elastic/teams/kibana-qa) | - | 12 | 0 | 12 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 4 | 0 | 1 | 0 | @@ -457,9 +457,9 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 13 | 0 | 5 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 35 | 0 | 34 | 0 | | | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 104 | 0 | 84 | 6 | -| | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 34 | 0 | 32 | 0 | +| | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 59 | 0 | 57 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 52 | 0 | 37 | 7 | -| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 31 | 0 | 18 | 1 | +| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 32 | 0 | 19 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 3 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 269 | 1 | 209 | 15 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 30 | 0 | 30 | 0 | @@ -474,7 +474,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-qa](https://github.com/orgs/elastic/teams/appex-qa) | - | 550 | 6 | 510 | 2 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 1 | 0 | 0 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 1 | 0 | 1 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 26 | 0 | 25 | 1 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 25 | 0 | 25 | 1 | | | [@elastic/platform-onboarding](https://github.com/orgs/elastic/teams/platform-onboarding) | - | 49 | 0 | 47 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 33 | 3 | 24 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 3 | 0 | 3 | 0 | @@ -507,7 +507,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 45 | 0 | 0 | 0 | | | [@elastic/appex-sharedux @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 133 | 0 | 131 | 0 | | | [@elastic/appex-sharedux @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 20 | 0 | 11 | 0 | -| | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 83 | 0 | 5 | 0 | +| | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 88 | 0 | 10 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 56 | 0 | 6 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 2 | 0 | 0 | 0 | | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | - | 592 | 1 | 1 | 0 | @@ -568,9 +568,9 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 40 | 0 | 38 | 5 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 13 | 0 | 9 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 6 | 0 | 6 | 1 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 80 | 0 | 72 | 8 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 80 | 0 | 72 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 52 | 0 | 52 | 3 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 23 | 0 | 20 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 25 | 0 | 22 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 34 | 0 | 33 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 14 | 0 | 11 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 17 | 0 | 16 | 0 | @@ -604,7 +604,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 17 | 0 | 12 | 8 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 15 | 0 | 7 | 0 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 147 | 0 | 125 | 0 | -| | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 532 | 0 | 519 | 0 | +| | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 534 | 0 | 521 | 0 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 68 | 0 | 38 | 0 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 28 | 0 | 21 | 0 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 69 | 0 | 65 | 0 | @@ -660,8 +660,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 1 | 0 | 1 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 15 | 0 | 4 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 11 | 0 | 3 | 0 | -| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 144 | 0 | 144 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 16 | 0 | 6 | 0 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 146 | 0 | 146 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 20 | 0 | 12 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 4 | 0 | 4 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 102 | 2 | 65 | 1 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index f50ec22643faf..68457a4641f84 100644 --- a/api_docs/presentation_panel.mdx +++ b/api_docs/presentation_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationPanel title: "presentationPanel" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationPanel plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.devdocs.json b/api_docs/presentation_util.devdocs.json index 1f5e66c1067a5..66cfbad90ca3b 100644 --- a/api_docs/presentation_util.devdocs.json +++ b/api_docs/presentation_util.devdocs.json @@ -1186,7 +1186,7 @@ "section": "def-public.ExpressionInputProps", "text": "ExpressionInputProps" }, - " extends Pick, \"style\" | \"className\">" + " extends Pick, \"className\" | \"style\">" ], "path": "src/plugins/presentation_util/public/components/types.ts", "deprecated": false, diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index dfcd8964ad64a..678c74effa366 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index 21794765c67c5..ece2b85fa8a5c 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index 039cc0527470f..6ef0073e7536d 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 6a71ce4967b7c..9a581a25341b9 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index 73f5d2a51e23a..176d64db3915c 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 186f261e3eaf2..ea411d3ec7e88 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.devdocs.json b/api_docs/rule_registry.devdocs.json index bcb7420c25c3c..7a83d2485b070 100644 --- a/api_docs/rule_registry.devdocs.json +++ b/api_docs/rule_registry.devdocs.json @@ -2033,7 +2033,7 @@ "section": "def-server.RuleExecutorOptions", "text": "RuleExecutorOptions" }, - ", { [x: string]: unknown; }, \"default\", never>) => Promise<{ state: TState; }>; id: string; name: string; category: string; validate: { params: ", + ", { [x: string]: unknown; }, \"default\", never>) => Promise<{ state: TState; }>; id: string; name: string; validate: { params: ", "RuleTypeParamsValidator", "; }; cancelAlertsOnRuleTimeout?: boolean | undefined; alerts?: ", { @@ -2059,7 +2059,7 @@ "section": "def-common.ActionGroup", "text": "ActionGroup" }, - "<\"default\">[]; defaultActionGroupId: \"default\"; producer: string; actionVariables?: { context?: ", + "<\"default\">[]; defaultActionGroupId: \"default\"; category: string; producer: string; actionVariables?: { context?: ", { "pluginId": "@kbn/alerting-types", "scope": "common", diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 3e295c6a7c76a..0fa360277ae6e 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 9ff0a98a1275f..500a2779710ef 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 0f3e69e88070d..8a0258795e5e3 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index 32f22ec006445..9e5702ccb2123 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.devdocs.json b/api_docs/saved_objects_management.devdocs.json index 3637af39c4c96..aa1b6ec951d54 100644 --- a/api_docs/saved_objects_management.devdocs.json +++ b/api_docs/saved_objects_management.devdocs.json @@ -294,9 +294,11 @@ "label": "euiColumn", "description": [], "signature": [ - "{ prefix?: string | undefined; scope?: string | undefined; id?: string | undefined; defaultValue?: string | number | readonly string[] | undefined; name: React.ReactNode; security?: string | undefined; children?: React.ReactNode; abbr?: string | undefined; footer?: string | React.ReactElement> | ((props: ", - "EuiTableFooterProps", + "{ prefix?: string | undefined; scope?: string | undefined; id?: string | undefined; defaultValue?: string | number | readonly string[] | undefined; name: React.ReactNode; security?: string | undefined; onChange?: React.FormEventHandler | undefined; defaultChecked?: boolean | undefined; suppressContentEditableWarning?: boolean | undefined; suppressHydrationWarning?: boolean | undefined; accessKey?: string | undefined; className?: string | undefined; contentEditable?: Booleanish | \"inherit\" | undefined; contextMenu?: string | undefined; dir?: string | undefined; draggable?: Booleanish | undefined; hidden?: boolean | undefined; lang?: string | undefined; placeholder?: string | undefined; slot?: string | undefined; spellCheck?: Booleanish | undefined; style?: React.CSSProperties | undefined; tabIndex?: number | undefined; title?: string | undefined; translate?: \"yes\" | \"no\" | undefined; radioGroup?: string | undefined; role?: React.AriaRole | undefined; about?: string | undefined; datatype?: string | undefined; inlist?: any; property?: string | undefined; resource?: string | undefined; typeof?: string | undefined; vocab?: string | undefined; autoCapitalize?: string | undefined; autoCorrect?: string | undefined; autoSave?: string | undefined; color?: string | undefined; itemProp?: string | undefined; itemScope?: boolean | undefined; itemType?: string | undefined; itemID?: string | undefined; itemRef?: string | undefined; results?: number | undefined; unselectable?: \"on\" | \"off\" | undefined; inputMode?: \"search\" | \"none\" | \"text\" | \"url\" | \"email\" | \"tel\" | \"numeric\" | \"decimal\" | undefined; is?: string | undefined; 'aria-activedescendant'?: string | undefined; 'aria-atomic'?: Booleanish | undefined; 'aria-autocomplete'?: \"none\" | \"list\" | \"both\" | \"inline\" | undefined; 'aria-busy'?: Booleanish | undefined; 'aria-checked'?: boolean | \"true\" | \"false\" | \"mixed\" | undefined; 'aria-colcount'?: number | undefined; 'aria-colindex'?: number | undefined; 'aria-colspan'?: number | undefined; 'aria-controls'?: string | undefined; 'aria-current'?: boolean | \"page\" | \"date\" | \"location\" | \"true\" | \"false\" | \"time\" | \"step\" | undefined; 'aria-describedby'?: string | undefined; 'aria-details'?: string | undefined; 'aria-disabled'?: Booleanish | undefined; 'aria-dropeffect'?: \"execute\" | \"link\" | \"none\" | \"copy\" | \"move\" | \"popup\" | undefined; 'aria-errormessage'?: string | undefined; 'aria-expanded'?: Booleanish | undefined; 'aria-flowto'?: string | undefined; 'aria-grabbed'?: Booleanish | undefined; 'aria-haspopup'?: boolean | \"true\" | \"false\" | \"grid\" | \"menu\" | \"dialog\" | \"listbox\" | \"tree\" | undefined; 'aria-hidden'?: Booleanish | undefined; 'aria-invalid'?: boolean | \"true\" | \"false\" | \"grammar\" | \"spelling\" | undefined; 'aria-keyshortcuts'?: string | undefined; 'aria-label'?: string | undefined; 'aria-labelledby'?: string | undefined; 'aria-level'?: number | undefined; 'aria-live'?: \"off\" | \"assertive\" | \"polite\" | undefined; 'aria-modal'?: Booleanish | undefined; 'aria-multiline'?: Booleanish | undefined; 'aria-multiselectable'?: Booleanish | undefined; 'aria-orientation'?: \"horizontal\" | \"vertical\" | undefined; 'aria-owns'?: string | undefined; 'aria-placeholder'?: string | undefined; 'aria-posinset'?: number | undefined; 'aria-pressed'?: boolean | \"true\" | \"false\" | \"mixed\" | undefined; 'aria-readonly'?: Booleanish | undefined; 'aria-relevant'?: \"text\" | \"all\" | \"additions\" | \"additions removals\" | \"additions text\" | \"removals\" | \"removals additions\" | \"removals text\" | \"text additions\" | \"text removals\" | undefined; 'aria-required'?: Booleanish | undefined; 'aria-roledescription'?: string | undefined; 'aria-rowcount'?: number | undefined; 'aria-rowindex'?: number | undefined; 'aria-rowspan'?: number | undefined; 'aria-selected'?: Booleanish | undefined; 'aria-setsize'?: number | undefined; 'aria-sort'?: \"none\" | \"other\" | \"ascending\" | \"descending\" | undefined; 'aria-valuemax'?: number | undefined; 'aria-valuemin'?: number | undefined; 'aria-valuenow'?: number | undefined; 'aria-valuetext'?: string | undefined; children?: React.ReactNode; dangerouslySetInnerHTML?: { __html: string; } | undefined; onCopy?: React.ClipboardEventHandler | undefined; onCopyCapture?: React.ClipboardEventHandler | undefined; onCut?: React.ClipboardEventHandler | undefined; onCutCapture?: React.ClipboardEventHandler | undefined; onPaste?: React.ClipboardEventHandler | undefined; onPasteCapture?: React.ClipboardEventHandler | undefined; onCompositionEnd?: React.CompositionEventHandler | undefined; onCompositionEndCapture?: React.CompositionEventHandler | undefined; onCompositionStart?: React.CompositionEventHandler | undefined; onCompositionStartCapture?: React.CompositionEventHandler | undefined; onCompositionUpdate?: React.CompositionEventHandler | undefined; onCompositionUpdateCapture?: React.CompositionEventHandler | undefined; onFocus?: React.FocusEventHandler | undefined; onFocusCapture?: React.FocusEventHandler | undefined; onBlur?: React.FocusEventHandler | undefined; onBlurCapture?: React.FocusEventHandler | undefined; onChangeCapture?: React.FormEventHandler | undefined; onBeforeInput?: React.FormEventHandler | undefined; onBeforeInputCapture?: React.FormEventHandler | undefined; onInput?: React.FormEventHandler | undefined; onInputCapture?: React.FormEventHandler | undefined; onReset?: React.FormEventHandler | undefined; onResetCapture?: React.FormEventHandler | undefined; onSubmit?: React.FormEventHandler | undefined; onSubmitCapture?: React.FormEventHandler | undefined; onInvalid?: React.FormEventHandler | undefined; onInvalidCapture?: React.FormEventHandler | undefined; onLoad?: React.ReactEventHandler | undefined; onLoadCapture?: React.ReactEventHandler | undefined; onError?: React.ReactEventHandler | undefined; onErrorCapture?: React.ReactEventHandler | undefined; onKeyDown?: React.KeyboardEventHandler | undefined; onKeyDownCapture?: React.KeyboardEventHandler | undefined; onKeyPress?: React.KeyboardEventHandler | undefined; onKeyPressCapture?: React.KeyboardEventHandler | undefined; onKeyUp?: React.KeyboardEventHandler | undefined; onKeyUpCapture?: React.KeyboardEventHandler | undefined; onAbort?: React.ReactEventHandler | undefined; onAbortCapture?: React.ReactEventHandler | undefined; onCanPlay?: React.ReactEventHandler | undefined; onCanPlayCapture?: React.ReactEventHandler | undefined; onCanPlayThrough?: React.ReactEventHandler | undefined; onCanPlayThroughCapture?: React.ReactEventHandler | undefined; onDurationChange?: React.ReactEventHandler | undefined; onDurationChangeCapture?: React.ReactEventHandler | undefined; onEmptied?: React.ReactEventHandler | undefined; onEmptiedCapture?: React.ReactEventHandler | undefined; onEncrypted?: React.ReactEventHandler | undefined; onEncryptedCapture?: React.ReactEventHandler | undefined; onEnded?: React.ReactEventHandler | undefined; onEndedCapture?: React.ReactEventHandler | undefined; onLoadedData?: React.ReactEventHandler | undefined; onLoadedDataCapture?: React.ReactEventHandler | undefined; onLoadedMetadata?: React.ReactEventHandler | undefined; onLoadedMetadataCapture?: React.ReactEventHandler | undefined; onLoadStart?: React.ReactEventHandler | undefined; onLoadStartCapture?: React.ReactEventHandler | undefined; onPause?: React.ReactEventHandler | undefined; onPauseCapture?: React.ReactEventHandler | undefined; onPlay?: React.ReactEventHandler | undefined; onPlayCapture?: React.ReactEventHandler | undefined; onPlaying?: React.ReactEventHandler | undefined; onPlayingCapture?: React.ReactEventHandler | undefined; onProgress?: React.ReactEventHandler | undefined; onProgressCapture?: React.ReactEventHandler | undefined; onRateChange?: React.ReactEventHandler | undefined; onRateChangeCapture?: React.ReactEventHandler | undefined; onSeeked?: React.ReactEventHandler | undefined; onSeekedCapture?: React.ReactEventHandler | undefined; onSeeking?: React.ReactEventHandler | undefined; onSeekingCapture?: React.ReactEventHandler | undefined; onStalled?: React.ReactEventHandler | undefined; onStalledCapture?: React.ReactEventHandler | undefined; onSuspend?: React.ReactEventHandler | undefined; onSuspendCapture?: React.ReactEventHandler | undefined; onTimeUpdate?: React.ReactEventHandler | undefined; onTimeUpdateCapture?: React.ReactEventHandler | undefined; onVolumeChange?: React.ReactEventHandler | undefined; onVolumeChangeCapture?: React.ReactEventHandler | undefined; onWaiting?: React.ReactEventHandler | undefined; onWaitingCapture?: React.ReactEventHandler | undefined; onAuxClick?: React.MouseEventHandler | undefined; onAuxClickCapture?: React.MouseEventHandler | undefined; onClick?: React.MouseEventHandler | undefined; onClickCapture?: React.MouseEventHandler | undefined; onContextMenu?: React.MouseEventHandler | undefined; onContextMenuCapture?: React.MouseEventHandler | undefined; onDoubleClick?: React.MouseEventHandler | undefined; onDoubleClickCapture?: React.MouseEventHandler | undefined; onDrag?: React.DragEventHandler | undefined; onDragCapture?: React.DragEventHandler | undefined; onDragEnd?: React.DragEventHandler | undefined; onDragEndCapture?: React.DragEventHandler | undefined; onDragEnter?: React.DragEventHandler | undefined; onDragEnterCapture?: React.DragEventHandler | undefined; onDragExit?: React.DragEventHandler | undefined; onDragExitCapture?: React.DragEventHandler | undefined; onDragLeave?: React.DragEventHandler | undefined; onDragLeaveCapture?: React.DragEventHandler | undefined; onDragOver?: React.DragEventHandler | undefined; onDragOverCapture?: React.DragEventHandler | undefined; onDragStart?: React.DragEventHandler | undefined; onDragStartCapture?: React.DragEventHandler | undefined; onDrop?: React.DragEventHandler | undefined; onDropCapture?: React.DragEventHandler | undefined; onMouseDown?: React.MouseEventHandler | undefined; onMouseDownCapture?: React.MouseEventHandler | undefined; onMouseEnter?: React.MouseEventHandler | undefined; onMouseLeave?: React.MouseEventHandler | undefined; onMouseMove?: React.MouseEventHandler | undefined; onMouseMoveCapture?: React.MouseEventHandler | undefined; onMouseOut?: React.MouseEventHandler | undefined; onMouseOutCapture?: React.MouseEventHandler | undefined; onMouseOver?: React.MouseEventHandler | undefined; onMouseOverCapture?: React.MouseEventHandler | undefined; onMouseUp?: React.MouseEventHandler | undefined; onMouseUpCapture?: React.MouseEventHandler | undefined; onSelect?: React.ReactEventHandler | undefined; onSelectCapture?: React.ReactEventHandler | undefined; onTouchCancel?: React.TouchEventHandler | undefined; onTouchCancelCapture?: React.TouchEventHandler | undefined; onTouchEnd?: React.TouchEventHandler | undefined; onTouchEndCapture?: React.TouchEventHandler | undefined; onTouchMove?: React.TouchEventHandler | undefined; onTouchMoveCapture?: React.TouchEventHandler | undefined; onTouchStart?: React.TouchEventHandler | undefined; onTouchStartCapture?: React.TouchEventHandler | undefined; onPointerDown?: React.PointerEventHandler | undefined; onPointerDownCapture?: React.PointerEventHandler | undefined; onPointerMove?: React.PointerEventHandler | undefined; onPointerMoveCapture?: React.PointerEventHandler | undefined; onPointerUp?: React.PointerEventHandler | undefined; onPointerUpCapture?: React.PointerEventHandler | undefined; onPointerCancel?: React.PointerEventHandler | undefined; onPointerCancelCapture?: React.PointerEventHandler | undefined; onPointerEnter?: React.PointerEventHandler | undefined; onPointerEnterCapture?: React.PointerEventHandler | undefined; onPointerLeave?: React.PointerEventHandler | undefined; onPointerLeaveCapture?: React.PointerEventHandler | undefined; onPointerOver?: React.PointerEventHandler | undefined; onPointerOverCapture?: React.PointerEventHandler | undefined; onPointerOut?: React.PointerEventHandler | undefined; onPointerOutCapture?: React.PointerEventHandler | undefined; onGotPointerCapture?: React.PointerEventHandler | undefined; onGotPointerCaptureCapture?: React.PointerEventHandler | undefined; onLostPointerCapture?: React.PointerEventHandler | undefined; onLostPointerCaptureCapture?: React.PointerEventHandler | undefined; onScroll?: React.UIEventHandler | undefined; onScrollCapture?: React.UIEventHandler | undefined; onWheel?: React.WheelEventHandler | undefined; onWheelCapture?: React.WheelEventHandler | undefined; onAnimationStart?: React.AnimationEventHandler | undefined; onAnimationStartCapture?: React.AnimationEventHandler | undefined; onAnimationEnd?: React.AnimationEventHandler | undefined; onAnimationEndCapture?: React.AnimationEventHandler | undefined; onAnimationIteration?: React.AnimationEventHandler | undefined; onAnimationIterationCapture?: React.AnimationEventHandler | undefined; onTransitionEnd?: React.TransitionEventHandler | undefined; onTransitionEndCapture?: React.TransitionEventHandler | undefined; 'data-test-subj'?: string | undefined; css?: ", + "Interpolation", "<", + "Theme", + ">; field: (string & {}) | keyof ", { "pluginId": "savedObjectsManagement", "scope": "public", @@ -304,11 +306,9 @@ "section": "def-public.SavedObjectsManagementRecord", "text": "SavedObjectsManagementRecord" }, - ">) => React.ReactNode) | undefined; slot?: string | undefined; style?: React.CSSProperties | undefined; title?: string | undefined; description?: string | undefined; onChange?: React.FormEventHandler | undefined; defaultChecked?: boolean | undefined; suppressContentEditableWarning?: boolean | undefined; suppressHydrationWarning?: boolean | undefined; accessKey?: string | undefined; className?: string | undefined; contentEditable?: Booleanish | \"inherit\" | undefined; contextMenu?: string | undefined; dir?: string | undefined; draggable?: Booleanish | undefined; hidden?: boolean | undefined; lang?: string | undefined; placeholder?: string | undefined; spellCheck?: Booleanish | undefined; tabIndex?: number | undefined; translate?: \"yes\" | \"no\" | undefined; radioGroup?: string | undefined; role?: React.AriaRole | undefined; about?: string | undefined; datatype?: string | undefined; inlist?: any; property?: string | undefined; resource?: string | undefined; typeof?: string | undefined; vocab?: string | undefined; autoCapitalize?: string | undefined; autoCorrect?: string | undefined; autoSave?: string | undefined; color?: string | undefined; itemProp?: string | undefined; itemScope?: boolean | undefined; itemType?: string | undefined; itemID?: string | undefined; itemRef?: string | undefined; results?: number | undefined; unselectable?: \"on\" | \"off\" | undefined; inputMode?: \"search\" | \"none\" | \"text\" | \"url\" | \"email\" | \"tel\" | \"numeric\" | \"decimal\" | undefined; is?: string | undefined; 'aria-activedescendant'?: string | undefined; 'aria-atomic'?: Booleanish | undefined; 'aria-autocomplete'?: \"none\" | \"list\" | \"both\" | \"inline\" | undefined; 'aria-busy'?: Booleanish | undefined; 'aria-checked'?: boolean | \"true\" | \"false\" | \"mixed\" | undefined; 'aria-colcount'?: number | undefined; 'aria-colindex'?: number | undefined; 'aria-colspan'?: number | undefined; 'aria-controls'?: string | undefined; 'aria-current'?: boolean | \"page\" | \"date\" | \"time\" | \"location\" | \"true\" | \"false\" | \"step\" | undefined; 'aria-describedby'?: string | undefined; 'aria-details'?: string | undefined; 'aria-disabled'?: Booleanish | undefined; 'aria-dropeffect'?: \"execute\" | \"link\" | \"none\" | \"copy\" | \"move\" | \"popup\" | undefined; 'aria-errormessage'?: string | undefined; 'aria-expanded'?: Booleanish | undefined; 'aria-flowto'?: string | undefined; 'aria-grabbed'?: Booleanish | undefined; 'aria-haspopup'?: boolean | \"dialog\" | \"menu\" | \"true\" | \"false\" | \"grid\" | \"listbox\" | \"tree\" | undefined; 'aria-hidden'?: Booleanish | undefined; 'aria-invalid'?: boolean | \"true\" | \"false\" | \"grammar\" | \"spelling\" | undefined; 'aria-keyshortcuts'?: string | undefined; 'aria-label'?: string | undefined; 'aria-labelledby'?: string | undefined; 'aria-level'?: number | undefined; 'aria-live'?: \"off\" | \"assertive\" | \"polite\" | undefined; 'aria-modal'?: Booleanish | undefined; 'aria-multiline'?: Booleanish | undefined; 'aria-multiselectable'?: Booleanish | undefined; 'aria-orientation'?: \"horizontal\" | \"vertical\" | undefined; 'aria-owns'?: string | undefined; 'aria-placeholder'?: string | undefined; 'aria-posinset'?: number | undefined; 'aria-pressed'?: boolean | \"true\" | \"false\" | \"mixed\" | undefined; 'aria-readonly'?: Booleanish | undefined; 'aria-relevant'?: \"text\" | \"all\" | \"additions\" | \"additions removals\" | \"additions text\" | \"removals\" | \"removals additions\" | \"removals text\" | \"text additions\" | \"text removals\" | undefined; 'aria-required'?: Booleanish | undefined; 'aria-roledescription'?: string | undefined; 'aria-rowcount'?: number | undefined; 'aria-rowindex'?: number | undefined; 'aria-rowspan'?: number | undefined; 'aria-selected'?: Booleanish | undefined; 'aria-setsize'?: number | undefined; 'aria-sort'?: \"none\" | \"other\" | \"ascending\" | \"descending\" | undefined; 'aria-valuemax'?: number | undefined; 'aria-valuemin'?: number | undefined; 'aria-valuenow'?: number | undefined; 'aria-valuetext'?: string | undefined; dangerouslySetInnerHTML?: { __html: string; } | undefined; onCopy?: React.ClipboardEventHandler | undefined; onCopyCapture?: React.ClipboardEventHandler | undefined; onCut?: React.ClipboardEventHandler | undefined; onCutCapture?: React.ClipboardEventHandler | undefined; onPaste?: React.ClipboardEventHandler | undefined; onPasteCapture?: React.ClipboardEventHandler | undefined; onCompositionEnd?: React.CompositionEventHandler | undefined; onCompositionEndCapture?: React.CompositionEventHandler | undefined; onCompositionStart?: React.CompositionEventHandler | undefined; onCompositionStartCapture?: React.CompositionEventHandler | undefined; onCompositionUpdate?: React.CompositionEventHandler | undefined; onCompositionUpdateCapture?: React.CompositionEventHandler | undefined; onFocus?: React.FocusEventHandler | undefined; onFocusCapture?: React.FocusEventHandler | undefined; onBlur?: React.FocusEventHandler | undefined; onBlurCapture?: React.FocusEventHandler | undefined; onChangeCapture?: React.FormEventHandler | undefined; onBeforeInput?: React.FormEventHandler | undefined; onBeforeInputCapture?: React.FormEventHandler | undefined; onInput?: React.FormEventHandler | undefined; onInputCapture?: React.FormEventHandler | undefined; onReset?: React.FormEventHandler | undefined; onResetCapture?: React.FormEventHandler | undefined; onSubmit?: React.FormEventHandler | undefined; onSubmitCapture?: React.FormEventHandler | undefined; onInvalid?: React.FormEventHandler | undefined; onInvalidCapture?: React.FormEventHandler | undefined; onLoad?: React.ReactEventHandler | undefined; onLoadCapture?: React.ReactEventHandler | undefined; onError?: React.ReactEventHandler | undefined; onErrorCapture?: React.ReactEventHandler | undefined; onKeyDown?: React.KeyboardEventHandler | undefined; onKeyDownCapture?: React.KeyboardEventHandler | undefined; onKeyPress?: React.KeyboardEventHandler | undefined; onKeyPressCapture?: React.KeyboardEventHandler | undefined; onKeyUp?: React.KeyboardEventHandler | undefined; onKeyUpCapture?: React.KeyboardEventHandler | undefined; onAbort?: React.ReactEventHandler | undefined; onAbortCapture?: React.ReactEventHandler | undefined; onCanPlay?: React.ReactEventHandler | undefined; onCanPlayCapture?: React.ReactEventHandler | undefined; onCanPlayThrough?: React.ReactEventHandler | undefined; onCanPlayThroughCapture?: React.ReactEventHandler | undefined; onDurationChange?: React.ReactEventHandler | undefined; onDurationChangeCapture?: React.ReactEventHandler | undefined; onEmptied?: React.ReactEventHandler | undefined; onEmptiedCapture?: React.ReactEventHandler | undefined; onEncrypted?: React.ReactEventHandler | undefined; onEncryptedCapture?: React.ReactEventHandler | undefined; onEnded?: React.ReactEventHandler | undefined; onEndedCapture?: React.ReactEventHandler | undefined; onLoadedData?: React.ReactEventHandler | undefined; onLoadedDataCapture?: React.ReactEventHandler | undefined; onLoadedMetadata?: React.ReactEventHandler | undefined; onLoadedMetadataCapture?: React.ReactEventHandler | undefined; onLoadStart?: React.ReactEventHandler | undefined; onLoadStartCapture?: React.ReactEventHandler | undefined; onPause?: React.ReactEventHandler | undefined; onPauseCapture?: React.ReactEventHandler | undefined; onPlay?: React.ReactEventHandler | undefined; onPlayCapture?: React.ReactEventHandler | undefined; onPlaying?: React.ReactEventHandler | undefined; onPlayingCapture?: React.ReactEventHandler | undefined; onProgress?: React.ReactEventHandler | undefined; onProgressCapture?: React.ReactEventHandler | undefined; onRateChange?: React.ReactEventHandler | undefined; onRateChangeCapture?: React.ReactEventHandler | undefined; onSeeked?: React.ReactEventHandler | undefined; onSeekedCapture?: React.ReactEventHandler | undefined; onSeeking?: React.ReactEventHandler | undefined; onSeekingCapture?: React.ReactEventHandler | undefined; onStalled?: React.ReactEventHandler | undefined; onStalledCapture?: React.ReactEventHandler | undefined; onSuspend?: React.ReactEventHandler | undefined; onSuspendCapture?: React.ReactEventHandler | undefined; onTimeUpdate?: React.ReactEventHandler | undefined; onTimeUpdateCapture?: React.ReactEventHandler | undefined; onVolumeChange?: React.ReactEventHandler | undefined; onVolumeChangeCapture?: React.ReactEventHandler | undefined; onWaiting?: React.ReactEventHandler | undefined; onWaitingCapture?: React.ReactEventHandler | undefined; onAuxClick?: React.MouseEventHandler | undefined; onAuxClickCapture?: React.MouseEventHandler | undefined; onClick?: React.MouseEventHandler | undefined; onClickCapture?: React.MouseEventHandler | undefined; onContextMenu?: React.MouseEventHandler | undefined; onContextMenuCapture?: React.MouseEventHandler | undefined; onDoubleClick?: React.MouseEventHandler | undefined; onDoubleClickCapture?: React.MouseEventHandler | undefined; onDrag?: React.DragEventHandler | undefined; onDragCapture?: React.DragEventHandler | undefined; onDragEnd?: React.DragEventHandler | undefined; onDragEndCapture?: React.DragEventHandler | undefined; onDragEnter?: React.DragEventHandler | undefined; onDragEnterCapture?: React.DragEventHandler | undefined; onDragExit?: React.DragEventHandler | undefined; onDragExitCapture?: React.DragEventHandler | undefined; onDragLeave?: React.DragEventHandler | undefined; onDragLeaveCapture?: React.DragEventHandler | undefined; onDragOver?: React.DragEventHandler | undefined; onDragOverCapture?: React.DragEventHandler | undefined; onDragStart?: React.DragEventHandler | undefined; onDragStartCapture?: React.DragEventHandler | undefined; onDrop?: React.DragEventHandler | undefined; onDropCapture?: React.DragEventHandler | undefined; onMouseDown?: React.MouseEventHandler | undefined; onMouseDownCapture?: React.MouseEventHandler | undefined; onMouseEnter?: React.MouseEventHandler | undefined; onMouseLeave?: React.MouseEventHandler | undefined; onMouseMove?: React.MouseEventHandler | undefined; onMouseMoveCapture?: React.MouseEventHandler | undefined; onMouseOut?: React.MouseEventHandler | undefined; onMouseOutCapture?: React.MouseEventHandler | undefined; onMouseOver?: React.MouseEventHandler | undefined; onMouseOverCapture?: React.MouseEventHandler | undefined; onMouseUp?: React.MouseEventHandler | undefined; onMouseUpCapture?: React.MouseEventHandler | undefined; onSelect?: React.ReactEventHandler | undefined; onSelectCapture?: React.ReactEventHandler | undefined; onTouchCancel?: React.TouchEventHandler | undefined; onTouchCancelCapture?: React.TouchEventHandler | undefined; onTouchEnd?: React.TouchEventHandler | undefined; onTouchEndCapture?: React.TouchEventHandler | undefined; onTouchMove?: React.TouchEventHandler | undefined; onTouchMoveCapture?: React.TouchEventHandler | undefined; onTouchStart?: React.TouchEventHandler | undefined; onTouchStartCapture?: React.TouchEventHandler | undefined; onPointerDown?: React.PointerEventHandler | undefined; onPointerDownCapture?: React.PointerEventHandler | undefined; onPointerMove?: React.PointerEventHandler | undefined; onPointerMoveCapture?: React.PointerEventHandler | undefined; onPointerUp?: React.PointerEventHandler | undefined; onPointerUpCapture?: React.PointerEventHandler | undefined; onPointerCancel?: React.PointerEventHandler | undefined; onPointerCancelCapture?: React.PointerEventHandler | undefined; onPointerEnter?: React.PointerEventHandler | undefined; onPointerEnterCapture?: React.PointerEventHandler | undefined; onPointerLeave?: React.PointerEventHandler | undefined; onPointerLeaveCapture?: React.PointerEventHandler | undefined; onPointerOver?: React.PointerEventHandler | undefined; onPointerOverCapture?: React.PointerEventHandler | undefined; onPointerOut?: React.PointerEventHandler | undefined; onPointerOutCapture?: React.PointerEventHandler | undefined; onGotPointerCapture?: React.PointerEventHandler | undefined; onGotPointerCaptureCapture?: React.PointerEventHandler | undefined; onLostPointerCapture?: React.PointerEventHandler | undefined; onLostPointerCaptureCapture?: React.PointerEventHandler | undefined; onScroll?: React.UIEventHandler | undefined; onScrollCapture?: React.UIEventHandler | undefined; onWheel?: React.WheelEventHandler | undefined; onWheelCapture?: React.WheelEventHandler | undefined; onAnimationStart?: React.AnimationEventHandler | undefined; onAnimationStartCapture?: React.AnimationEventHandler | undefined; onAnimationEnd?: React.AnimationEventHandler | undefined; onAnimationEndCapture?: React.AnimationEventHandler | undefined; onAnimationIteration?: React.AnimationEventHandler | undefined; onAnimationIterationCapture?: React.AnimationEventHandler | undefined; onTransitionEnd?: React.TransitionEventHandler | undefined; onTransitionEndCapture?: React.TransitionEventHandler | undefined; 'data-test-subj'?: string | undefined; css?: ", - "Interpolation", + "; description?: string | undefined; width?: string | undefined; headers?: string | undefined; abbr?: string | undefined; footer?: string | React.ReactElement> | ((props: ", + "EuiTableFooterProps", "<", - "Theme", - ">; field: (string & {}) | keyof ", { "pluginId": "savedObjectsManagement", "scope": "public", @@ -316,7 +316,7 @@ "section": "def-public.SavedObjectsManagementRecord", "text": "SavedObjectsManagementRecord" }, - "; width?: string | undefined; headers?: string | undefined; dataType?: ", + ">) => React.ReactNode) | undefined; dataType?: ", "EuiTableDataType", " | undefined; render?: ((value: any, record: ", { diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index 98db4c8a7249f..9f79b0c37fd8b 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.devdocs.json b/api_docs/saved_objects_tagging.devdocs.json index 96983288749a3..67a4d20675280 100644 --- a/api_docs/saved_objects_tagging.devdocs.json +++ b/api_docs/saved_objects_tagging.devdocs.json @@ -1400,7 +1400,7 @@ "label": "errors", "description": [], "signature": [ - "{ id?: string | undefined; name?: string | undefined; description?: string | undefined; color?: string | undefined; }" + "{ id?: string | undefined; name?: string | undefined; color?: string | undefined; description?: string | undefined; }" ], "path": "x-pack/plugins/saved_objects_tagging/common/validation.ts", "deprecated": false, diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index 129d7b2084a5c..47e70d2db2715 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index 471a02ff6a03a..8338b94c5dfde 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index 0d74aefb49100..71ad01e65a983 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index 078d01b2f6ed0..a14dc5dc986e6 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index 09a9f83ea0fd5..677596ce3aaae 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index aa75dd857b0f6..352b6856b7f01 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json index 3e28b4c302d1c..ae463270c288f 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -473,7 +473,7 @@ "label": "data", "description": [], "signature": [ - "({ type: \"eql\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { summary: boolean; throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"eql\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; license?: string | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; data_view_id?: string | undefined; filters?: unknown[] | undefined; event_category_override?: string | undefined; tiebreaker_field?: string | undefined; timestamp_field?: string | undefined; } | { type: \"query\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { summary: boolean; throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; license?: string | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; saved_id?: string | undefined; response_actions?: ({ params: { query?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; queries?: { id: string; query: string; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; version?: string | undefined; platform?: string | undefined; removed?: boolean | undefined; snapshot?: boolean | undefined; }[] | undefined; pack_id?: string | undefined; saved_query_id?: string | undefined; timeout?: number | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"s\" | \"h\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { type: \"saved_query\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { summary: boolean; throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; saved_id: string; license?: string | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; query?: string | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; response_actions?: ({ params: { query?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; queries?: { id: string; query: string; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; version?: string | undefined; platform?: string | undefined; removed?: boolean | undefined; snapshot?: boolean | undefined; }[] | undefined; pack_id?: string | undefined; saved_query_id?: string | undefined; timeout?: number | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"s\" | \"h\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { type: \"threshold\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { summary: boolean; throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; threshold: { value: number; field: (string | string[]) & (string | string[] | undefined); cardinality?: { value: number; field: string; }[] | undefined; }; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; license?: string | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; saved_id?: string | undefined; alert_suppression?: { duration: { value: number; unit: \"m\" | \"s\" | \"h\"; }; } | undefined; } | { type: \"threat_match\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { summary: boolean; throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; threat_query: string; threat_mapping: { entries: { type: \"mapping\"; value: string; field: string; }[]; }[]; threat_index: string[]; license?: string | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; saved_id?: string | undefined; threat_filters?: unknown[] | undefined; threat_indicator_path?: string | undefined; threat_language?: \"lucene\" | \"kuery\" | undefined; concurrent_searches?: number | undefined; items_per_search?: number | undefined; } | { type: \"machine_learning\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { summary: boolean; throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; anomaly_threshold: number; machine_learning_job_id: (string | string[]) & (string | string[] | undefined); license?: string | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; } | { type: \"new_terms\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { summary: boolean; throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; new_terms_fields: string[]; history_window_start: string; license?: string | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; } | { type: \"esql\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { summary: boolean; throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"esql\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; license?: string | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; })[]" + "({ type: \"eql\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; description: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"eql\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; data_view_id?: string | undefined; filters?: unknown[] | undefined; event_category_override?: string | undefined; tiebreaker_field?: string | undefined; timestamp_field?: string | undefined; } | { type: \"query\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; description: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; saved_id?: string | undefined; response_actions?: ({ params: { query?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; queries?: { id: string; query: string; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; version?: string | undefined; platform?: string | undefined; removed?: boolean | undefined; snapshot?: boolean | undefined; }[] | undefined; pack_id?: string | undefined; saved_query_id?: string | undefined; timeout?: number | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { type: \"saved_query\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; description: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; saved_id: string; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; query?: string | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; response_actions?: ({ params: { query?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; queries?: { id: string; query: string; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; version?: string | undefined; platform?: string | undefined; removed?: boolean | undefined; snapshot?: boolean | undefined; }[] | undefined; pack_id?: string | undefined; saved_query_id?: string | undefined; timeout?: number | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { type: \"threshold\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; description: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; threshold: { value: number; field: (string | string[]) & (string | string[] | undefined); cardinality?: { value: number; field: string; }[] | undefined; }; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; saved_id?: string | undefined; alert_suppression?: { duration: { value: number; unit: \"m\" | \"h\" | \"s\"; }; } | undefined; } | { type: \"threat_match\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; description: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; threat_query: string; threat_mapping: { entries: { type: \"mapping\"; value: string; field: string; }[]; }[]; threat_index: string[]; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; saved_id?: string | undefined; threat_filters?: unknown[] | undefined; threat_indicator_path?: string | undefined; threat_language?: \"lucene\" | \"kuery\" | undefined; concurrent_searches?: number | undefined; items_per_search?: number | undefined; } | { type: \"machine_learning\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; description: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; anomaly_threshold: number; machine_learning_job_id: (string | string[]) & (string | string[] | undefined); license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; } | { type: \"new_terms\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; description: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; new_terms_fields: string[]; history_window_start: string; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; } | { type: \"esql\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; description: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"esql\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; })[]" ], "path": "x-pack/plugins/security_solution/public/detection_engine/rule_management/logic/types.ts", "deprecated": false, diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 2b6709c8f75d7..db477a53cde51 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index 1f659475a583a..2042e4ab11496 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index a41719a129004..11cfd2cb56a32 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index d4959ed193464..620c0322492ce 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index 8aa2115813539..8064112c1bb91 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index 180409fa5cf85..f0bd8808d3909 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 8e8b3e82e6490..c5218b2208565 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 677f7e44db465..db6085a73c3c7 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 64446108aae31..bb3535452acca 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index e2ff600becb52..389ad5fad1f49 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index b8467fd4201f0..7c8c1283b0c37 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index 9a8cbca3f5137..027d4685fe172 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 0389525064ba6..3f8291eec2d0d 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index 0a916c643b125..0702cda8f2b0d 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index 25328ad652062..d1240b776a05d 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index 3203980b8e38d..c58e210e817ce 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index f191827f41cf4..7bbf3160a8805 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index acb8db18002ea..ce7d2c105bc85 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 24a3a0c34c62a..f99caee374b49 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,14 +8,14 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; Elastic threat intelligence helps you see if you are open to or have been subject to current or historical known threats -Contact [@elastic/protections-experience](https://github.com/orgs/elastic/teams/protections-experience) for questions regarding this plugin. +Contact [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/timelines.devdocs.json b/api_docs/timelines.devdocs.json index 48ac70c1d7a93..287fe4d5c5417 100644 --- a/api_docs/timelines.devdocs.json +++ b/api_docs/timelines.devdocs.json @@ -927,7 +927,7 @@ "EuiButtonIconPropsForAnchor", ", ", "EuiButtonIconPropsForButton", - "> & { type?: \"button\" | \"reset\" | \"submit\" | undefined; } & ", + "> & { type?: \"reset\" | \"button\" | \"submit\" | undefined; } & ", "EuiButtonIconProps", " & { onClick?: React.MouseEventHandler | undefined; } & React.ButtonHTMLAttributes & { buttonRef?: React.Ref | undefined; }) | (", "DisambiguateSet", diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index 149d4c67c1a5e..222caf0ec1959 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 9cb73e6b86929..08e86398a60f5 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 9833aa148ddc5..096aa8230932a 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index f1aa1c9b7e491..27e85f5c3751d 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index b034318f619dd..4cce19dba419d 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index 6fd38bafc7d4d..41eb88f5a9566 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.devdocs.json b/api_docs/unified_histogram.devdocs.json index 61836d2e704b2..d94fde9203eb4 100644 --- a/api_docs/unified_histogram.devdocs.json +++ b/api_docs/unified_histogram.devdocs.json @@ -476,7 +476,7 @@ }, " | undefined; } & Pick<", "UnifiedHistogramLayoutProps", - ", \"children\" | \"className\" | \"query\" | \"filters\" | \"columns\" | \"container\" | \"onBrushEnd\" | \"disabledActions\" | \"timeRange\" | \"services\" | \"dataView\" | \"relativeTimeRange\" | \"renderCustomChartToggleActions\" | \"onFilter\" | \"withDefaultActions\"> & ", + ", \"className\" | \"children\" | \"query\" | \"filters\" | \"columns\" | \"container\" | \"onBrushEnd\" | \"disabledActions\" | \"timeRange\" | \"services\" | \"dataView\" | \"relativeTimeRange\" | \"renderCustomChartToggleActions\" | \"onFilter\" | \"withDefaultActions\"> & ", { "pluginId": "@kbn/shared-ux-utility", "scope": "common", @@ -1260,7 +1260,7 @@ }, " | undefined; } & Pick<", "UnifiedHistogramLayoutProps", - ", \"children\" | \"className\" | \"query\" | \"filters\" | \"columns\" | \"container\" | \"onBrushEnd\" | \"disabledActions\" | \"timeRange\" | \"services\" | \"dataView\" | \"relativeTimeRange\" | \"renderCustomChartToggleActions\" | \"onFilter\" | \"withDefaultActions\">" + ", \"className\" | \"children\" | \"query\" | \"filters\" | \"columns\" | \"container\" | \"onBrushEnd\" | \"disabledActions\" | \"timeRange\" | \"services\" | \"dataView\" | \"relativeTimeRange\" | \"renderCustomChartToggleActions\" | \"onFilter\" | \"withDefaultActions\">" ], "path": "src/plugins/unified_histogram/public/container/container.tsx", "deprecated": false, diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 033c2d0cdd6b4..3e03d239c014e 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index d9e0be161951a..fb6c29b97275b 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index 42d4ee8830214..4b98c27f645f2 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index 22f984d3412f8..512023d5120cd 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 243bed4508382..7506532afd971 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index d5faac0f9a06c..3f3e100c1d3f4 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index 179aaf38aaa91..8cf3b13aa59b8 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index 0fc3ccd834ca6..f7cebb5f79154 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index a82f75d596926..4dcccfe0c5c31 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index 6f68ff504ff38..5af231d2191d4 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index 5232a1741fb84..d761fe9c81dbc 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 4da2262ce2286..20da11a3e0315 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index b5e10f1824794..fe72530c8c918 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index d900a62d90798..ce671d04ff394 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index 0815e6f8ac441..08a3970c6ec9e 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index 68606a61c2b40..576d1df35044a 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index 56fe62962c325..b6f8e415e45ab 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.devdocs.json b/api_docs/visualizations.devdocs.json index 6cfb1b1d8445a..2870a94ced614 100644 --- a/api_docs/visualizations.devdocs.json +++ b/api_docs/visualizations.devdocs.json @@ -2874,52 +2874,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "visualizations", - "id": "def-public.HasVisualizeConfig", - "type": "Interface", - "tags": [], - "label": "HasVisualizeConfig", - "description": [], - "path": "src/plugins/visualizations/public/embeddable/interfaces/has_visualize_config.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "visualizations", - "id": "def-public.HasVisualizeConfig.getVis", - "type": "Function", - "tags": [], - "label": "getVis", - "description": [], - "signature": [ - "() => ", - { - "pluginId": "visualizations", - "scope": "public", - "docId": "kibVisualizationsPluginApi", - "section": "def-public.Vis", - "text": "Vis" - }, - "<", - { - "pluginId": "visualizations", - "scope": "common", - "docId": "kibVisualizationsPluginApi", - "section": "def-common.VisParams", - "text": "VisParams" - }, - ">" - ], - "path": "src/plugins/visualizations/public/embeddable/interfaces/has_visualize_config.ts", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] - } - ], - "initialIsOpen": false - }, { "parentPluginId": "visualizations", "id": "def-public.HistogramParams", @@ -6529,6 +6483,44 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "visualizations", + "id": "def-public.HasVisualizeConfig", + "type": "Type", + "tags": [], + "label": "HasVisualizeConfig", + "description": [], + "signature": [ + { + "pluginId": "@kbn/presentation-publishing", + "scope": "common", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-common.HasType", + "text": "HasType" + }, + "<\"visualization\"> & { getVis: () => ", + { + "pluginId": "visualizations", + "scope": "public", + "docId": "kibVisualizationsPluginApi", + "section": "def-public.Vis", + "text": "Vis" + }, + "<", + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.VisParams", + "text": "VisParams" + }, + ">; }" + ], + "path": "src/plugins/visualizations/public/embeddable/interfaces/has_visualize_config.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "visualizations", "id": "def-public.SAVED_OBJECTS_LIMIT_SETTING", @@ -7005,7 +6997,15 @@ "section": "def-common.PhaseEvent", "text": "PhaseEvent" }, - " | undefined>; setPanelTitle: (newTitle: string | undefined) => void; isEditingEnabled: () => boolean; setHidePanelTitle: (hide: boolean | undefined) => void; getTypeDisplayName: () => string; setPanelDescription: (newTitle: string | undefined) => void; render: (domNode: HTMLElement) => Promise; readonly isContainer: boolean; reload: () => Promise; getExplicitInputIsEqual: (lastExplicitInput: Partial<", + " | undefined>; setPanelTitle: (newTitle: string | undefined) => void; isEditingEnabled: () => boolean; setHidePanelTitle: (hide: boolean | undefined) => void; getTypeDisplayName: () => string; setPanelDescription: (newTitle: string | undefined) => void; render: (domNode: HTMLElement) => Promise; getPersistableInput: () => ", + { + "pluginId": "visualizations", + "scope": "public", + "docId": "kibVisualizationsPluginApi", + "section": "def-public.VisualizeInput", + "text": "VisualizeInput" + }, + "; readonly isContainer: boolean; reload: () => Promise; getExplicitInputIsEqual: (lastExplicitInput: Partial<", { "pluginId": "visualizations", "scope": "public", @@ -7021,7 +7021,7 @@ "section": "def-common.ErrorLike", "text": "ErrorLike" }, - ", domNode: Element | HTMLElement) => any) | undefined; fatalError?: Error | undefined; getEditHref: () => string | undefined; getAppContext: () => ", + ", domNode: HTMLElement | Element) => any) | undefined; fatalError?: Error | undefined; getEditHref: () => string | undefined; getAppContext: () => ", { "pluginId": "embeddable", "scope": "public", @@ -7081,15 +7081,7 @@ "VisualizeOutput", ">>; getOutput: () => Readonly<", "VisualizeOutput", - ">; getPersistableInput: () => ", - { - "pluginId": "visualizations", - "scope": "public", - "docId": "kibVisualizationsPluginApi", - "section": "def-public.VisualizeInput", - "text": "VisualizeInput" - }, - "; getInput: () => Readonly<", + ">; getInput: () => Readonly<", { "pluginId": "visualizations", "scope": "public", @@ -16002,7 +15994,7 @@ "label": "TimeScaleUnit", "description": [], "signature": [ - "\"m\" | \"s\" | \"d\" | \"h\"" + "\"m\" | \"d\" | \"h\" | \"s\"" ], "path": "src/plugins/visualizations/common/convert_to_lens/types/common.ts", "deprecated": false, diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index aea5b76306c32..06bd6104bb20c 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2024-01-29 +date: 2024-01-31 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 840 | 12 | 809 | 19 | +| 839 | 12 | 808 | 19 | ## Client diff --git a/config/serverless.es.yml b/config/serverless.es.yml index 61f7b26c00f3f..c998ef8516679 100644 --- a/config/serverless.es.yml +++ b/config/serverless.es.yml @@ -41,6 +41,3 @@ xpack.ml.ad.enabled: false xpack.ml.dfa.enabled: false xpack.ml.nlp.enabled: true xpack.ml.compatibleModuleType: 'search' - -# Enable the embedded dev console for index management pages -xpack.index_management.enableEmbeddedConsole: true diff --git a/config/serverless.oblt.yml b/config/serverless.oblt.yml index d956cae5ba946..e30424b5355a4 100644 --- a/config/serverless.oblt.yml +++ b/config/serverless.oblt.yml @@ -63,10 +63,8 @@ xpack.fleet.internal.registry.excludePackages: [ 'profiler_agent', ] -## Required for force installation of APM Package +## Required for force installation of integration packages xpack.fleet.packages: - - name: apm - version: latest # fleet_server package installed to publish agent metrics - name: fleet_server version: latest @@ -86,3 +84,6 @@ xpack.ml.ad.enabled: true xpack.ml.dfa.enabled: false xpack.ml.nlp.enabled: false xpack.ml.compatibleModuleType: 'observability' + +# Disable the embedded Dev Console +console.ui.embeddedEnabled: false diff --git a/config/serverless.security.yml b/config/serverless.security.yml index 4c3a7be637964..8319f38da9cf6 100644 --- a/config/serverless.security.yml +++ b/config/serverless.security.yml @@ -66,3 +66,6 @@ xpack.ml.ad.enabled: true xpack.ml.dfa.enabled: true xpack.ml.nlp.enabled: false xpack.ml.compatibleModuleType: 'security' + +# Disable the embedded Dev Console +console.ui.embeddedEnabled: false diff --git a/config/serverless.yml b/config/serverless.yml index 575f411466c79..0a1dd4aff8ca9 100644 --- a/config/serverless.yml +++ b/config/serverless.yml @@ -58,7 +58,7 @@ guided_onboarding.enabled: false # Other disabled plugins xpack.canvas.enabled: false data.search.sessions.enabled: false -advanced_settings.enabled: false +advanced_settings.globalSettingsEnabled: false # Disable the browser-side functionality that depends on SecurityCheckupGetStateRoutes xpack.security.showInsecureClusterWarning: false diff --git a/docs/CHANGELOG.asciidoc b/docs/CHANGELOG.asciidoc index 5e5681047e938..f2602029c2dd2 100644 --- a/docs/CHANGELOG.asciidoc +++ b/docs/CHANGELOG.asciidoc @@ -980,7 +980,7 @@ Alerting:: APM:: * Adds KQL filtering in APM rules ({kibana-pull}163825[#163825]). * Make service group saved objects exportable ({kibana-pull}163569[#163569]). -* Added ability to manage Cross-Cluster API keys ({kibana-pull}162363[#162363]). +* Added ability to manage cross-cluster API keys ({kibana-pull}162363[#162363]). * Enable Trace Explorer by default ({kibana-pull}162308[#162308]). * Adds error.grouping_name to group alerts in Error Count rule ({kibana-pull}161810[#161810]). * Adds query to check for overflow bucket in service groups ({kibana-pull}159990[#159990]). diff --git a/docs/api/data-views.asciidoc b/docs/api/data-views.asciidoc index cf9524d4fdf30..ff768fd1a260e 100644 --- a/docs/api/data-views.asciidoc +++ b/docs/api/data-views.asciidoc @@ -16,6 +16,8 @@ The following data views APIs are available: ** <> to create data view ** <> to partially updated data view ** <> to delete a data view + ** <> to preview a data view reference swap + ** <> to perform a data view reference swap * Default data views ** <> to retrieve a default data view ** <> to set a default data view @@ -33,6 +35,8 @@ include::data-views/get.asciidoc[] include::data-views/create.asciidoc[] include::data-views/update.asciidoc[] include::data-views/delete.asciidoc[] +include::data-views/swap_references_preview.asciidoc[] +include::data-views/swap_references.asciidoc[] include::data-views/default-get.asciidoc[] include::data-views/default-set.asciidoc[] include::data-views/update-fields.asciidoc[] diff --git a/docs/api/data-views/swap_references.asciidoc b/docs/api/data-views/swap_references.asciidoc new file mode 100644 index 0000000000000..26f6f9aada21a --- /dev/null +++ b/docs/api/data-views/swap_references.asciidoc @@ -0,0 +1,84 @@ +[[data-views-api-swap-references]] +=== Swap references data view API +++++ +Swap references +++++ + +Swap saved object references + +[WARNING] +==== +Misuse can break large numbers of saved objects! Practicing with a backup is recommended. +==== + +[NOTE] +==== +For the most up-to-date API details, refer to the +{kib-repo}/tree/{branch}/src/plugins/data_views/docs/openapi[open API specification]. +==== + +[[data-views-api-swap-references-request]] +==== Request + +`POST :/api/data_views/swap_references` + +`POST :/s//api/data_views/swap_references` + + +[[data-views-api-swap-references-request-body]] +==== Request body + +`fromId`:: +(Required, string) Saved object reference to change. + +`toId`:: +(Required, string) New saved object reference value to replace the old. + +`delete`:: + (Optional, boolean) Deletes referenced saved object if all references are removed. + +`fromType`:: + (Optional, string) Specify the type of the saved object reference to alter. Default is `index-pattern` for data view. + +`forId`:: +(Optional, string or string[]) Limit the affected saved objects to one or more by IDs. + +`forType`:: + (Optional, string) Limit the affected saved objects by type. + +[[data-views-api-swap-references-errors-codes]] +==== Response code + +`200`:: +Indicates a successful call. + +[[data-views-api-swap-references-example]] +==== Examples + +Swap references to data view id "abcd-efg" with "xyz-123": + +[source,sh] +-------------------------------------------------- +$ curl -X api/data_views/swap_references +{ + "fromId" : "abcd-efg", + "toId" : "xyz-123", + "delete" : true // optional, removes data view which is no longer referenced +} + +-------------------------------------------------- +// KIBANA + +The API returns a list of affected saved objects: + +[source,sh] +-------------------------------------------------- +{ + result: [{ id: "123", type: "visualization" }], + deleteStatus: { + remainingRefs: 0, + deletePerformed: true + } +} +-------------------------------------------------- + diff --git a/docs/api/data-views/swap_references_preview.asciidoc b/docs/api/data-views/swap_references_preview.asciidoc new file mode 100644 index 0000000000000..16581045aaa35 --- /dev/null +++ b/docs/api/data-views/swap_references_preview.asciidoc @@ -0,0 +1,74 @@ +[[data-views-api-swap-references-preview]] +=== Swap references preview data view API +++++ +Swap references preview +++++ + +Swap saved object references preview + +[NOTE] +==== +For the most up-to-date API details, refer to the +{kib-repo}/tree/{branch}/src/plugins/data_views/docs/openapi[open API specification]. +==== + +[[data-views-api-swap-references-preview-request]] +==== Request + +`POST :/api/data_views/swap_references/_preview` + +`POST :/s//api/data_views/swap_references/_preview` + + +[[data-views-api-swap-references-preview-request-body]] +==== Request body + +`fromId`:: +(Required, string) Saved object reference to change. + +`toId`:: +(Required, string) New saved object reference value to replace the old. + +`delete`:: + (Optional, boolean) Deletes referenced saved object if all references are removed. + +`fromType`:: + (Optional, string) Specify the type of the saved object reference to alter. Default is `index-pattern` for data view. + +`forId`:: +(Optional, string or string[]) Limit the affected saved objects to one or more by IDs. + +`forType`:: + (Optional, string) Limit the affected saved objects by type. + +[[data-views-api-swap-references-preview-errors-codes]] +==== Response code + +`200`:: +Indicates a successful call. + +[[data-views-api-swap-references-preview-example]] +==== Examples + +Preview swapping references to data view id "abcd-efg" with "xyz-123": + +[source,sh] +-------------------------------------------------- +$ curl -X api/data_views/swap_references/_preview +{ + "fromId" : "abcd-efg", + "toId" : "xyz-123" +} + +-------------------------------------------------- +// KIBANA + +The API returns a list of affected saved objects: + +[source,sh] +-------------------------------------------------- +{ + result: [{ id: "123", type: "visualization" }], +} +-------------------------------------------------- + diff --git a/docs/apm/advanced-queries.asciidoc b/docs/apm/advanced-queries.asciidoc index 8aac22c742433..c74615f40a647 100644 --- a/docs/apm/advanced-queries.asciidoc +++ b/docs/apm/advanced-queries.asciidoc @@ -57,7 +57,7 @@ and *Discover* supports all of the example APM app queries shown on this page. [[discover-queries]] ==== Discover queries -One example where you may want to make use of *Discover*, +One example where you may want to make use of *Discover* is to view _all_ transactions for an endpoint instead of just a sample. TIP: Starting in v7.6, you can view ten samples per bucket in the APM app, instead of just one. @@ -77,7 +77,7 @@ that took between 13 and 14 milliseconds. Here's what Discover returns: image::apm/images/advanced-discover.png[View all transactions in bucket] You can now explore the data until you find a specific transaction that you're interested in. -Copy that transaction's `transaction.id`, and paste it into the APM app to view the data in the context of the APM app: +Copy that transaction's `transaction.id` and paste it into the APM app to view the data in the context of the APM app: [role="screenshot"] image::apm/images/specific-transaction-search.png[View specific transaction in apm app] diff --git a/docs/apm/filters.asciidoc b/docs/apm/filters.asciidoc index 8ff39e3c1dcf0..e3d085b771a85 100644 --- a/docs/apm/filters.asciidoc +++ b/docs/apm/filters.asciidoc @@ -7,8 +7,8 @@ ++++ Global filters are ways you can filter data across the APM app based on a specific -time range or environment. They are available in the Services, Transactions, Errors, -Metrics, and Traces views, and any filter applied will persist as you move between pages. +time range or environment. When viewing a specific service, the filter persists +as you move between tabs. [role="screenshot"] image::apm/images/global-filters.png[Global filters available in the APM app in Kibana] diff --git a/docs/apm/infrastructure.asciidoc b/docs/apm/infrastructure.asciidoc index 8ca919ffca6c4..ff6343061ca24 100644 --- a/docs/apm/infrastructure.asciidoc +++ b/docs/apm/infrastructure.asciidoc @@ -4,7 +4,7 @@ beta::[] -The *Infrastructure* tab provides information about the containers, pods, and hosts, +The *Infrastructure* tab provides information about the containers, pods, and hosts that the selected service is linked to. [role="screenshot"] @@ -12,4 +12,4 @@ image::apm/images/infra.png[Example view of the Infrastructure tab in APM app in IT ops and software reliability engineers (SREs) can use this tab to quickly find a service's underlying infrastructure resources when debugging a problem. -Knowing what infrastructure is related to a service allows you to remediate issues by restarting, killing hanging instances, changing configuration, rolling back deployments, scaling up, scaling out, etc. \ No newline at end of file +Knowing what infrastructure is related to a service allows you to remediate issues by restarting, killing hanging instances, changing configuration, rolling back deployments, scaling up, scaling out, and so on. \ No newline at end of file diff --git a/docs/apm/machine-learning.asciidoc b/docs/apm/machine-learning.asciidoc index 8f82cb2a00f10..f01cdf70b6e05 100644 --- a/docs/apm/machine-learning.asciidoc +++ b/docs/apm/machine-learning.asciidoc @@ -10,7 +10,7 @@ The Machine learning integration initiates a new job predefined to calculate ano With this integration, you can quickly pinpoint anomalous transactions and see the health of any upstream and downstream services. -Machine learning jobs are created per environment, and are based on a service's average response time. +Machine learning jobs are created per environment and are based on a service's average response time. Because jobs are created at the environment level, you can add new services to your existing environments without the need for additional machine learning jobs. @@ -40,7 +40,7 @@ To enable machine learning anomaly detection: . From the Services overview, Traces overview, or Service Map tab, select **Anomaly detection**. -. Click **Create ML Job**. +. Click **Create Job**. . Machine learning jobs are created at the environment level. Select all of the service environments that you want to enable anomaly detection in. @@ -50,7 +50,7 @@ Anomalies will surface for all services and transaction types within the selecte That's it! After a few minutes, the job will begin calculating results; it might take additional time for results to appear on your service maps. -Existing jobs can be managed in *Machine Learning jobs management*. +To manage existing jobs, click **Manage jobs**. [float] [[warning-ml-integration]] @@ -66,7 +66,7 @@ image::apm/images/apm-anomaly-alert.png[Example view of anomaly alert in the APM [[unkown-ml-integration]] === Unknown service health -After enabling anomaly detection, service health may display as "Unknown". There are three reasons why this can occur: +After enabling anomaly detection, service health may display as "Unknown". Here are some reasons why this can occur: 1. No machine learning job exists. See <> to enable anomaly detection and create a machine learning job. 2. There is no machine learning data for the job. If you just created the machine learning job you'll need to wait a few minutes for data to be available. Alternatively, if the service or its enviroment are new, you'll need to wait for more trace data. diff --git a/docs/apm/service-maps.asciidoc b/docs/apm/service-maps.asciidoc index a0c9dda2188cb..85c8efa4adb5d 100644 --- a/docs/apm/service-maps.asciidoc +++ b/docs/apm/service-maps.asciidoc @@ -62,9 +62,8 @@ This can be useful if you have two or more services, in separate environments, b Use the environment drop-down to only see the data you're interested in, like `dev` or `production`. If there's a specific service that interests you, select that service to highlight its connections. -Clicking **Focus map** will refocus the map on that specific service and lock the connection highlighting. -From here, select **Service Details**, or click on the **Transaction** tab to jump to the Transaction overview -for the selected service. +Click **Focus map** to refocus the map on the selected service and lock the connection highlighting. +From here, select **Service Details**, or click the **Transactions** tab to jump to the Transaction overview for the selected service. You can also use the tabs at the top of the page to easily jump to the **Errors** or **Metrics** overview. [role="screenshot"] @@ -74,7 +73,7 @@ image::apm/images/service-maps-java.png[Example view of service maps in the APM [[service-map-anomaly-detection]] === Anomaly detection with machine learning -Machine learning jobs can be created to calculate anomaly scores on APM transaction durations within the selected service. +You can create machine learning jobs to calculate anomaly scores on APM transaction durations within the selected service. When these jobs are active, service maps will display a color-coded anomaly indicator based on the detected anomaly score: [horizontal] @@ -85,7 +84,7 @@ image:apm/images/red-service.png[APM red service]:: Max anomaly score **≥75**. [role="screenshot"] image::apm/images/apm-service-map-anomaly.png[Example view of anomaly scores on service maps in the APM app] -If an anomaly has been detected, click *view anomalies* to view the anomaly detection metric viewer in the Machine learning app. +If an anomaly has been detected, click *View anomalies* to view the anomaly detection metric viewer in the Machine learning app. This time series analysis will display additional details on the severity and time of the detected anomalies. To learn how to create a machine learning job, see <>. diff --git a/docs/apm/services.asciidoc b/docs/apm/services.asciidoc index 7ce3354ecbf7e..c4deeb7e40322 100644 --- a/docs/apm/services.asciidoc +++ b/docs/apm/services.asciidoc @@ -33,9 +33,14 @@ image::apm/images/apm-service-group.png[Example view of service group in the APM To enable Service groups, open {kib} and navigate to **Stack Management** > **Advanced Settings** > **Observability**, and enable the **Service groups feature**. -To create a service group, navigate to **Observability** > **APM** > **Services** and select **Create group**. -Specify a name, color, and description. -Then, using the <>, specify a query to select services for the group. +To create a service group: + +. Navigate to **Observability** > **APM** > **Services**. +. Switch to **Service groups**. +. Click **Create group**. +. Specify a name, color, and description. +. Click **Select services**. +. Specify a <> query to select services for the group. Services that match the query within the last 24 hours will be assigned to the group. [NOTE] @@ -54,4 +59,3 @@ Not sure where to get started? Here are some sample queries you can build from: * Group services by environment--in this example, "production": `service.environment : "production"` * Group services by name--this example groups those that end in "beat": `service.name : *beat` (matches services named "Auditbeat", "Heartbeat", "Filebeat", etc.) -* Group services with a high transaction duration in the last 24 hours: `transaction.duration.us >= 50000000` diff --git a/docs/apm/transactions.asciidoc b/docs/apm/transactions.asciidoc index b0a1c9ee858de..284d28c7b60c0 100644 --- a/docs/apm/transactions.asciidoc +++ b/docs/apm/transactions.asciidoc @@ -8,7 +8,7 @@ APM agents automatically collect performance metrics on HTTP requests, database [role="screenshot"] image::apm/images/apm-transactions-overview.png[Example view of transactions table in the APM app in Kibana] -The *Latency*, *Throughput*, *Failed transaction rate*, *Average duration by span type*, and *Cold start rate* +The *Latency*, *Throughput*, *Failed transaction rate*, *Time spent by span type*, and *Cold start rate* charts display information on all transactions associated with the selected service: *Latency*:: @@ -38,7 +38,7 @@ These spans will set `event.outcome=failure` and increase the failed transaction If there is no HTTP status, both transactions and spans are considered successful unless an error is reported. ==== -*Average duration by span type*:: +*Time spent by span type*:: Visualize where your application is spending most of its time. For example, is your app spending time in external calls, database processing, or application code execution? + @@ -106,10 +106,10 @@ image::apm/images/apm-transactions-overview.png[Example view of response time di [[transaction-duration-distribution]] ==== Latency distribution -A plot of all transaction durations for the given time period. -The screenshot below shows a typical distribution, +The latency distribution shows a plot of all transaction durations for the given time period. +The following screenshot shows a typical distribution and indicates most of our requests were served quickly -- awesome! -It's the requests on the right, the ones taking longer than average, that we probably need to focus on. +The requests on the right are taking longer than average; we probably need to focus on them. [role="screenshot"] image::apm/images/apm-transaction-duration-dist.png[Example view of latency distribution graph] diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index fe9a0d40f5d23..b2a1823e87443 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -23,7 +23,7 @@ NOTE: |{kib-repo}blob/{branch}/src/plugins/advanced_settings/README.md[advancedSettings] -|This plugin contains the advanced settings management section +|This plugin registers the management settings application allowing users to configure their advanced settings, also known as uiSettings within the code. @@ -648,7 +648,7 @@ using the CURL scripts in the scripts folder. |{kib-repo}blob/{branch}/x-pack/plugins/observability_solution/logs_explorer/README.md[logsExplorer] -|This plugin is home to the component and related types. It implements several of the underlying concepts that the Observability Log Explorer app builds upon. +|This plugin is home to the component and related types. It implements several of the underlying concepts that the Observability Logs Explorer app builds upon. |{kib-repo}blob/{branch}/x-pack/plugins/logs_shared/README.md[logsShared] diff --git a/docs/maps/connect-to-ems.asciidoc b/docs/maps/connect-to-ems.asciidoc index 8fac6a6d95c15..879d4846ef3f1 100644 --- a/docs/maps/connect-to-ems.asciidoc +++ b/docs/maps/connect-to-ems.asciidoc @@ -1,14 +1,17 @@ -[[maps-connect-to-ems]] -== Connect to Elastic Maps Service - +:ems: Elastic Maps Service :ems-docker-repo: docker.elastic.co/elastic-maps-service/elastic-maps-server-ubi8 :ems-docker-image: {ems-docker-repo}:{version} :ems-headers-url: https://deployment-host -https://www.elastic.co/elastic-maps-service[Elastic Maps Service (EMS)] is a service that hosts +[[maps-connect-to-ems]] +== Connect to {ems} + +https://www.elastic.co/elastic-maps-service[{ems} (EMS)] is a service that hosts tile layers and vector shapes of administrative boundaries. If you are using Kibana's out-of-the-box settings, Maps is already configured to use EMS. +If you are on a restricted or fully air-gapped environment, you may need to configure your firewall to enable access to EMS resources. Find below details on the domains and HTTP headers used by {ems}. Alternatively, {ems} can be <> or <>. + [float] === Domains @@ -57,7 +60,8 @@ include::headers/file-data.asciidoc[] [float] -=== Disable Elastic Maps Service +[id=disable-ems] +=== Disable {ems} You might experience EMS connection issues if your Kibana server or browser are on a private network or behind a firewall. If this happens, you can disable the EMS connection to avoid unnecessary EMS requests. @@ -69,11 +73,13 @@ To disable EMS, change your <> file. [float] [id=elastic-maps-server] -=== Host Elastic Maps Service locally +=== Host {ems} locally + +NOTE: Find more details about installing Elastic components in an air-gapped environment in the {stack-ref}/air-gapped-install.html[Elastic Stack documentation]. -If you cannot connect to Elastic Maps Service from the {kib} server or browser clients, and your cluster has the appropriate license level, you can opt to host the service on your own infrastructure. +If you cannot connect to {ems} from the {kib} server or browser clients, and your cluster has the appropriate license level, you can opt to host the service on your own infrastructure. -{hosted-ems} is a self-managed version of Elastic Maps Service offered as a Docker image that provides both the EMS basemaps and EMS boundaries. The image is bundled with basemaps up to zoom level 8. After connecting it to your {es} cluster for license validation, you have the option to download and configure a more detailed basemaps database. +{hosted-ems} is a self-managed version of {ems} offered as a Docker image that provides both the EMS basemaps and EMS boundaries. The image is bundled with basemaps up to zoom level 8. After connecting it to your {es} cluster for license validation, you have the option to download and configure a more detailed basemaps database. You can use +docker pull+ to download the {hosted-ems} image from the Elastic Docker registry. diff --git a/docs/user/security/api-keys/index.asciidoc b/docs/user/security/api-keys/index.asciidoc index eda187ed9096c..5b3dd206b5408 100644 --- a/docs/user/security/api-keys/index.asciidoc +++ b/docs/user/security/api-keys/index.asciidoc @@ -9,9 +9,9 @@ For example, if you extract data from an {es} cluster on a daily basis, you migh You can use {kib} to manage your different API keys: -* Personal API key: allows external services to access the Elastic Stack on behalf of a user. -* Cross-Cluster API key: allows remote clusters to connect to your local cluster. -* Managed API key: created and managed by Kibana to correctly run background tasks. +* User API key: allows external services to access the Elastic Stack on behalf of a user. +* Cross-cluster API key: allows other clusters to connect to this cluster. +* Managed API key: created and managed by Kibana to run background tasks. To manage API keys, open the main menu, then click *Stack Management > Security > API Keys*. @@ -24,7 +24,7 @@ image:images/api-keys.png["API Keys UI"] * To use API keys in {kib}, you must have the `manage_security`, `manage_api_key`, or the `manage_own_api_key` cluster privileges. * To delete API keys, you must have the `manage_api_key` or `manage_own_api_key` privileges. -* To create or update a *personal API key*, you must have the `manage_api_key` or the `manage_own_api_key` privilege. +* To create or update a *user API key*, you must have the `manage_api_key` or the `manage_own_api_key` privilege. * To create or update a *cross-cluster API key*, you must have the `manage_security` privilege and an Enterprise license. * To have a read-only view on the API keys, you must have access to the page and the `read_security` cluster privilege. @@ -40,7 +40,7 @@ To create an API key, open the main menu, then click *Stack Management > Securit image:images/create-ccr-api-key.png["Create API Key UI"] -Refer to the {ref}/security-api-create-api-key.html[create API key] documentation to learn more about creating personal API keys. +Refer to the {ref}/security-api-create-api-key.html[create API key] documentation to learn more about creating user API keys. Refer to the {ref}/security-api-create-cross-cluster-api-key.html[create cross-cluster API key] documentation to learn more about creating cross-cluster API keys. @@ -50,7 +50,7 @@ Refer to the {ref}/security-api-create-cross-cluster-api-key.html[create cross-c To update an API key, open the main menu, click *Stack Management > Security > API Keys*, and then click on the name of the key. You cannot update the name or the type of API key. -Refer to the {ref}/security-api-update-api-key.html[update API key] documentation to learn more about updating personal API keys. +Refer to the {ref}/security-api-update-api-key.html[update API key] documentation to learn more about updating user API keys. Refer to the {ref}/security-api-update-cross-cluster-api-key.html[update cross-cluster API key] documentation to learn more about updating cross-cluster API keys. diff --git a/examples/response_stream/public/containers/app/pages/page_reducer_stream/index.tsx b/examples/response_stream/public/containers/app/pages/page_reducer_stream/index.tsx index cfa672748f7ff..7da5f68e792f8 100644 --- a/examples/response_stream/public/containers/app/pages/page_reducer_stream/index.tsx +++ b/examples/response_stream/public/containers/app/pages/page_reducer_stream/index.tsx @@ -105,7 +105,7 @@ export const PageReducerStream: FC = () => {
- + {buttonLabel} diff --git a/examples/response_stream/public/containers/app/pages/page_simple_string_stream/index.tsx b/examples/response_stream/public/containers/app/pages/page_simple_string_stream/index.tsx index 1656eb26c84da..7075656dc0167 100644 --- a/examples/response_stream/public/containers/app/pages/page_simple_string_stream/index.tsx +++ b/examples/response_stream/public/containers/app/pages/page_simple_string_stream/index.tsx @@ -66,7 +66,7 @@ export const PageSimpleStringStream: FC = () => {
- + {buttonLabel} diff --git a/package.json b/package.json index fcd29bece4829..560ca41044a2d 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@elastic/datemath": "5.0.3", "@elastic/elasticsearch": "npm:@elastic/elasticsearch-canary@8.9.1-canary.1", "@elastic/ems-client": "8.5.1", - "@elastic/eui": "92.1.1", + "@elastic/eui": "92.2.1", "@elastic/filesaver": "1.1.2", "@elastic/node-crypto": "1.2.1", "@elastic/numeral": "^2.5.1", @@ -1041,7 +1041,7 @@ "pretty-ms": "6.0.0", "prop-types": "^15.8.1", "proxy-from-env": "1.0.0", - "puppeteer": "21.5.2", + "puppeteer": "21.9.0", "query-string": "^6.13.2", "rbush": "^3.0.1", "re-resizable": "^6.9.9", @@ -1080,7 +1080,6 @@ "redux-actions": "^2.6.5", "redux-devtools-extension": "^2.13.8", "redux-logger": "^3.0.6", - "redux-observable": "2.0.0", "redux-saga": "^1.1.3", "redux-thunk": "^2.4.2", "redux-thunks": "^1.0.0", @@ -1644,7 +1643,7 @@ "rxjs-marbles": "^7.0.1", "sass-embedded": "^1.70.0", "sass-loader": "^10.5.1", - "selenium-webdriver": "^4.16.0", + "selenium-webdriver": "^4.17.0", "sharp": "0.32.6", "simple-git": "^3.16.0", "sinon": "^7.4.2", diff --git a/packages/core/overlays/core-overlays-browser-internal/src/banners/user_banner_service.tsx b/packages/core/overlays/core-overlays-browser-internal/src/banners/user_banner_service.tsx index 5fdc4439136f9..549b02e4a8f32 100644 --- a/packages/core/overlays/core-overlays-browser-internal/src/banners/user_banner_service.tsx +++ b/packages/core/overlays/core-overlays-browser-internal/src/banners/user_banner_service.tsx @@ -75,7 +75,7 @@ export class UserBannerService { {content.trim()} - banners.remove(id!)}> + banners.remove(id!)}> { 'error.grouping_name': getErrorGroupingKey(message), }); } - error({ message, type }: { message: string; type?: string }) { + error({ message, type, culprit }: { message: string; type?: string; culprit?: string }) { return new ApmError({ ...this.fields, 'error.exception': [{ message, ...(type ? { type } : {}) }], 'error.grouping_name': getErrorGroupingKey(message), + 'error.culprit': culprit, }); } diff --git a/packages/kbn-apm-synthtrace/src/scenarios/helpers/exception_types.ts b/packages/kbn-apm-synthtrace/src/scenarios/helpers/exception_types.ts new file mode 100644 index 0000000000000..a7e7ba34c4846 --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/scenarios/helpers/exception_types.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export const exceptionTypes = [ + 'ProgrammingError', + 'ProtocolError', + 'RangeError', + 'ReadTimeout', + 'ReadTimeoutError', + 'ReferenceError', + 'RemoteDisconnected', + 'RequestAbortedError', + 'ResponseError (action_request_validation_exception)', + 'ResponseError (illegal_argument_exception)', + 'ResponseError (index_not_found_exception)', + 'ResponseError (index_template_missing_exception)', + 'ResponseError (resource_already_exists_exception)', + 'ResponseError (resource_not_found_exception)', + 'ResponseError (search_phase_execution_exception)', + 'ResponseError (security_exception)', + 'ResponseError (transport_serialization_exception)', + 'ResponseError (version_conflict_engine_exception)', + 'ResponseError (x_content_parse_exception)', + 'ResponseError', + 'SIGTRAP', + 'SocketError', + 'SpawnError', + 'SyntaxError', + 'SyscallError', + 'TimeoutError', + 'TimeoutError', + 'TypeError', +]; + +export function getExceptionTypeForIndex(index: number) { + return exceptionTypes[index % exceptionTypes.length]; +} diff --git a/packages/kbn-apm-synthtrace/src/scenarios/logs_and_metrics.ts b/packages/kbn-apm-synthtrace/src/scenarios/logs_and_metrics.ts index 7532b3dc9477c..4227f003771ef 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/logs_and_metrics.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/logs_and_metrics.ts @@ -120,7 +120,10 @@ const scenario: Scenario = async (runOptions) => { .failure() .errors( instance - .error({ message: '[ResponseError] index_not_found_exception' }) + .error({ + message: '[ResponseError] index_not_found_exception', + type: 'ResponseError', + }) .timestamp(timestamp + 50) ) ); diff --git a/packages/kbn-apm-synthtrace/src/scenarios/many_dependencies.ts b/packages/kbn-apm-synthtrace/src/scenarios/many_dependencies.ts new file mode 100644 index 0000000000000..61ecb7832f0f3 --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/scenarios/many_dependencies.ts @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ApmFields, Instance } from '@kbn/apm-synthtrace-client'; +import { service } from '@kbn/apm-synthtrace-client/src/lib/apm/service'; +import { random, times } from 'lodash'; +import { Scenario } from '../cli/scenario'; +import { RunOptions } from '../cli/utils/parse_run_cli_flags'; +import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; +import { withClient } from '../lib/utils/with_client'; + +const ENVIRONMENT = getSynthtraceEnvironment(__filename); +const NUMBER_OF_DEPENDENCIES_PER_SERVICE = 2000; +const NUMBER_OF_SERVICES = 1; + +const scenario: Scenario = async (runOptions: RunOptions) => { + return { + generate: ({ range, clients: { apmEsClient } }) => { + const instances = times(NUMBER_OF_SERVICES).map((index) => + service({ + name: `synthtrace-high-cardinality-${index}`, + environment: ENVIRONMENT, + agentName: 'java', + }).instance(`java-instance-${index}`) + ); + + const instanceDependencies = (instance: Instance, id: string) => { + const throughput = random(1, 60); + const childLatency = random(10, 100_000); + const parentLatency = childLatency + random(10, 10_000); + + const failureRate = random(0, 100); + + return range.ratePerMinute(throughput).generator((timestamp) => { + const child = instance + .span({ + spanName: 'GET apm-*/_search', + spanType: 'db', + spanSubtype: 'elasticsearch', + }) + .destination(`elasticsearch/${id}`) + .timestamp(timestamp) + .duration(childLatency); + + const span = instance + .transaction({ transactionName: 'GET /java' }) + .timestamp(timestamp) + .duration(parentLatency) + .success() + .children(Math.random() * 100 > failureRate ? child.success() : child.failure()); + + return span; + }); + }; + + return withClient( + apmEsClient, + instances.flatMap((instance, i) => + times(NUMBER_OF_DEPENDENCIES_PER_SERVICE) + .map((j) => instanceDependencies(instance, `${i + 1}.${j + 1}`)) + .flat() + ) + ); + }, + }; +}; + +export default scenario; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/many_errors.ts b/packages/kbn-apm-synthtrace/src/scenarios/many_errors.ts index 7948688610f56..6f9849615b78e 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/many_errors.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/many_errors.ts @@ -9,13 +9,13 @@ import { ApmFields, apm } from '@kbn/apm-synthtrace-client'; import { Scenario } from '../cli/scenario'; import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; import { withClient } from '../lib/utils/with_client'; +import { getExceptionTypeForIndex } from './helpers/exception_types'; import { getRandomNameForIndex } from './helpers/random_names'; const ENVIRONMENT = getSynthtraceEnvironment(__filename); const scenario: Scenario = async (runOptions) => { const { logger } = runOptions; - const severities = ['critical', 'error', 'warning', 'info', 'debug', 'trace']; return { @@ -23,7 +23,11 @@ const scenario: Scenario = async (runOptions) => { const transactionName = 'DELETE /api/orders/{id}'; const instance = apm - .service({ name: `synth-node`, environment: ENVIRONMENT, agentName: 'nodejs' }) + .service({ + name: `synthtrace-high-cardinality-0`, + environment: ENVIRONMENT, + agentName: 'java', + }) .instance('instance'); const failedTraceEvents = range @@ -38,7 +42,13 @@ const scenario: Scenario = async (runOptions) => { .duration(1000) .failure() .errors( - instance.error({ message: errorMessage, type: 'My Type' }).timestamp(timestamp + 50) + instance + .error({ + message: errorMessage, + type: getExceptionTypeForIndex(index), + culprit: 'request (node_modules/@elastic/transport/src/Transport.ts)', + }) + .timestamp(timestamp + 50) ); }); diff --git a/packages/kbn-apm-synthtrace/src/scenarios/many_instances.ts b/packages/kbn-apm-synthtrace/src/scenarios/many_instances.ts index 4774839c71727..8c57a37177f85 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/many_instances.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/many_instances.ts @@ -18,8 +18,7 @@ const ENVIRONMENT = getSynthtraceEnvironment(__filename); const scenario: Scenario = async ({ logger, scenarioOpts = { instances: 2000 } }) => { const numInstances = scenarioOpts.instances; const agentVersions = ['2.1.0', '2.0.0', '1.15.0', '1.14.0', '1.13.1']; - const language = 'go'; - const serviceName = 'synth-many-instances'; + const language = 'java'; const transactionName = 'GET /order/{id}'; return { @@ -29,7 +28,7 @@ const scenario: Scenario = async ({ logger, scenarioOpts = { instance const randomName = getRandomNameForIndex(index); return apm .service({ - name: serviceName, + name: 'synthtrace-high-cardinality-0', environment: ENVIRONMENT, agentName: language, }) @@ -51,13 +50,15 @@ const scenario: Scenario = async ({ logger, scenarioOpts = { instance return !generateError ? span.success() - : span - .failure() - .errors( - instance - .error({ message: `No handler for ${transactionName}` }) - .timestamp(timestamp + 50) - ); + : span.failure().errors( + instance + .error({ + message: `No handler for ${transactionName}`, + type: 'No handler', + culprit: 'request', + }) + .timestamp(timestamp + 50) + ); }); const cpuPct = random(0, 1); diff --git a/packages/kbn-apm-synthtrace/src/scenarios/many_services.ts b/packages/kbn-apm-synthtrace/src/scenarios/many_services.ts index 1af9f2f9e3b5a..19da565ab8860 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/many_services.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/many_services.ts @@ -62,13 +62,15 @@ const scenario: Scenario = async ({ logger, scenarioOpts = { services return !generateError ? span.success() - : span - .failure() - .errors( - instance - .error({ message: `No handler for ${transactionName}` }) - .timestamp(timestamp + 50) - ); + : span.failure().errors( + instance + .error({ + message: `No handler for ${transactionName}`, + type: 'No handler', + culprit: 'request', + }) + .timestamp(timestamp + 50) + ); }); }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/many_transactions.ts b/packages/kbn-apm-synthtrace/src/scenarios/many_transactions.ts index 895d413235512..ce9af03c8e492 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/many_transactions.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/many_transactions.ts @@ -37,7 +37,11 @@ const scenario: Scenario = async (runOptions) => { generate: ({ range, clients: { apmEsClient } }) => { const instances = times(numServices).map((index) => apm - .service({ name: `synth-go-${index}`, environment: ENVIRONMENT, agentName: 'go' }) + .service({ + name: `synthtrace-high-cardinality-${index}`, + environment: ENVIRONMENT, + agentName: 'java', + }) .instance(`instance-${index}`) ); @@ -60,7 +64,11 @@ const scenario: Scenario = async (runOptions) => { .failure() .errors( instance - .error({ message: '[ResponseError] index_not_found_exception' }) + .error({ + message: '[ResponseError] index_not_found_exception', + type: 'ResponseError', + culprit: 'elasticsearch', + }) .timestamp(timestamp + 50) ) ); diff --git a/packages/kbn-apm-synthtrace/src/scenarios/service_many_dependencies.ts b/packages/kbn-apm-synthtrace/src/scenarios/service_many_dependencies.ts deleted file mode 100644 index a548e55f575a4..0000000000000 --- a/packages/kbn-apm-synthtrace/src/scenarios/service_many_dependencies.ts +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { ApmFields, Instance } from '@kbn/apm-synthtrace-client'; -import { service } from '@kbn/apm-synthtrace-client/src/lib/apm/service'; -import { Scenario } from '../cli/scenario'; -import { RunOptions } from '../cli/utils/parse_run_cli_flags'; -import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; -import { withClient } from '../lib/utils/with_client'; - -const ENVIRONMENT = getSynthtraceEnvironment(__filename); -const MAX_DEPENDENCIES = 10000; -const MAX_DEPENDENCIES_PER_SERVICE = 500; -const MAX_SERVICES = 20; - -const scenario: Scenario = async (runOptions: RunOptions) => { - return { - generate: ({ range, clients: { apmEsClient } }) => { - const javaInstances = Array.from({ length: MAX_SERVICES }).map((_, index) => - service(`opbeans-java-${index}`, ENVIRONMENT, 'java').instance(`java-instance-${index}`) - ); - - const instanceDependencies = (instance: Instance, startIndex: number) => { - const rate = range.ratePerMinute(60); - - return rate.generator((timestamp, index) => { - const currentIndex = index % MAX_DEPENDENCIES_PER_SERVICE; - const destination = (startIndex + currentIndex) % MAX_DEPENDENCIES; - - const span = instance - .transaction({ transactionName: 'GET /java' }) - .timestamp(timestamp) - .duration(400) - .success() - .children( - instance - .span({ - spanName: 'GET apm-*/_search', - spanType: 'db', - spanSubtype: 'elasticsearch', - }) - .destination(`elasticsearch/${destination}`) - .timestamp(timestamp) - .duration(200) - .success() - ); - - return span; - }); - }; - - return withClient( - apmEsClient, - javaInstances.map((instance, index) => - instanceDependencies(instance, (index * MAX_DEPENDENCIES_PER_SERVICE) % MAX_DEPENDENCIES) - ) - ); - }, - }; -}; - -export default scenario; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/simple_trace.ts b/packages/kbn-apm-synthtrace/src/scenarios/simple_trace.ts index c93e37b4f99b3..1d5ee6f53d63c 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/simple_trace.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/simple_trace.ts @@ -62,7 +62,10 @@ const scenario: Scenario = async (runOptions) => { .failure() .errors( instance - .error({ message: '[ResponseError] index_not_found_exception' }) + .error({ + message: '[ResponseError] index_not_found_exception', + type: 'ResponseError', + }) .timestamp(timestamp + 50) ) ); diff --git a/packages/kbn-es-archiver/src/es_archiver.ts b/packages/kbn-es-archiver/src/es_archiver.ts index 77d249cf845d1..0b94932c18dc6 100644 --- a/packages/kbn-es-archiver/src/es_archiver.ts +++ b/packages/kbn-es-archiver/src/es_archiver.ts @@ -155,8 +155,8 @@ export class EsArchiver { * * @param name */ - async loadIfNeeded(name: string) { - return await this.load(name, { skipExisting: true }); + async loadIfNeeded(name: string, performance?: LoadActionPerfOptions) { + return await this.load(name, { skipExisting: true, performance }); } /** diff --git a/packages/kbn-ftr-common-functional-ui-services/services/remote/webdriver.ts b/packages/kbn-ftr-common-functional-ui-services/services/remote/webdriver.ts index 49a43817efc62..8d9196fa8124e 100644 --- a/packages/kbn-ftr-common-functional-ui-services/services/remote/webdriver.ts +++ b/packages/kbn-ftr-common-functional-ui-services/services/remote/webdriver.ts @@ -231,8 +231,8 @@ async function attemptToCreateCommand( firefoxOptions.setAcceptInsecureCerts(config.acceptInsecureCerts); if (headlessBrowser === '1') { - // See: https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Headless_mode - firefoxOptions.headless(); + // See: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions + firefoxOptions.addArguments('-headless'); } // Windows issue with stout socket https://github.com/elastic/kibana/issues/52053 diff --git a/packages/kbn-generate-csv/index.ts b/packages/kbn-generate-csv/index.ts index ed3e40405d51a..0bc07985bd64b 100644 --- a/packages/kbn-generate-csv/index.ts +++ b/packages/kbn-generate-csv/index.ts @@ -8,4 +8,3 @@ export { CsvGenerator } from './src/generate_csv'; export { CsvESQLGenerator, type JobParamsCsvESQL } from './src/generate_csv_esql'; -export type { CsvPagingStrategy } from './types'; diff --git a/packages/kbn-management/settings/application/__stories__/application.stories.tsx b/packages/kbn-management/settings/application/__stories__/application.stories.tsx index ced0c0dbcdef8..bc4048ce590f8 100644 --- a/packages/kbn-management/settings/application/__stories__/application.stories.tsx +++ b/packages/kbn-management/settings/application/__stories__/application.stories.tsx @@ -16,6 +16,7 @@ import { getSettingsMock, } from '@kbn/management-settings-utilities/mocks/settings.mock'; import { UiSettingsScope } from '@kbn/core-ui-settings-common'; +import { getSettingsCapabilitiesMock } from '@kbn/management-settings-utilities/mocks/capabilities.mock'; import { SettingsApplication as Component } from '../application'; import { SettingsApplicationProvider } from '../services'; @@ -43,6 +44,11 @@ const getSettingsApplicationStory = ({ hasGlobalSettings }: StoryProps) => ( getAllowlistedSettings={(scope: UiSettingsScope) => scope === 'namespace' ? getSettingsMock() : hasGlobalSettings ? getGlobalSettingsMock() : {} } + getSections={() => []} + // @ts-ignore + getToastsService={() => null} + getCapabilities={getSettingsCapabilitiesMock} + setBadge={() => {}} isCustomSetting={() => false} isOverriddenSetting={() => false} saveChanges={action('saveChanges')} diff --git a/packages/kbn-management/settings/application/application.tsx b/packages/kbn-management/settings/application/application.tsx index e877bae184ec1..90d28f8e5af1b 100644 --- a/packages/kbn-management/settings/application/application.tsx +++ b/packages/kbn-management/settings/application/application.tsx @@ -22,6 +22,7 @@ import { SettingsTabs } from '@kbn/management-settings-types/tab'; import { EmptyState } from './empty_state'; import { i18nTexts } from './i18n_texts'; import { Tab } from './tab'; +import { readOnlyBadge } from './read_only_badge'; import { useScopeFields } from './hooks/use_scope_fields'; import { QueryInput, QueryInputProps } from './query_input'; import { useServices } from './services'; @@ -53,7 +54,8 @@ function getQueryParam(url: string) { * Component for displaying the {@link SettingsApplication} component. */ export const SettingsApplication = () => { - const { addUrlToHistory } = useServices(); + const { addUrlToHistory, getSections, getToastsService, getCapabilities, setBadge } = + useServices(); const queryParam = getQueryParam(window.location.href); const [query, setQuery] = useState(Query.parse(queryParam)); @@ -68,7 +70,17 @@ export const SettingsApplication = () => { const [spaceAllFields, globalAllFields] = useScopeFields(); const [spaceFilteredFields, globalFilteredFields] = useScopeFields(query); - const globalSettingsEnabled = globalAllFields.length > 0; + const { + spaceSettings: { save: canSaveSpaceSettings }, + globalSettings: { save: canSaveGlobalSettings, show: canShowGlobalSettings }, + } = getCapabilities(); + if (!canSaveSpaceSettings || (!canSaveGlobalSettings && canShowGlobalSettings)) { + setBadge(readOnlyBadge); + } + + // Only enabled the Global settings tab if there are any global settings + // and if global settings can be shown + const globalTabEnabled = globalAllFields.length > 0 && canShowGlobalSettings; const tabs: SettingsTabs = { [SPACE_SETTINGS_TAB_ID]: { @@ -77,16 +89,19 @@ export const SettingsApplication = () => { categoryCounts: getCategoryCounts(spaceAllFields), callOutTitle: i18nTexts.spaceCalloutTitle, callOutText: i18nTexts.spaceCalloutText, + sections: getSections('namespace'), + isSavingEnabled: canSaveSpaceSettings, }, }; - // Only add a Global settings tab if there are any global settings - if (globalSettingsEnabled) { + if (globalTabEnabled) { tabs[GLOBAL_SETTINGS_TAB_ID] = { name: i18nTexts.globalTabTitle, fields: globalFilteredFields, categoryCounts: getCategoryCounts(globalAllFields), callOutTitle: i18nTexts.globalCalloutTitle, callOutText: i18nTexts.globalCalloutText, + sections: getSections('global'), + isSavingEnabled: canSaveGlobalSettings, }; } @@ -110,7 +125,7 @@ export const SettingsApplication = () => { - {globalSettingsEnabled && ( + {globalTabEnabled && ( <> {Object.keys(tabs).map((id) => ( @@ -130,13 +145,31 @@ export const SettingsApplication = () => { )} {selectedTab.fields.length ? ( -
onQueryChange()} - scope={selectedTabId === SPACE_SETTINGS_TAB_ID ? 'namespace' : 'global'} - /> + <> + onQueryChange()} + scope={selectedTabId === SPACE_SETTINGS_TAB_ID ? 'namespace' : 'global'} + /> + + {selectedTab.sections.length > 0 && + selectedTab.sections.map(({ Component, queryMatch }, index) => { + if (queryMatch(query.text)) { + return ( + + ); + } + })} + ) : ( onQueryChange() }} /> )} diff --git a/packages/kbn-management/settings/application/index.tsx b/packages/kbn-management/settings/application/index.tsx index cfdef8f174723..b7a6df38d4db1 100644 --- a/packages/kbn-management/settings/application/index.tsx +++ b/packages/kbn-management/settings/application/index.tsx @@ -28,9 +28,22 @@ export const KibanaSettingsApplication = ({ settings, theme, history, + sectionRegistry, + application, + chrome, }: SettingsApplicationKibanaDependencies) => ( diff --git a/packages/kbn-management/settings/application/mocks/context.tsx b/packages/kbn-management/settings/application/mocks/context.tsx index 85f5d1ba1ada4..5ad4a7edfb2a6 100644 --- a/packages/kbn-management/settings/application/mocks/context.tsx +++ b/packages/kbn-management/settings/application/mocks/context.tsx @@ -21,6 +21,7 @@ import { getSettingsMock, } from '@kbn/management-settings-utilities/mocks/settings.mock'; import { UiSettingsScope } from '@kbn/core-ui-settings-common'; +import { getSettingsCapabilitiesMock } from '@kbn/management-settings-utilities/mocks/capabilities.mock'; import { SettingsApplicationProvider, SettingsApplicationServices } from '../services'; const createRootMock = () => { @@ -42,10 +43,14 @@ export const createSettingsApplicationServicesMock = ( ...createFormServicesMock(), getAllowlistedSettings: (scope: UiSettingsScope) => scope === 'namespace' ? getSettingsMock() : hasGlobalSettings ? getGlobalSettingsMock() : {}, + getSections: () => [], + getCapabilities: getSettingsCapabilitiesMock, + setBadge: jest.fn(), isCustomSetting: () => false, isOverriddenSetting: () => false, subscribeToUpdates: () => new Subscription(), addUrlToHistory: jest.fn(), + getToastsService: jest.fn(), }); export const TestWrapper = ({ diff --git a/src/plugins/advanced_settings/public/management_app/components/call_outs/call_outs.test.tsx b/packages/kbn-management/settings/application/read_only_badge.ts similarity index 51% rename from src/plugins/advanced_settings/public/management_app/components/call_outs/call_outs.test.tsx rename to packages/kbn-management/settings/application/read_only_badge.ts index 8cdf8bc5c6b54..f285ff7e7349b 100644 --- a/src/plugins/advanced_settings/public/management_app/components/call_outs/call_outs.test.tsx +++ b/packages/kbn-management/settings/application/read_only_badge.ts @@ -6,15 +6,14 @@ * Side Public License, v 1. */ -import React from 'react'; -import { shallow } from 'enzyme'; +import { i18n } from '@kbn/i18n'; -import { CallOuts } from './call_outs'; - -describe('CallOuts', () => { - it('should render normally', async () => { - const component = shallow(); - - expect(component).toMatchSnapshot(); - }); -}); +export const readOnlyBadge = { + text: i18n.translate('management.settings.badge.readOnly.text', { + defaultMessage: 'Read only', + }), + tooltip: i18n.translate('management.settings.badge.readOnly.tooltip', { + defaultMessage: 'Unable to save advanced settings', + }), + iconType: 'glasses', +}; diff --git a/packages/kbn-management/settings/application/services.tsx b/packages/kbn-management/settings/application/services.tsx index c963e6bcbe8ac..11454fbab932a 100644 --- a/packages/kbn-management/settings/application/services.tsx +++ b/packages/kbn-management/settings/application/services.tsx @@ -14,15 +14,22 @@ import { type FormKibanaDependencies, type FormServices, } from '@kbn/management-settings-components-form'; -import { UiSettingMetadata } from '@kbn/management-settings-types'; +import { SettingsCapabilities, UiSettingMetadata } from '@kbn/management-settings-types'; import { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; import { normalizeSettings } from '@kbn/management-settings-utilities'; import { Subscription } from 'rxjs'; -import { ScopedHistory } from '@kbn/core-application-browser'; +import { ApplicationStart, ScopedHistory } from '@kbn/core-application-browser'; import { UiSettingsScope } from '@kbn/core-ui-settings-common'; +import { RegistryEntry, SectionRegistryStart } from '@kbn/management-settings-section-registry'; +import { ToastsStart } from '@kbn/core-notifications-browser'; +import { ChromeBadge, ChromeStart } from '@kbn/core-chrome-browser'; export interface Services { getAllowlistedSettings: (scope: UiSettingsScope) => Record; + getSections: (scope: UiSettingsScope) => RegistryEntry[]; + getToastsService: () => ToastsStart; + getCapabilities: () => SettingsCapabilities; + setBadge: (badge: ChromeBadge) => void; subscribeToUpdates: (fn: () => void, scope: UiSettingsScope) => Subscription; isCustomSetting: (key: string, scope: UiSettingsScope) => boolean; isOverriddenSetting: (key: string, scope: UiSettingsScope) => boolean; @@ -43,6 +50,12 @@ export interface KibanaDependencies { >; }; history: ScopedHistory; + sectionRegistry: SectionRegistryStart; + notifications: { + toasts: ToastsStart; + }; + application: Pick; + chrome: Pick; } export type SettingsApplicationKibanaDependencies = KibanaDependencies & FormKibanaDependencies; @@ -65,6 +78,10 @@ export const SettingsApplicationProvider: FC = ({ links, showDanger, getAllowlistedSettings, + getSections, + getCapabilities, + setBadge, + getToastsService, subscribeToUpdates, isCustomSetting, isOverriddenSetting, @@ -75,6 +92,10 @@ export const SettingsApplicationProvider: FC = ({ { - const { docLinks, notifications, theme, i18n, settings, history } = dependencies; + const { + docLinks, + notifications, + theme, + i18n, + settings, + history, + sectionRegistry, + application, + chrome, + } = dependencies; const { client, globalClient } = settings; const getScopeClient = (scope: UiSettingsScope) => { @@ -114,6 +145,26 @@ export const SettingsApplicationKibanaProvider: FC { + return scope === 'namespace' + ? sectionRegistry.getSpacesSections() + : sectionRegistry.getGlobalSections(); + }; + + const getCapabilities = () => { + const { advancedSettings, globalSettings } = application.capabilities; + return { + spaceSettings: { + show: advancedSettings.show as boolean, + save: advancedSettings.save as boolean, + }, + globalSettings: { + show: globalSettings.show as boolean, + save: globalSettings.save as boolean, + }, + }; + }; + const isCustomSetting = (key: string, scope: UiSettingsScope) => { const scopeClient = getScopeClient(scope); return scopeClient.isCustom(key); @@ -131,6 +182,10 @@ export const SettingsApplicationKibanaProvider: FC notifications.toasts, + getCapabilities, + setBadge: (badge: ChromeBadge) => chrome.setBadge(badge), isCustomSetting, isOverriddenSetting, subscribeToUpdates, diff --git a/packages/kbn-management/settings/application/tsconfig.json b/packages/kbn-management/settings/application/tsconfig.json index cc1e11c585774..182131a7e8714 100644 --- a/packages/kbn-management/settings/application/tsconfig.json +++ b/packages/kbn-management/settings/application/tsconfig.json @@ -32,5 +32,8 @@ "@kbn/core-i18n-browser", "@kbn/core-analytics-browser-mocks", "@kbn/core-ui-settings-common", + "@kbn/management-settings-section-registry", + "@kbn/core-notifications-browser", + "@kbn/core-chrome-browser", ] } diff --git a/packages/kbn-management/settings/components/field_input/input/code_editor_input.tsx b/packages/kbn-management/settings/components/field_input/input/code_editor_input.tsx index cbf53979efa83..101ac8897bb28 100644 --- a/packages/kbn-management/settings/components/field_input/input/code_editor_input.tsx +++ b/packages/kbn-management/settings/components/field_input/input/code_editor_input.tsx @@ -8,6 +8,7 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import { i18n } from '@kbn/i18n'; import { SettingType } from '@kbn/management-settings-types'; import { getFieldInputValue, useUpdate } from '@kbn/management-settings-utilities'; @@ -55,6 +56,24 @@ export const CodeEditorInput = ({ async (newValue: string, onUpdateFn) => { const isJsonArray = Array.isArray(JSON.parse(defaultValue || '{}')); const parsedValue = newValue || (isJsonArray ? '[]' : '{}'); + + // Validate JSON syntax + if (field.type === 'json') { + try { + JSON.parse(parsedValue); + } catch (e) { + onUpdateFn({ + type: field.type, + unsavedValue: newValue, + isInvalid: true, + error: i18n.translate('management.settings.field.codeEditorSyntaxErrorMessage', { + defaultMessage: 'Invalid JSON syntax', + }), + }); + return; + } + } + const validationResponse = await validateChange(field.id, parsedValue); if (validationResponse.successfulValidation && !validationResponse.valid) { onUpdateFn({ diff --git a/packages/kbn-management/settings/components/field_input/input/json_editor_input.test.tsx b/packages/kbn-management/settings/components/field_input/input/json_editor_input.test.tsx index ecc132dad8c89..eab463be60109 100644 --- a/packages/kbn-management/settings/components/field_input/input/json_editor_input.test.tsx +++ b/packages/kbn-management/settings/components/field_input/input/json_editor_input.test.tsx @@ -89,6 +89,21 @@ describe('JsonEditorInput', () => { ); }); + it('calls the onInputChange prop with an error when the object value changes to invalid JSON', async () => { + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + fireEvent.change(input, { target: { value: '{"bar" "foo"}' } }); + + await waitFor(() => + expect(defaultProps.onInputChange).toHaveBeenCalledWith({ + type: 'json', + unsavedValue: '{"bar" "foo"}', + error: 'Invalid JSON syntax', + isInvalid: true, + }) + ); + }); + it('calls the onInputChange prop when the array value changes', async () => { const props = { ...defaultProps, defaultValue: '["bar", "foo"]', value: undefined }; const { getByTestId } = render(wrap()); @@ -117,4 +132,20 @@ describe('JsonEditorInput', () => { expect(defaultProps.onInputChange).toHaveBeenCalledWith({ type: 'json', unsavedValue: '' }) ); }); + + it('calls the onInputChange prop with an array when the array value changes to invalid JSON', async () => { + const props = { ...defaultProps, defaultValue: '["bar", "foo"]', value: undefined }; + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + fireEvent.change(input, { target: { value: '["bar", "foo" | "baz"]' } }); + + await waitFor(() => + expect(defaultProps.onInputChange).toHaveBeenCalledWith({ + type: 'json', + unsavedValue: '["bar", "foo" | "baz"]', + error: 'Invalid JSON syntax', + isInvalid: true, + }) + ); + }); }); diff --git a/src/plugins/advanced_settings/public/management_app/components/field/index.ts b/packages/kbn-management/settings/types/capabilities.ts similarity index 66% rename from src/plugins/advanced_settings/public/management_app/components/field/index.ts rename to packages/kbn-management/settings/types/capabilities.ts index 6616264cc058b..dcd1b5cebb32c 100644 --- a/src/plugins/advanced_settings/public/management_app/components/field/index.ts +++ b/packages/kbn-management/settings/types/capabilities.ts @@ -6,7 +6,12 @@ * Side Public License, v 1. */ -export { Field, getEditableValue } from './field'; +export interface SettingsCapabilities { + spaceSettings: SettingCapability; + globalSettings: SettingCapability; +} -// eslint-disable-next-line import/no-default-export -export { Field as default } from './field'; +interface SettingCapability { + show: boolean; + save: boolean; +} diff --git a/packages/kbn-management/settings/types/index.ts b/packages/kbn-management/settings/types/index.ts index 9a8a27e4ae244..59e034a22057f 100644 --- a/packages/kbn-management/settings/types/index.ts +++ b/packages/kbn-management/settings/types/index.ts @@ -66,6 +66,8 @@ export type { } from './setting_type'; export type { CategorizedFields, CategoryCounts } from './category'; +export type { SettingsTabs } from './tab'; +export type { SettingsCapabilities } from './capabilities'; /** * A React `ref` that indicates an input can be reset using an diff --git a/packages/kbn-management/settings/types/tab.ts b/packages/kbn-management/settings/types/tab.ts index cf87c9f066fd0..8cbf1a51619bc 100644 --- a/packages/kbn-management/settings/types/tab.ts +++ b/packages/kbn-management/settings/types/tab.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { RegistryEntry } from '@kbn/management-settings-section-registry'; import { CategoryCounts } from './category'; import { FieldDefinition } from '.'; @@ -16,5 +17,7 @@ export interface SettingsTabs { categoryCounts: CategoryCounts; callOutTitle: string; callOutText: string; + sections: RegistryEntry[]; + isSavingEnabled: boolean; }; } diff --git a/packages/kbn-management/settings/types/tsconfig.json b/packages/kbn-management/settings/types/tsconfig.json index 345fbe3125a79..2753fb935acaa 100644 --- a/packages/kbn-management/settings/types/tsconfig.json +++ b/packages/kbn-management/settings/types/tsconfig.json @@ -14,5 +14,6 @@ "@kbn/analytics", "@kbn/core", "@kbn/core-ui-settings-common", + "@kbn/management-settings-section-registry", ] } diff --git a/src/plugins/advanced_settings/public/management_app/lib/is_default_value.ts b/packages/kbn-management/settings/utilities/mocks/capabilities.mock.ts similarity index 57% rename from src/plugins/advanced_settings/public/management_app/lib/is_default_value.ts rename to packages/kbn-management/settings/utilities/mocks/capabilities.mock.ts index f00b137e44ca5..5b0049577ae43 100644 --- a/src/plugins/advanced_settings/public/management_app/lib/is_default_value.ts +++ b/packages/kbn-management/settings/utilities/mocks/capabilities.mock.ts @@ -6,12 +6,15 @@ * Side Public License, v 1. */ -import { FieldSetting } from '../types'; +import { SettingsCapabilities } from '@kbn/management-settings-types'; -export function isDefaultValue(setting: FieldSetting) { - return ( - setting.isCustom || - setting.value === undefined || - String(setting.value) === String(setting.defVal) - ); -} +export const getSettingsCapabilitiesMock = (): SettingsCapabilities => ({ + spaceSettings: { + show: true, + save: true, + }, + globalSettings: { + show: true, + save: true, + }, +}); diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 b/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 index bde15b20e0618..4000c050cb20b 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 +++ b/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 @@ -138,6 +138,7 @@ RP : ')'; TRUE : T R U E; EQ : '=='; +CIEQ : '=~'; NEQ : '!='; LT : '<'; LTE : '<='; diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp b/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp index c484e0b7424a7..51248244df48b 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp +++ b/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp @@ -52,6 +52,7 @@ null ')' null '==' +'=~' '!=' '<' '<=' @@ -159,6 +160,7 @@ RLIKE RP TRUE EQ +CIEQ NEQ LT LTE @@ -277,6 +279,7 @@ RLIKE RP TRUE EQ +CIEQ NEQ LT LTE @@ -411,4 +414,4 @@ SHOW_MODE SETTING_MODE atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 106, 1262, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 6, 20, 526, 10, 20, 13, 20, 14, 20, 527, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 536, 10, 21, 12, 21, 14, 21, 539, 11, 21, 3, 21, 5, 21, 542, 10, 21, 3, 21, 5, 21, 545, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 554, 10, 22, 12, 22, 14, 22, 557, 11, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 6, 23, 565, 10, 23, 13, 23, 14, 23, 566, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 5, 34, 608, 10, 34, 3, 34, 6, 34, 611, 10, 34, 13, 34, 14, 34, 612, 3, 35, 3, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 5, 37, 622, 10, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 5, 39, 629, 10, 39, 3, 40, 3, 40, 3, 40, 7, 40, 634, 10, 40, 12, 40, 14, 40, 637, 11, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 645, 10, 40, 12, 40, 14, 40, 648, 11, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 655, 10, 40, 3, 40, 5, 40, 658, 10, 40, 5, 40, 660, 10, 40, 3, 41, 6, 41, 663, 10, 41, 13, 41, 14, 41, 664, 3, 42, 6, 42, 668, 10, 42, 13, 42, 14, 42, 669, 3, 42, 3, 42, 7, 42, 674, 10, 42, 12, 42, 14, 42, 677, 11, 42, 3, 42, 3, 42, 6, 42, 681, 10, 42, 13, 42, 14, 42, 682, 3, 42, 6, 42, 686, 10, 42, 13, 42, 14, 42, 687, 3, 42, 3, 42, 7, 42, 692, 10, 42, 12, 42, 14, 42, 695, 11, 42, 5, 42, 697, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 6, 42, 703, 10, 42, 13, 42, 14, 42, 704, 3, 42, 3, 42, 5, 42, 709, 10, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 72, 3, 72, 3, 73, 3, 73, 3, 74, 3, 74, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 7, 78, 834, 10, 78, 12, 78, 14, 78, 837, 11, 78, 3, 78, 3, 78, 5, 78, 841, 10, 78, 3, 78, 6, 78, 844, 10, 78, 13, 78, 14, 78, 845, 5, 78, 848, 10, 78, 3, 79, 3, 79, 6, 79, 852, 10, 79, 13, 79, 14, 79, 853, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 5, 89, 903, 10, 89, 3, 90, 6, 90, 906, 10, 90, 13, 90, 14, 90, 907, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 98, 5, 98, 943, 10, 98, 3, 99, 3, 99, 5, 99, 947, 10, 99, 3, 99, 7, 99, 950, 10, 99, 12, 99, 14, 99, 953, 11, 99, 3, 99, 3, 99, 5, 99, 957, 10, 99, 3, 99, 6, 99, 960, 10, 99, 13, 99, 14, 99, 961, 5, 99, 964, 10, 99, 3, 100, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 120, 3, 120, 5, 120, 1052, 10, 120, 3, 120, 7, 120, 1055, 10, 120, 12, 120, 14, 120, 1058, 11, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 146, 3, 146, 3, 146, 3, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 150, 3, 150, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 6, 151, 1195, 10, 151, 13, 151, 14, 151, 1196, 3, 152, 3, 152, 3, 152, 3, 152, 3, 153, 3, 153, 3, 153, 3, 153, 3, 154, 3, 154, 3, 154, 3, 154, 3, 155, 3, 155, 3, 156, 3, 156, 3, 157, 3, 157, 3, 158, 3, 158, 3, 159, 3, 159, 3, 160, 3, 160, 3, 161, 3, 161, 3, 162, 3, 162, 3, 163, 3, 163, 3, 164, 3, 164, 3, 165, 3, 165, 3, 166, 3, 166, 3, 167, 3, 167, 3, 168, 3, 168, 3, 169, 3, 169, 3, 170, 3, 170, 3, 171, 3, 171, 3, 172, 3, 172, 3, 173, 3, 173, 3, 174, 3, 174, 3, 175, 3, 175, 3, 176, 3, 176, 3, 177, 3, 177, 3, 178, 3, 178, 3, 179, 3, 179, 3, 180, 3, 180, 4, 555, 646, 2, 2, 181, 13, 2, 3, 15, 2, 4, 17, 2, 5, 19, 2, 6, 21, 2, 7, 23, 2, 8, 25, 2, 9, 27, 2, 10, 29, 2, 11, 31, 2, 12, 33, 2, 13, 35, 2, 14, 37, 2, 15, 39, 2, 16, 41, 2, 17, 43, 2, 18, 45, 2, 19, 47, 2, 20, 49, 2, 21, 51, 2, 22, 53, 2, 23, 55, 2, 24, 57, 2, 2, 59, 2, 2, 61, 2, 25, 63, 2, 26, 65, 2, 27, 67, 2, 28, 69, 2, 2, 71, 2, 2, 73, 2, 2, 75, 2, 2, 77, 2, 2, 79, 2, 2, 81, 2, 2, 83, 2, 2, 85, 2, 2, 87, 2, 2, 89, 2, 29, 91, 2, 30, 93, 2, 31, 95, 2, 32, 97, 2, 33, 99, 2, 34, 101, 2, 35, 103, 2, 36, 105, 2, 37, 107, 2, 38, 109, 2, 39, 111, 2, 40, 113, 2, 41, 115, 2, 42, 117, 2, 43, 119, 2, 44, 121, 2, 45, 123, 2, 46, 125, 2, 47, 127, 2, 48, 129, 2, 49, 131, 2, 50, 133, 2, 51, 135, 2, 52, 137, 2, 53, 139, 2, 54, 141, 2, 55, 143, 2, 56, 145, 2, 57, 147, 2, 58, 149, 2, 59, 151, 2, 60, 153, 2, 61, 155, 2, 62, 157, 2, 63, 159, 2, 64, 161, 2, 65, 163, 2, 66, 165, 2, 67, 167, 2, 68, 169, 2, 69, 171, 2, 70, 173, 2, 71, 175, 2, 2, 177, 2, 2, 179, 2, 2, 181, 2, 2, 183, 2, 2, 185, 2, 72, 187, 2, 2, 189, 2, 73, 191, 2, 2, 193, 2, 74, 195, 2, 75, 197, 2, 76, 199, 2, 2, 201, 2, 2, 203, 2, 2, 205, 2, 2, 207, 2, 77, 209, 2, 2, 211, 2, 2, 213, 2, 78, 215, 2, 79, 217, 2, 80, 219, 2, 2, 221, 2, 2, 223, 2, 2, 225, 2, 2, 227, 2, 81, 229, 2, 2, 231, 2, 2, 233, 2, 82, 235, 2, 83, 237, 2, 84, 239, 2, 2, 241, 2, 2, 243, 2, 85, 245, 2, 86, 247, 2, 2, 249, 2, 87, 251, 2, 2, 253, 2, 2, 255, 2, 88, 257, 2, 89, 259, 2, 90, 261, 2, 2, 263, 2, 2, 265, 2, 2, 267, 2, 2, 269, 2, 2, 271, 2, 2, 273, 2, 2, 275, 2, 91, 277, 2, 92, 279, 2, 93, 281, 2, 2, 283, 2, 2, 285, 2, 2, 287, 2, 2, 289, 2, 94, 291, 2, 95, 293, 2, 96, 295, 2, 2, 297, 2, 97, 299, 2, 98, 301, 2, 99, 303, 2, 100, 305, 2, 101, 307, 2, 2, 309, 2, 102, 311, 2, 103, 313, 2, 104, 315, 2, 105, 317, 2, 106, 319, 2, 2, 321, 2, 2, 323, 2, 2, 325, 2, 2, 327, 2, 2, 329, 2, 2, 331, 2, 2, 333, 2, 2, 335, 2, 2, 337, 2, 2, 339, 2, 2, 341, 2, 2, 343, 2, 2, 345, 2, 2, 347, 2, 2, 349, 2, 2, 351, 2, 2, 353, 2, 2, 355, 2, 2, 357, 2, 2, 359, 2, 2, 361, 2, 2, 363, 2, 2, 365, 2, 2, 367, 2, 2, 369, 2, 2, 13, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 40, 8, 2, 11, 12, 15, 15, 34, 34, 49, 49, 93, 93, 95, 95, 4, 2, 12, 12, 15, 15, 5, 2, 11, 12, 15, 15, 34, 34, 3, 2, 50, 59, 4, 2, 67, 92, 99, 124, 7, 2, 36, 36, 94, 94, 112, 112, 116, 116, 118, 118, 6, 2, 12, 12, 15, 15, 36, 36, 94, 94, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 3, 2, 98, 98, 12, 2, 11, 12, 15, 15, 34, 34, 46, 46, 49, 49, 63, 63, 93, 93, 95, 95, 98, 98, 126, 126, 4, 2, 44, 44, 49, 49, 13, 2, 11, 12, 15, 15, 34, 34, 36, 37, 46, 46, 49, 49, 60, 60, 62, 62, 64, 65, 94, 94, 126, 126, 4, 2, 67, 67, 99, 99, 4, 2, 68, 68, 100, 100, 4, 2, 69, 69, 101, 101, 4, 2, 70, 70, 102, 102, 4, 2, 72, 72, 104, 104, 4, 2, 73, 73, 105, 105, 4, 2, 74, 74, 106, 106, 4, 2, 75, 75, 107, 107, 4, 2, 76, 76, 108, 108, 4, 2, 77, 77, 109, 109, 4, 2, 78, 78, 110, 110, 4, 2, 79, 79, 111, 111, 4, 2, 80, 80, 112, 112, 4, 2, 81, 81, 113, 113, 4, 2, 82, 82, 114, 114, 4, 2, 83, 83, 115, 115, 4, 2, 84, 84, 116, 116, 4, 2, 85, 85, 117, 117, 4, 2, 86, 86, 118, 118, 4, 2, 87, 87, 119, 119, 4, 2, 88, 88, 120, 120, 4, 2, 89, 89, 121, 121, 4, 2, 90, 90, 122, 122, 4, 2, 91, 91, 123, 123, 4, 2, 92, 92, 124, 124, 2, 1263, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 3, 57, 3, 2, 2, 2, 3, 59, 3, 2, 2, 2, 3, 61, 3, 2, 2, 2, 3, 63, 3, 2, 2, 2, 3, 65, 3, 2, 2, 2, 4, 67, 3, 2, 2, 2, 4, 89, 3, 2, 2, 2, 4, 91, 3, 2, 2, 2, 4, 93, 3, 2, 2, 2, 4, 95, 3, 2, 2, 2, 4, 97, 3, 2, 2, 2, 4, 99, 3, 2, 2, 2, 4, 101, 3, 2, 2, 2, 4, 103, 3, 2, 2, 2, 4, 105, 3, 2, 2, 2, 4, 107, 3, 2, 2, 2, 4, 109, 3, 2, 2, 2, 4, 111, 3, 2, 2, 2, 4, 113, 3, 2, 2, 2, 4, 115, 3, 2, 2, 2, 4, 117, 3, 2, 2, 2, 4, 119, 3, 2, 2, 2, 4, 121, 3, 2, 2, 2, 4, 123, 3, 2, 2, 2, 4, 125, 3, 2, 2, 2, 4, 127, 3, 2, 2, 2, 4, 129, 3, 2, 2, 2, 4, 131, 3, 2, 2, 2, 4, 133, 3, 2, 2, 2, 4, 135, 3, 2, 2, 2, 4, 137, 3, 2, 2, 2, 4, 139, 3, 2, 2, 2, 4, 141, 3, 2, 2, 2, 4, 143, 3, 2, 2, 2, 4, 145, 3, 2, 2, 2, 4, 147, 3, 2, 2, 2, 4, 149, 3, 2, 2, 2, 4, 151, 3, 2, 2, 2, 4, 153, 3, 2, 2, 2, 4, 155, 3, 2, 2, 2, 4, 157, 3, 2, 2, 2, 4, 159, 3, 2, 2, 2, 4, 161, 3, 2, 2, 2, 4, 163, 3, 2, 2, 2, 4, 165, 3, 2, 2, 2, 4, 167, 3, 2, 2, 2, 4, 169, 3, 2, 2, 2, 4, 171, 3, 2, 2, 2, 4, 173, 3, 2, 2, 2, 5, 175, 3, 2, 2, 2, 5, 177, 3, 2, 2, 2, 5, 179, 3, 2, 2, 2, 5, 181, 3, 2, 2, 2, 5, 183, 3, 2, 2, 2, 5, 185, 3, 2, 2, 2, 5, 189, 3, 2, 2, 2, 5, 191, 3, 2, 2, 2, 5, 193, 3, 2, 2, 2, 5, 195, 3, 2, 2, 2, 5, 197, 3, 2, 2, 2, 6, 199, 3, 2, 2, 2, 6, 201, 3, 2, 2, 2, 6, 203, 3, 2, 2, 2, 6, 207, 3, 2, 2, 2, 6, 209, 3, 2, 2, 2, 6, 211, 3, 2, 2, 2, 6, 213, 3, 2, 2, 2, 6, 215, 3, 2, 2, 2, 6, 217, 3, 2, 2, 2, 7, 219, 3, 2, 2, 2, 7, 221, 3, 2, 2, 2, 7, 223, 3, 2, 2, 2, 7, 225, 3, 2, 2, 2, 7, 227, 3, 2, 2, 2, 7, 229, 3, 2, 2, 2, 7, 231, 3, 2, 2, 2, 7, 233, 3, 2, 2, 2, 7, 235, 3, 2, 2, 2, 7, 237, 3, 2, 2, 2, 8, 239, 3, 2, 2, 2, 8, 241, 3, 2, 2, 2, 8, 243, 3, 2, 2, 2, 8, 245, 3, 2, 2, 2, 8, 249, 3, 2, 2, 2, 8, 251, 3, 2, 2, 2, 8, 253, 3, 2, 2, 2, 8, 255, 3, 2, 2, 2, 8, 257, 3, 2, 2, 2, 8, 259, 3, 2, 2, 2, 9, 261, 3, 2, 2, 2, 9, 263, 3, 2, 2, 2, 9, 265, 3, 2, 2, 2, 9, 267, 3, 2, 2, 2, 9, 269, 3, 2, 2, 2, 9, 271, 3, 2, 2, 2, 9, 273, 3, 2, 2, 2, 9, 275, 3, 2, 2, 2, 9, 277, 3, 2, 2, 2, 9, 279, 3, 2, 2, 2, 10, 281, 3, 2, 2, 2, 10, 283, 3, 2, 2, 2, 10, 285, 3, 2, 2, 2, 10, 287, 3, 2, 2, 2, 10, 289, 3, 2, 2, 2, 10, 291, 3, 2, 2, 2, 10, 293, 3, 2, 2, 2, 11, 295, 3, 2, 2, 2, 11, 297, 3, 2, 2, 2, 11, 299, 3, 2, 2, 2, 11, 301, 3, 2, 2, 2, 11, 303, 3, 2, 2, 2, 11, 305, 3, 2, 2, 2, 12, 307, 3, 2, 2, 2, 12, 309, 3, 2, 2, 2, 12, 311, 3, 2, 2, 2, 12, 313, 3, 2, 2, 2, 12, 315, 3, 2, 2, 2, 12, 317, 3, 2, 2, 2, 13, 371, 3, 2, 2, 2, 15, 381, 3, 2, 2, 2, 17, 388, 3, 2, 2, 2, 19, 397, 3, 2, 2, 2, 21, 404, 3, 2, 2, 2, 23, 414, 3, 2, 2, 2, 25, 421, 3, 2, 2, 2, 27, 428, 3, 2, 2, 2, 29, 442, 3, 2, 2, 2, 31, 449, 3, 2, 2, 2, 33, 457, 3, 2, 2, 2, 35, 469, 3, 2, 2, 2, 37, 479, 3, 2, 2, 2, 39, 488, 3, 2, 2, 2, 41, 494, 3, 2, 2, 2, 43, 501, 3, 2, 2, 2, 45, 508, 3, 2, 2, 2, 47, 516, 3, 2, 2, 2, 49, 525, 3, 2, 2, 2, 51, 531, 3, 2, 2, 2, 53, 548, 3, 2, 2, 2, 55, 564, 3, 2, 2, 2, 57, 570, 3, 2, 2, 2, 59, 575, 3, 2, 2, 2, 61, 580, 3, 2, 2, 2, 63, 584, 3, 2, 2, 2, 65, 588, 3, 2, 2, 2, 67, 592, 3, 2, 2, 2, 69, 596, 3, 2, 2, 2, 71, 598, 3, 2, 2, 2, 73, 600, 3, 2, 2, 2, 75, 603, 3, 2, 2, 2, 77, 605, 3, 2, 2, 2, 79, 614, 3, 2, 2, 2, 81, 616, 3, 2, 2, 2, 83, 621, 3, 2, 2, 2, 85, 623, 3, 2, 2, 2, 87, 628, 3, 2, 2, 2, 89, 659, 3, 2, 2, 2, 91, 662, 3, 2, 2, 2, 93, 708, 3, 2, 2, 2, 95, 710, 3, 2, 2, 2, 97, 713, 3, 2, 2, 2, 99, 717, 3, 2, 2, 2, 101, 721, 3, 2, 2, 2, 103, 723, 3, 2, 2, 2, 105, 725, 3, 2, 2, 2, 107, 730, 3, 2, 2, 2, 109, 732, 3, 2, 2, 2, 111, 738, 3, 2, 2, 2, 113, 744, 3, 2, 2, 2, 115, 749, 3, 2, 2, 2, 117, 751, 3, 2, 2, 2, 119, 754, 3, 2, 2, 2, 121, 757, 3, 2, 2, 2, 123, 762, 3, 2, 2, 2, 125, 766, 3, 2, 2, 2, 127, 771, 3, 2, 2, 2, 129, 777, 3, 2, 2, 2, 131, 780, 3, 2, 2, 2, 133, 782, 3, 2, 2, 2, 135, 788, 3, 2, 2, 2, 137, 790, 3, 2, 2, 2, 139, 795, 3, 2, 2, 2, 141, 798, 3, 2, 2, 2, 143, 801, 3, 2, 2, 2, 145, 803, 3, 2, 2, 2, 147, 806, 3, 2, 2, 2, 149, 808, 3, 2, 2, 2, 151, 811, 3, 2, 2, 2, 153, 813, 3, 2, 2, 2, 155, 815, 3, 2, 2, 2, 157, 817, 3, 2, 2, 2, 159, 819, 3, 2, 2, 2, 161, 821, 3, 2, 2, 2, 163, 826, 3, 2, 2, 2, 165, 847, 3, 2, 2, 2, 167, 849, 3, 2, 2, 2, 169, 857, 3, 2, 2, 2, 171, 861, 3, 2, 2, 2, 173, 865, 3, 2, 2, 2, 175, 869, 3, 2, 2, 2, 177, 874, 3, 2, 2, 2, 179, 878, 3, 2, 2, 2, 181, 882, 3, 2, 2, 2, 183, 886, 3, 2, 2, 2, 185, 890, 3, 2, 2, 2, 187, 902, 3, 2, 2, 2, 189, 905, 3, 2, 2, 2, 191, 909, 3, 2, 2, 2, 193, 913, 3, 2, 2, 2, 195, 917, 3, 2, 2, 2, 197, 921, 3, 2, 2, 2, 199, 925, 3, 2, 2, 2, 201, 930, 3, 2, 2, 2, 203, 934, 3, 2, 2, 2, 205, 942, 3, 2, 2, 2, 207, 963, 3, 2, 2, 2, 209, 965, 3, 2, 2, 2, 211, 969, 3, 2, 2, 2, 213, 973, 3, 2, 2, 2, 215, 977, 3, 2, 2, 2, 217, 981, 3, 2, 2, 2, 219, 985, 3, 2, 2, 2, 221, 990, 3, 2, 2, 2, 223, 994, 3, 2, 2, 2, 225, 998, 3, 2, 2, 2, 227, 1002, 3, 2, 2, 2, 229, 1005, 3, 2, 2, 2, 231, 1009, 3, 2, 2, 2, 233, 1013, 3, 2, 2, 2, 235, 1017, 3, 2, 2, 2, 237, 1021, 3, 2, 2, 2, 239, 1025, 3, 2, 2, 2, 241, 1030, 3, 2, 2, 2, 243, 1035, 3, 2, 2, 2, 245, 1040, 3, 2, 2, 2, 247, 1047, 3, 2, 2, 2, 249, 1051, 3, 2, 2, 2, 251, 1059, 3, 2, 2, 2, 253, 1063, 3, 2, 2, 2, 255, 1067, 3, 2, 2, 2, 257, 1071, 3, 2, 2, 2, 259, 1075, 3, 2, 2, 2, 261, 1079, 3, 2, 2, 2, 263, 1085, 3, 2, 2, 2, 265, 1089, 3, 2, 2, 2, 267, 1093, 3, 2, 2, 2, 269, 1097, 3, 2, 2, 2, 271, 1101, 3, 2, 2, 2, 273, 1105, 3, 2, 2, 2, 275, 1109, 3, 2, 2, 2, 277, 1113, 3, 2, 2, 2, 279, 1117, 3, 2, 2, 2, 281, 1121, 3, 2, 2, 2, 283, 1126, 3, 2, 2, 2, 285, 1130, 3, 2, 2, 2, 287, 1134, 3, 2, 2, 2, 289, 1138, 3, 2, 2, 2, 291, 1142, 3, 2, 2, 2, 293, 1146, 3, 2, 2, 2, 295, 1150, 3, 2, 2, 2, 297, 1155, 3, 2, 2, 2, 299, 1160, 3, 2, 2, 2, 301, 1170, 3, 2, 2, 2, 303, 1174, 3, 2, 2, 2, 305, 1178, 3, 2, 2, 2, 307, 1182, 3, 2, 2, 2, 309, 1187, 3, 2, 2, 2, 311, 1194, 3, 2, 2, 2, 313, 1198, 3, 2, 2, 2, 315, 1202, 3, 2, 2, 2, 317, 1206, 3, 2, 2, 2, 319, 1210, 3, 2, 2, 2, 321, 1212, 3, 2, 2, 2, 323, 1214, 3, 2, 2, 2, 325, 1216, 3, 2, 2, 2, 327, 1218, 3, 2, 2, 2, 329, 1220, 3, 2, 2, 2, 331, 1222, 3, 2, 2, 2, 333, 1224, 3, 2, 2, 2, 335, 1226, 3, 2, 2, 2, 337, 1228, 3, 2, 2, 2, 339, 1230, 3, 2, 2, 2, 341, 1232, 3, 2, 2, 2, 343, 1234, 3, 2, 2, 2, 345, 1236, 3, 2, 2, 2, 347, 1238, 3, 2, 2, 2, 349, 1240, 3, 2, 2, 2, 351, 1242, 3, 2, 2, 2, 353, 1244, 3, 2, 2, 2, 355, 1246, 3, 2, 2, 2, 357, 1248, 3, 2, 2, 2, 359, 1250, 3, 2, 2, 2, 361, 1252, 3, 2, 2, 2, 363, 1254, 3, 2, 2, 2, 365, 1256, 3, 2, 2, 2, 367, 1258, 3, 2, 2, 2, 369, 1260, 3, 2, 2, 2, 371, 372, 5, 325, 158, 2, 372, 373, 5, 335, 163, 2, 373, 374, 5, 355, 173, 2, 374, 375, 5, 355, 173, 2, 375, 376, 5, 327, 159, 2, 376, 377, 5, 323, 157, 2, 377, 378, 5, 357, 174, 2, 378, 379, 3, 2, 2, 2, 379, 380, 8, 2, 2, 2, 380, 14, 3, 2, 2, 2, 381, 382, 5, 325, 158, 2, 382, 383, 5, 353, 172, 2, 383, 384, 5, 347, 169, 2, 384, 385, 5, 349, 170, 2, 385, 386, 3, 2, 2, 2, 386, 387, 8, 3, 3, 2, 387, 16, 3, 2, 2, 2, 388, 389, 5, 327, 159, 2, 389, 390, 5, 345, 168, 2, 390, 391, 5, 353, 172, 2, 391, 392, 5, 335, 163, 2, 392, 393, 5, 323, 157, 2, 393, 394, 5, 333, 162, 2, 394, 395, 3, 2, 2, 2, 395, 396, 8, 4, 4, 2, 396, 18, 3, 2, 2, 2, 397, 398, 5, 327, 159, 2, 398, 399, 5, 361, 176, 2, 399, 400, 5, 319, 155, 2, 400, 401, 5, 341, 166, 2, 401, 402, 3, 2, 2, 2, 402, 403, 8, 5, 2, 2, 403, 20, 3, 2, 2, 2, 404, 405, 5, 327, 159, 2, 405, 406, 5, 365, 178, 2, 406, 407, 5, 349, 170, 2, 407, 408, 5, 341, 166, 2, 408, 409, 5, 319, 155, 2, 409, 410, 5, 335, 163, 2, 410, 411, 5, 345, 168, 2, 411, 412, 3, 2, 2, 2, 412, 413, 8, 6, 5, 2, 413, 22, 3, 2, 2, 2, 414, 415, 5, 329, 160, 2, 415, 416, 5, 353, 172, 2, 416, 417, 5, 347, 169, 2, 417, 418, 5, 343, 167, 2, 418, 419, 3, 2, 2, 2, 419, 420, 8, 7, 6, 2, 420, 24, 3, 2, 2, 2, 421, 422, 5, 331, 161, 2, 422, 423, 5, 353, 172, 2, 423, 424, 5, 347, 169, 2, 424, 425, 5, 339, 165, 2, 425, 426, 3, 2, 2, 2, 426, 427, 8, 8, 2, 2, 427, 26, 3, 2, 2, 2, 428, 429, 5, 335, 163, 2, 429, 430, 5, 345, 168, 2, 430, 431, 5, 341, 166, 2, 431, 432, 5, 335, 163, 2, 432, 433, 5, 345, 168, 2, 433, 434, 5, 327, 159, 2, 434, 435, 5, 355, 173, 2, 435, 436, 5, 357, 174, 2, 436, 437, 5, 319, 155, 2, 437, 438, 5, 357, 174, 2, 438, 439, 5, 355, 173, 2, 439, 440, 3, 2, 2, 2, 440, 441, 8, 9, 2, 2, 441, 28, 3, 2, 2, 2, 442, 443, 5, 339, 165, 2, 443, 444, 5, 327, 159, 2, 444, 445, 5, 327, 159, 2, 445, 446, 5, 349, 170, 2, 446, 447, 3, 2, 2, 2, 447, 448, 8, 10, 3, 2, 448, 30, 3, 2, 2, 2, 449, 450, 5, 341, 166, 2, 450, 451, 5, 335, 163, 2, 451, 452, 5, 343, 167, 2, 452, 453, 5, 335, 163, 2, 453, 454, 5, 357, 174, 2, 454, 455, 3, 2, 2, 2, 455, 456, 8, 11, 2, 2, 456, 32, 3, 2, 2, 2, 457, 458, 5, 343, 167, 2, 458, 459, 5, 361, 176, 2, 459, 460, 5, 85, 38, 2, 460, 461, 5, 327, 159, 2, 461, 462, 5, 365, 178, 2, 462, 463, 5, 349, 170, 2, 463, 464, 5, 319, 155, 2, 464, 465, 5, 345, 168, 2, 465, 466, 5, 325, 158, 2, 466, 467, 3, 2, 2, 2, 467, 468, 8, 12, 7, 2, 468, 34, 3, 2, 2, 2, 469, 470, 5, 349, 170, 2, 470, 471, 5, 353, 172, 2, 471, 472, 5, 347, 169, 2, 472, 473, 5, 337, 164, 2, 473, 474, 5, 327, 159, 2, 474, 475, 5, 323, 157, 2, 475, 476, 5, 357, 174, 2, 476, 477, 3, 2, 2, 2, 477, 478, 8, 13, 3, 2, 478, 36, 3, 2, 2, 2, 479, 480, 5, 353, 172, 2, 480, 481, 5, 327, 159, 2, 481, 482, 5, 345, 168, 2, 482, 483, 5, 319, 155, 2, 483, 484, 5, 343, 167, 2, 484, 485, 5, 327, 159, 2, 485, 486, 3, 2, 2, 2, 486, 487, 8, 14, 8, 2, 487, 38, 3, 2, 2, 2, 488, 489, 5, 353, 172, 2, 489, 490, 5, 347, 169, 2, 490, 491, 5, 363, 177, 2, 491, 492, 3, 2, 2, 2, 492, 493, 8, 15, 2, 2, 493, 40, 3, 2, 2, 2, 494, 495, 5, 355, 173, 2, 495, 496, 5, 333, 162, 2, 496, 497, 5, 347, 169, 2, 497, 498, 5, 363, 177, 2, 498, 499, 3, 2, 2, 2, 499, 500, 8, 16, 9, 2, 500, 42, 3, 2, 2, 2, 501, 502, 5, 355, 173, 2, 502, 503, 5, 347, 169, 2, 503, 504, 5, 353, 172, 2, 504, 505, 5, 357, 174, 2, 505, 506, 3, 2, 2, 2, 506, 507, 8, 17, 2, 2, 507, 44, 3, 2, 2, 2, 508, 509, 5, 355, 173, 2, 509, 510, 5, 357, 174, 2, 510, 511, 5, 319, 155, 2, 511, 512, 5, 357, 174, 2, 512, 513, 5, 355, 173, 2, 513, 514, 3, 2, 2, 2, 514, 515, 8, 18, 2, 2, 515, 46, 3, 2, 2, 2, 516, 517, 5, 363, 177, 2, 517, 518, 5, 333, 162, 2, 518, 519, 5, 327, 159, 2, 519, 520, 5, 353, 172, 2, 520, 521, 5, 327, 159, 2, 521, 522, 3, 2, 2, 2, 522, 523, 8, 19, 2, 2, 523, 48, 3, 2, 2, 2, 524, 526, 10, 2, 2, 2, 525, 524, 3, 2, 2, 2, 526, 527, 3, 2, 2, 2, 527, 525, 3, 2, 2, 2, 527, 528, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 530, 8, 20, 2, 2, 530, 50, 3, 2, 2, 2, 531, 532, 7, 49, 2, 2, 532, 533, 7, 49, 2, 2, 533, 537, 3, 2, 2, 2, 534, 536, 10, 3, 2, 2, 535, 534, 3, 2, 2, 2, 536, 539, 3, 2, 2, 2, 537, 535, 3, 2, 2, 2, 537, 538, 3, 2, 2, 2, 538, 541, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 540, 542, 7, 15, 2, 2, 541, 540, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 544, 3, 2, 2, 2, 543, 545, 7, 12, 2, 2, 544, 543, 3, 2, 2, 2, 544, 545, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 547, 8, 21, 10, 2, 547, 52, 3, 2, 2, 2, 548, 549, 7, 49, 2, 2, 549, 550, 7, 44, 2, 2, 550, 555, 3, 2, 2, 2, 551, 554, 5, 53, 22, 2, 552, 554, 11, 2, 2, 2, 553, 551, 3, 2, 2, 2, 553, 552, 3, 2, 2, 2, 554, 557, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 555, 553, 3, 2, 2, 2, 556, 558, 3, 2, 2, 2, 557, 555, 3, 2, 2, 2, 558, 559, 7, 44, 2, 2, 559, 560, 7, 49, 2, 2, 560, 561, 3, 2, 2, 2, 561, 562, 8, 22, 10, 2, 562, 54, 3, 2, 2, 2, 563, 565, 9, 4, 2, 2, 564, 563, 3, 2, 2, 2, 565, 566, 3, 2, 2, 2, 566, 564, 3, 2, 2, 2, 566, 567, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 569, 8, 23, 10, 2, 569, 56, 3, 2, 2, 2, 570, 571, 5, 161, 76, 2, 571, 572, 3, 2, 2, 2, 572, 573, 8, 24, 11, 2, 573, 574, 8, 24, 12, 2, 574, 58, 3, 2, 2, 2, 575, 576, 5, 67, 29, 2, 576, 577, 3, 2, 2, 2, 577, 578, 8, 25, 13, 2, 578, 579, 8, 25, 14, 2, 579, 60, 3, 2, 2, 2, 580, 581, 5, 55, 23, 2, 581, 582, 3, 2, 2, 2, 582, 583, 8, 26, 10, 2, 583, 62, 3, 2, 2, 2, 584, 585, 5, 51, 21, 2, 585, 586, 3, 2, 2, 2, 586, 587, 8, 27, 10, 2, 587, 64, 3, 2, 2, 2, 588, 589, 5, 53, 22, 2, 589, 590, 3, 2, 2, 2, 590, 591, 8, 28, 10, 2, 591, 66, 3, 2, 2, 2, 592, 593, 7, 126, 2, 2, 593, 594, 3, 2, 2, 2, 594, 595, 8, 29, 14, 2, 595, 68, 3, 2, 2, 2, 596, 597, 9, 5, 2, 2, 597, 70, 3, 2, 2, 2, 598, 599, 9, 6, 2, 2, 599, 72, 3, 2, 2, 2, 600, 601, 7, 94, 2, 2, 601, 602, 9, 7, 2, 2, 602, 74, 3, 2, 2, 2, 603, 604, 10, 8, 2, 2, 604, 76, 3, 2, 2, 2, 605, 607, 9, 9, 2, 2, 606, 608, 9, 10, 2, 2, 607, 606, 3, 2, 2, 2, 607, 608, 3, 2, 2, 2, 608, 610, 3, 2, 2, 2, 609, 611, 5, 69, 30, 2, 610, 609, 3, 2, 2, 2, 611, 612, 3, 2, 2, 2, 612, 610, 3, 2, 2, 2, 612, 613, 3, 2, 2, 2, 613, 78, 3, 2, 2, 2, 614, 615, 7, 66, 2, 2, 615, 80, 3, 2, 2, 2, 616, 617, 7, 98, 2, 2, 617, 82, 3, 2, 2, 2, 618, 622, 10, 11, 2, 2, 619, 620, 7, 98, 2, 2, 620, 622, 7, 98, 2, 2, 621, 618, 3, 2, 2, 2, 621, 619, 3, 2, 2, 2, 622, 84, 3, 2, 2, 2, 623, 624, 7, 97, 2, 2, 624, 86, 3, 2, 2, 2, 625, 629, 5, 71, 31, 2, 626, 629, 5, 69, 30, 2, 627, 629, 5, 85, 38, 2, 628, 625, 3, 2, 2, 2, 628, 626, 3, 2, 2, 2, 628, 627, 3, 2, 2, 2, 629, 88, 3, 2, 2, 2, 630, 635, 7, 36, 2, 2, 631, 634, 5, 73, 32, 2, 632, 634, 5, 75, 33, 2, 633, 631, 3, 2, 2, 2, 633, 632, 3, 2, 2, 2, 634, 637, 3, 2, 2, 2, 635, 633, 3, 2, 2, 2, 635, 636, 3, 2, 2, 2, 636, 638, 3, 2, 2, 2, 637, 635, 3, 2, 2, 2, 638, 660, 7, 36, 2, 2, 639, 640, 7, 36, 2, 2, 640, 641, 7, 36, 2, 2, 641, 642, 7, 36, 2, 2, 642, 646, 3, 2, 2, 2, 643, 645, 10, 3, 2, 2, 644, 643, 3, 2, 2, 2, 645, 648, 3, 2, 2, 2, 646, 647, 3, 2, 2, 2, 646, 644, 3, 2, 2, 2, 647, 649, 3, 2, 2, 2, 648, 646, 3, 2, 2, 2, 649, 650, 7, 36, 2, 2, 650, 651, 7, 36, 2, 2, 651, 652, 7, 36, 2, 2, 652, 654, 3, 2, 2, 2, 653, 655, 7, 36, 2, 2, 654, 653, 3, 2, 2, 2, 654, 655, 3, 2, 2, 2, 655, 657, 3, 2, 2, 2, 656, 658, 7, 36, 2, 2, 657, 656, 3, 2, 2, 2, 657, 658, 3, 2, 2, 2, 658, 660, 3, 2, 2, 2, 659, 630, 3, 2, 2, 2, 659, 639, 3, 2, 2, 2, 660, 90, 3, 2, 2, 2, 661, 663, 5, 69, 30, 2, 662, 661, 3, 2, 2, 2, 663, 664, 3, 2, 2, 2, 664, 662, 3, 2, 2, 2, 664, 665, 3, 2, 2, 2, 665, 92, 3, 2, 2, 2, 666, 668, 5, 69, 30, 2, 667, 666, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 667, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 671, 3, 2, 2, 2, 671, 675, 5, 107, 49, 2, 672, 674, 5, 69, 30, 2, 673, 672, 3, 2, 2, 2, 674, 677, 3, 2, 2, 2, 675, 673, 3, 2, 2, 2, 675, 676, 3, 2, 2, 2, 676, 709, 3, 2, 2, 2, 677, 675, 3, 2, 2, 2, 678, 680, 5, 107, 49, 2, 679, 681, 5, 69, 30, 2, 680, 679, 3, 2, 2, 2, 681, 682, 3, 2, 2, 2, 682, 680, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 709, 3, 2, 2, 2, 684, 686, 5, 69, 30, 2, 685, 684, 3, 2, 2, 2, 686, 687, 3, 2, 2, 2, 687, 685, 3, 2, 2, 2, 687, 688, 3, 2, 2, 2, 688, 696, 3, 2, 2, 2, 689, 693, 5, 107, 49, 2, 690, 692, 5, 69, 30, 2, 691, 690, 3, 2, 2, 2, 692, 695, 3, 2, 2, 2, 693, 691, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 697, 3, 2, 2, 2, 695, 693, 3, 2, 2, 2, 696, 689, 3, 2, 2, 2, 696, 697, 3, 2, 2, 2, 697, 698, 3, 2, 2, 2, 698, 699, 5, 77, 34, 2, 699, 709, 3, 2, 2, 2, 700, 702, 5, 107, 49, 2, 701, 703, 5, 69, 30, 2, 702, 701, 3, 2, 2, 2, 703, 704, 3, 2, 2, 2, 704, 702, 3, 2, 2, 2, 704, 705, 3, 2, 2, 2, 705, 706, 3, 2, 2, 2, 706, 707, 5, 77, 34, 2, 707, 709, 3, 2, 2, 2, 708, 667, 3, 2, 2, 2, 708, 678, 3, 2, 2, 2, 708, 685, 3, 2, 2, 2, 708, 700, 3, 2, 2, 2, 709, 94, 3, 2, 2, 2, 710, 711, 5, 321, 156, 2, 711, 712, 5, 367, 179, 2, 712, 96, 3, 2, 2, 2, 713, 714, 5, 319, 155, 2, 714, 715, 5, 345, 168, 2, 715, 716, 5, 325, 158, 2, 716, 98, 3, 2, 2, 2, 717, 718, 5, 319, 155, 2, 718, 719, 5, 355, 173, 2, 719, 720, 5, 323, 157, 2, 720, 100, 3, 2, 2, 2, 721, 722, 7, 63, 2, 2, 722, 102, 3, 2, 2, 2, 723, 724, 7, 46, 2, 2, 724, 104, 3, 2, 2, 2, 725, 726, 5, 325, 158, 2, 726, 727, 5, 327, 159, 2, 727, 728, 5, 355, 173, 2, 728, 729, 5, 323, 157, 2, 729, 106, 3, 2, 2, 2, 730, 731, 7, 48, 2, 2, 731, 108, 3, 2, 2, 2, 732, 733, 5, 329, 160, 2, 733, 734, 5, 319, 155, 2, 734, 735, 5, 341, 166, 2, 735, 736, 5, 355, 173, 2, 736, 737, 5, 327, 159, 2, 737, 110, 3, 2, 2, 2, 738, 739, 5, 329, 160, 2, 739, 740, 5, 335, 163, 2, 740, 741, 5, 353, 172, 2, 741, 742, 5, 355, 173, 2, 742, 743, 5, 357, 174, 2, 743, 112, 3, 2, 2, 2, 744, 745, 5, 341, 166, 2, 745, 746, 5, 319, 155, 2, 746, 747, 5, 355, 173, 2, 747, 748, 5, 357, 174, 2, 748, 114, 3, 2, 2, 2, 749, 750, 7, 42, 2, 2, 750, 116, 3, 2, 2, 2, 751, 752, 5, 335, 163, 2, 752, 753, 5, 345, 168, 2, 753, 118, 3, 2, 2, 2, 754, 755, 5, 335, 163, 2, 755, 756, 5, 355, 173, 2, 756, 120, 3, 2, 2, 2, 757, 758, 5, 341, 166, 2, 758, 759, 5, 335, 163, 2, 759, 760, 5, 339, 165, 2, 760, 761, 5, 327, 159, 2, 761, 122, 3, 2, 2, 2, 762, 763, 5, 345, 168, 2, 763, 764, 5, 347, 169, 2, 764, 765, 5, 357, 174, 2, 765, 124, 3, 2, 2, 2, 766, 767, 5, 345, 168, 2, 767, 768, 5, 359, 175, 2, 768, 769, 5, 341, 166, 2, 769, 770, 5, 341, 166, 2, 770, 126, 3, 2, 2, 2, 771, 772, 5, 345, 168, 2, 772, 773, 5, 359, 175, 2, 773, 774, 5, 341, 166, 2, 774, 775, 5, 341, 166, 2, 775, 776, 5, 355, 173, 2, 776, 128, 3, 2, 2, 2, 777, 778, 5, 347, 169, 2, 778, 779, 5, 353, 172, 2, 779, 130, 3, 2, 2, 2, 780, 781, 7, 65, 2, 2, 781, 132, 3, 2, 2, 2, 782, 783, 5, 353, 172, 2, 783, 784, 5, 341, 166, 2, 784, 785, 5, 335, 163, 2, 785, 786, 5, 339, 165, 2, 786, 787, 5, 327, 159, 2, 787, 134, 3, 2, 2, 2, 788, 789, 7, 43, 2, 2, 789, 136, 3, 2, 2, 2, 790, 791, 5, 357, 174, 2, 791, 792, 5, 353, 172, 2, 792, 793, 5, 359, 175, 2, 793, 794, 5, 327, 159, 2, 794, 138, 3, 2, 2, 2, 795, 796, 7, 63, 2, 2, 796, 797, 7, 63, 2, 2, 797, 140, 3, 2, 2, 2, 798, 799, 7, 35, 2, 2, 799, 800, 7, 63, 2, 2, 800, 142, 3, 2, 2, 2, 801, 802, 7, 62, 2, 2, 802, 144, 3, 2, 2, 2, 803, 804, 7, 62, 2, 2, 804, 805, 7, 63, 2, 2, 805, 146, 3, 2, 2, 2, 806, 807, 7, 64, 2, 2, 807, 148, 3, 2, 2, 2, 808, 809, 7, 64, 2, 2, 809, 810, 7, 63, 2, 2, 810, 150, 3, 2, 2, 2, 811, 812, 7, 45, 2, 2, 812, 152, 3, 2, 2, 2, 813, 814, 7, 47, 2, 2, 814, 154, 3, 2, 2, 2, 815, 816, 7, 44, 2, 2, 816, 156, 3, 2, 2, 2, 817, 818, 7, 49, 2, 2, 818, 158, 3, 2, 2, 2, 819, 820, 7, 39, 2, 2, 820, 160, 3, 2, 2, 2, 821, 822, 7, 93, 2, 2, 822, 823, 3, 2, 2, 2, 823, 824, 8, 76, 2, 2, 824, 825, 8, 76, 2, 2, 825, 162, 3, 2, 2, 2, 826, 827, 7, 95, 2, 2, 827, 828, 3, 2, 2, 2, 828, 829, 8, 77, 14, 2, 829, 830, 8, 77, 14, 2, 830, 164, 3, 2, 2, 2, 831, 835, 5, 71, 31, 2, 832, 834, 5, 87, 39, 2, 833, 832, 3, 2, 2, 2, 834, 837, 3, 2, 2, 2, 835, 833, 3, 2, 2, 2, 835, 836, 3, 2, 2, 2, 836, 848, 3, 2, 2, 2, 837, 835, 3, 2, 2, 2, 838, 841, 5, 85, 38, 2, 839, 841, 5, 79, 35, 2, 840, 838, 3, 2, 2, 2, 840, 839, 3, 2, 2, 2, 841, 843, 3, 2, 2, 2, 842, 844, 5, 87, 39, 2, 843, 842, 3, 2, 2, 2, 844, 845, 3, 2, 2, 2, 845, 843, 3, 2, 2, 2, 845, 846, 3, 2, 2, 2, 846, 848, 3, 2, 2, 2, 847, 831, 3, 2, 2, 2, 847, 840, 3, 2, 2, 2, 848, 166, 3, 2, 2, 2, 849, 851, 5, 81, 36, 2, 850, 852, 5, 83, 37, 2, 851, 850, 3, 2, 2, 2, 852, 853, 3, 2, 2, 2, 853, 851, 3, 2, 2, 2, 853, 854, 3, 2, 2, 2, 854, 855, 3, 2, 2, 2, 855, 856, 5, 81, 36, 2, 856, 168, 3, 2, 2, 2, 857, 858, 5, 51, 21, 2, 858, 859, 3, 2, 2, 2, 859, 860, 8, 80, 10, 2, 860, 170, 3, 2, 2, 2, 861, 862, 5, 53, 22, 2, 862, 863, 3, 2, 2, 2, 863, 864, 8, 81, 10, 2, 864, 172, 3, 2, 2, 2, 865, 866, 5, 55, 23, 2, 866, 867, 3, 2, 2, 2, 867, 868, 8, 82, 10, 2, 868, 174, 3, 2, 2, 2, 869, 870, 5, 67, 29, 2, 870, 871, 3, 2, 2, 2, 871, 872, 8, 83, 13, 2, 872, 873, 8, 83, 14, 2, 873, 176, 3, 2, 2, 2, 874, 875, 5, 161, 76, 2, 875, 876, 3, 2, 2, 2, 876, 877, 8, 84, 11, 2, 877, 178, 3, 2, 2, 2, 878, 879, 5, 163, 77, 2, 879, 880, 3, 2, 2, 2, 880, 881, 8, 85, 15, 2, 881, 180, 3, 2, 2, 2, 882, 883, 5, 103, 47, 2, 883, 884, 3, 2, 2, 2, 884, 885, 8, 86, 16, 2, 885, 182, 3, 2, 2, 2, 886, 887, 5, 101, 46, 2, 887, 888, 3, 2, 2, 2, 888, 889, 8, 87, 17, 2, 889, 184, 3, 2, 2, 2, 890, 891, 5, 343, 167, 2, 891, 892, 5, 327, 159, 2, 892, 893, 5, 357, 174, 2, 893, 894, 5, 319, 155, 2, 894, 895, 5, 325, 158, 2, 895, 896, 5, 319, 155, 2, 896, 897, 5, 357, 174, 2, 897, 898, 5, 319, 155, 2, 898, 186, 3, 2, 2, 2, 899, 903, 10, 12, 2, 2, 900, 901, 7, 49, 2, 2, 901, 903, 10, 13, 2, 2, 902, 899, 3, 2, 2, 2, 902, 900, 3, 2, 2, 2, 903, 188, 3, 2, 2, 2, 904, 906, 5, 187, 89, 2, 905, 904, 3, 2, 2, 2, 906, 907, 3, 2, 2, 2, 907, 905, 3, 2, 2, 2, 907, 908, 3, 2, 2, 2, 908, 190, 3, 2, 2, 2, 909, 910, 5, 167, 79, 2, 910, 911, 3, 2, 2, 2, 911, 912, 8, 91, 18, 2, 912, 192, 3, 2, 2, 2, 913, 914, 5, 51, 21, 2, 914, 915, 3, 2, 2, 2, 915, 916, 8, 92, 10, 2, 916, 194, 3, 2, 2, 2, 917, 918, 5, 53, 22, 2, 918, 919, 3, 2, 2, 2, 919, 920, 8, 93, 10, 2, 920, 196, 3, 2, 2, 2, 921, 922, 5, 55, 23, 2, 922, 923, 3, 2, 2, 2, 923, 924, 8, 94, 10, 2, 924, 198, 3, 2, 2, 2, 925, 926, 5, 67, 29, 2, 926, 927, 3, 2, 2, 2, 927, 928, 8, 95, 13, 2, 928, 929, 8, 95, 14, 2, 929, 200, 3, 2, 2, 2, 930, 931, 5, 107, 49, 2, 931, 932, 3, 2, 2, 2, 932, 933, 8, 96, 19, 2, 933, 202, 3, 2, 2, 2, 934, 935, 5, 103, 47, 2, 935, 936, 3, 2, 2, 2, 936, 937, 8, 97, 16, 2, 937, 204, 3, 2, 2, 2, 938, 943, 5, 71, 31, 2, 939, 943, 5, 69, 30, 2, 940, 943, 5, 85, 38, 2, 941, 943, 5, 155, 73, 2, 942, 938, 3, 2, 2, 2, 942, 939, 3, 2, 2, 2, 942, 940, 3, 2, 2, 2, 942, 941, 3, 2, 2, 2, 943, 206, 3, 2, 2, 2, 944, 947, 5, 71, 31, 2, 945, 947, 5, 155, 73, 2, 946, 944, 3, 2, 2, 2, 946, 945, 3, 2, 2, 2, 947, 951, 3, 2, 2, 2, 948, 950, 5, 205, 98, 2, 949, 948, 3, 2, 2, 2, 950, 953, 3, 2, 2, 2, 951, 949, 3, 2, 2, 2, 951, 952, 3, 2, 2, 2, 952, 964, 3, 2, 2, 2, 953, 951, 3, 2, 2, 2, 954, 957, 5, 85, 38, 2, 955, 957, 5, 79, 35, 2, 956, 954, 3, 2, 2, 2, 956, 955, 3, 2, 2, 2, 957, 959, 3, 2, 2, 2, 958, 960, 5, 205, 98, 2, 959, 958, 3, 2, 2, 2, 960, 961, 3, 2, 2, 2, 961, 959, 3, 2, 2, 2, 961, 962, 3, 2, 2, 2, 962, 964, 3, 2, 2, 2, 963, 946, 3, 2, 2, 2, 963, 956, 3, 2, 2, 2, 964, 208, 3, 2, 2, 2, 965, 966, 5, 207, 99, 2, 966, 967, 3, 2, 2, 2, 967, 968, 8, 100, 20, 2, 968, 210, 3, 2, 2, 2, 969, 970, 5, 167, 79, 2, 970, 971, 3, 2, 2, 2, 971, 972, 8, 101, 18, 2, 972, 212, 3, 2, 2, 2, 973, 974, 5, 51, 21, 2, 974, 975, 3, 2, 2, 2, 975, 976, 8, 102, 10, 2, 976, 214, 3, 2, 2, 2, 977, 978, 5, 53, 22, 2, 978, 979, 3, 2, 2, 2, 979, 980, 8, 103, 10, 2, 980, 216, 3, 2, 2, 2, 981, 982, 5, 55, 23, 2, 982, 983, 3, 2, 2, 2, 983, 984, 8, 104, 10, 2, 984, 218, 3, 2, 2, 2, 985, 986, 5, 67, 29, 2, 986, 987, 3, 2, 2, 2, 987, 988, 8, 105, 13, 2, 988, 989, 8, 105, 14, 2, 989, 220, 3, 2, 2, 2, 990, 991, 5, 101, 46, 2, 991, 992, 3, 2, 2, 2, 992, 993, 8, 106, 17, 2, 993, 222, 3, 2, 2, 2, 994, 995, 5, 103, 47, 2, 995, 996, 3, 2, 2, 2, 996, 997, 8, 107, 16, 2, 997, 224, 3, 2, 2, 2, 998, 999, 5, 107, 49, 2, 999, 1000, 3, 2, 2, 2, 1000, 1001, 8, 108, 19, 2, 1001, 226, 3, 2, 2, 2, 1002, 1003, 5, 319, 155, 2, 1003, 1004, 5, 355, 173, 2, 1004, 228, 3, 2, 2, 2, 1005, 1006, 5, 167, 79, 2, 1006, 1007, 3, 2, 2, 2, 1007, 1008, 8, 110, 18, 2, 1008, 230, 3, 2, 2, 2, 1009, 1010, 5, 207, 99, 2, 1010, 1011, 3, 2, 2, 2, 1011, 1012, 8, 111, 20, 2, 1012, 232, 3, 2, 2, 2, 1013, 1014, 5, 51, 21, 2, 1014, 1015, 3, 2, 2, 2, 1015, 1016, 8, 112, 10, 2, 1016, 234, 3, 2, 2, 2, 1017, 1018, 5, 53, 22, 2, 1018, 1019, 3, 2, 2, 2, 1019, 1020, 8, 113, 10, 2, 1020, 236, 3, 2, 2, 2, 1021, 1022, 5, 55, 23, 2, 1022, 1023, 3, 2, 2, 2, 1023, 1024, 8, 114, 10, 2, 1024, 238, 3, 2, 2, 2, 1025, 1026, 5, 67, 29, 2, 1026, 1027, 3, 2, 2, 2, 1027, 1028, 8, 115, 13, 2, 1028, 1029, 8, 115, 14, 2, 1029, 240, 3, 2, 2, 2, 1030, 1031, 5, 161, 76, 2, 1031, 1032, 3, 2, 2, 2, 1032, 1033, 8, 116, 11, 2, 1033, 1034, 8, 116, 21, 2, 1034, 242, 3, 2, 2, 2, 1035, 1036, 5, 347, 169, 2, 1036, 1037, 5, 345, 168, 2, 1037, 1038, 3, 2, 2, 2, 1038, 1039, 8, 117, 22, 2, 1039, 244, 3, 2, 2, 2, 1040, 1041, 5, 363, 177, 2, 1041, 1042, 5, 335, 163, 2, 1042, 1043, 5, 357, 174, 2, 1043, 1044, 5, 333, 162, 2, 1044, 1045, 3, 2, 2, 2, 1045, 1046, 8, 118, 22, 2, 1046, 246, 3, 2, 2, 2, 1047, 1048, 10, 14, 2, 2, 1048, 248, 3, 2, 2, 2, 1049, 1052, 5, 71, 31, 2, 1050, 1052, 5, 69, 30, 2, 1051, 1049, 3, 2, 2, 2, 1051, 1050, 3, 2, 2, 2, 1052, 1056, 3, 2, 2, 2, 1053, 1055, 5, 247, 119, 2, 1054, 1053, 3, 2, 2, 2, 1055, 1058, 3, 2, 2, 2, 1056, 1054, 3, 2, 2, 2, 1056, 1057, 3, 2, 2, 2, 1057, 250, 3, 2, 2, 2, 1058, 1056, 3, 2, 2, 2, 1059, 1060, 5, 167, 79, 2, 1060, 1061, 3, 2, 2, 2, 1061, 1062, 8, 121, 18, 2, 1062, 252, 3, 2, 2, 2, 1063, 1064, 5, 249, 120, 2, 1064, 1065, 3, 2, 2, 2, 1065, 1066, 8, 122, 23, 2, 1066, 254, 3, 2, 2, 2, 1067, 1068, 5, 51, 21, 2, 1068, 1069, 3, 2, 2, 2, 1069, 1070, 8, 123, 10, 2, 1070, 256, 3, 2, 2, 2, 1071, 1072, 5, 53, 22, 2, 1072, 1073, 3, 2, 2, 2, 1073, 1074, 8, 124, 10, 2, 1074, 258, 3, 2, 2, 2, 1075, 1076, 5, 55, 23, 2, 1076, 1077, 3, 2, 2, 2, 1077, 1078, 8, 125, 10, 2, 1078, 260, 3, 2, 2, 2, 1079, 1080, 5, 67, 29, 2, 1080, 1081, 3, 2, 2, 2, 1081, 1082, 8, 126, 13, 2, 1082, 1083, 8, 126, 14, 2, 1083, 1084, 8, 126, 14, 2, 1084, 262, 3, 2, 2, 2, 1085, 1086, 5, 101, 46, 2, 1086, 1087, 3, 2, 2, 2, 1087, 1088, 8, 127, 17, 2, 1088, 264, 3, 2, 2, 2, 1089, 1090, 5, 103, 47, 2, 1090, 1091, 3, 2, 2, 2, 1091, 1092, 8, 128, 16, 2, 1092, 266, 3, 2, 2, 2, 1093, 1094, 5, 107, 49, 2, 1094, 1095, 3, 2, 2, 2, 1095, 1096, 8, 129, 19, 2, 1096, 268, 3, 2, 2, 2, 1097, 1098, 5, 245, 118, 2, 1098, 1099, 3, 2, 2, 2, 1099, 1100, 8, 130, 24, 2, 1100, 270, 3, 2, 2, 2, 1101, 1102, 5, 207, 99, 2, 1102, 1103, 3, 2, 2, 2, 1103, 1104, 8, 131, 20, 2, 1104, 272, 3, 2, 2, 2, 1105, 1106, 5, 167, 79, 2, 1106, 1107, 3, 2, 2, 2, 1107, 1108, 8, 132, 18, 2, 1108, 274, 3, 2, 2, 2, 1109, 1110, 5, 51, 21, 2, 1110, 1111, 3, 2, 2, 2, 1111, 1112, 8, 133, 10, 2, 1112, 276, 3, 2, 2, 2, 1113, 1114, 5, 53, 22, 2, 1114, 1115, 3, 2, 2, 2, 1115, 1116, 8, 134, 10, 2, 1116, 278, 3, 2, 2, 2, 1117, 1118, 5, 55, 23, 2, 1118, 1119, 3, 2, 2, 2, 1119, 1120, 8, 135, 10, 2, 1120, 280, 3, 2, 2, 2, 1121, 1122, 5, 67, 29, 2, 1122, 1123, 3, 2, 2, 2, 1123, 1124, 8, 136, 13, 2, 1124, 1125, 8, 136, 14, 2, 1125, 282, 3, 2, 2, 2, 1126, 1127, 5, 107, 49, 2, 1127, 1128, 3, 2, 2, 2, 1128, 1129, 8, 137, 19, 2, 1129, 284, 3, 2, 2, 2, 1130, 1131, 5, 167, 79, 2, 1131, 1132, 3, 2, 2, 2, 1132, 1133, 8, 138, 18, 2, 1133, 286, 3, 2, 2, 2, 1134, 1135, 5, 165, 78, 2, 1135, 1136, 3, 2, 2, 2, 1136, 1137, 8, 139, 25, 2, 1137, 288, 3, 2, 2, 2, 1138, 1139, 5, 51, 21, 2, 1139, 1140, 3, 2, 2, 2, 1140, 1141, 8, 140, 10, 2, 1141, 290, 3, 2, 2, 2, 1142, 1143, 5, 53, 22, 2, 1143, 1144, 3, 2, 2, 2, 1144, 1145, 8, 141, 10, 2, 1145, 292, 3, 2, 2, 2, 1146, 1147, 5, 55, 23, 2, 1147, 1148, 3, 2, 2, 2, 1148, 1149, 8, 142, 10, 2, 1149, 294, 3, 2, 2, 2, 1150, 1151, 5, 67, 29, 2, 1151, 1152, 3, 2, 2, 2, 1152, 1153, 8, 143, 13, 2, 1153, 1154, 8, 143, 14, 2, 1154, 296, 3, 2, 2, 2, 1155, 1156, 5, 335, 163, 2, 1156, 1157, 5, 345, 168, 2, 1157, 1158, 5, 329, 160, 2, 1158, 1159, 5, 347, 169, 2, 1159, 298, 3, 2, 2, 2, 1160, 1161, 5, 329, 160, 2, 1161, 1162, 5, 359, 175, 2, 1162, 1163, 5, 345, 168, 2, 1163, 1164, 5, 323, 157, 2, 1164, 1165, 5, 357, 174, 2, 1165, 1166, 5, 335, 163, 2, 1166, 1167, 5, 347, 169, 2, 1167, 1168, 5, 345, 168, 2, 1168, 1169, 5, 355, 173, 2, 1169, 300, 3, 2, 2, 2, 1170, 1171, 5, 51, 21, 2, 1171, 1172, 3, 2, 2, 2, 1172, 1173, 8, 146, 10, 2, 1173, 302, 3, 2, 2, 2, 1174, 1175, 5, 53, 22, 2, 1175, 1176, 3, 2, 2, 2, 1176, 1177, 8, 147, 10, 2, 1177, 304, 3, 2, 2, 2, 1178, 1179, 5, 55, 23, 2, 1179, 1180, 3, 2, 2, 2, 1180, 1181, 8, 148, 10, 2, 1181, 306, 3, 2, 2, 2, 1182, 1183, 5, 163, 77, 2, 1183, 1184, 3, 2, 2, 2, 1184, 1185, 8, 149, 15, 2, 1185, 1186, 8, 149, 14, 2, 1186, 308, 3, 2, 2, 2, 1187, 1188, 7, 60, 2, 2, 1188, 310, 3, 2, 2, 2, 1189, 1195, 5, 79, 35, 2, 1190, 1195, 5, 69, 30, 2, 1191, 1195, 5, 107, 49, 2, 1192, 1195, 5, 71, 31, 2, 1193, 1195, 5, 85, 38, 2, 1194, 1189, 3, 2, 2, 2, 1194, 1190, 3, 2, 2, 2, 1194, 1191, 3, 2, 2, 2, 1194, 1192, 3, 2, 2, 2, 1194, 1193, 3, 2, 2, 2, 1195, 1196, 3, 2, 2, 2, 1196, 1194, 3, 2, 2, 2, 1196, 1197, 3, 2, 2, 2, 1197, 312, 3, 2, 2, 2, 1198, 1199, 5, 51, 21, 2, 1199, 1200, 3, 2, 2, 2, 1200, 1201, 8, 152, 10, 2, 1201, 314, 3, 2, 2, 2, 1202, 1203, 5, 53, 22, 2, 1203, 1204, 3, 2, 2, 2, 1204, 1205, 8, 153, 10, 2, 1205, 316, 3, 2, 2, 2, 1206, 1207, 5, 55, 23, 2, 1207, 1208, 3, 2, 2, 2, 1208, 1209, 8, 154, 10, 2, 1209, 318, 3, 2, 2, 2, 1210, 1211, 9, 15, 2, 2, 1211, 320, 3, 2, 2, 2, 1212, 1213, 9, 16, 2, 2, 1213, 322, 3, 2, 2, 2, 1214, 1215, 9, 17, 2, 2, 1215, 324, 3, 2, 2, 2, 1216, 1217, 9, 18, 2, 2, 1217, 326, 3, 2, 2, 2, 1218, 1219, 9, 9, 2, 2, 1219, 328, 3, 2, 2, 2, 1220, 1221, 9, 19, 2, 2, 1221, 330, 3, 2, 2, 2, 1222, 1223, 9, 20, 2, 2, 1223, 332, 3, 2, 2, 2, 1224, 1225, 9, 21, 2, 2, 1225, 334, 3, 2, 2, 2, 1226, 1227, 9, 22, 2, 2, 1227, 336, 3, 2, 2, 2, 1228, 1229, 9, 23, 2, 2, 1229, 338, 3, 2, 2, 2, 1230, 1231, 9, 24, 2, 2, 1231, 340, 3, 2, 2, 2, 1232, 1233, 9, 25, 2, 2, 1233, 342, 3, 2, 2, 2, 1234, 1235, 9, 26, 2, 2, 1235, 344, 3, 2, 2, 2, 1236, 1237, 9, 27, 2, 2, 1237, 346, 3, 2, 2, 2, 1238, 1239, 9, 28, 2, 2, 1239, 348, 3, 2, 2, 2, 1240, 1241, 9, 29, 2, 2, 1241, 350, 3, 2, 2, 2, 1242, 1243, 9, 30, 2, 2, 1243, 352, 3, 2, 2, 2, 1244, 1245, 9, 31, 2, 2, 1245, 354, 3, 2, 2, 2, 1246, 1247, 9, 32, 2, 2, 1247, 356, 3, 2, 2, 2, 1248, 1249, 9, 33, 2, 2, 1249, 358, 3, 2, 2, 2, 1250, 1251, 9, 34, 2, 2, 1251, 360, 3, 2, 2, 2, 1252, 1253, 9, 35, 2, 2, 1253, 362, 3, 2, 2, 2, 1254, 1255, 9, 36, 2, 2, 1255, 364, 3, 2, 2, 2, 1256, 1257, 9, 37, 2, 2, 1257, 366, 3, 2, 2, 2, 1258, 1259, 9, 38, 2, 2, 1259, 368, 3, 2, 2, 2, 1260, 1261, 9, 39, 2, 2, 1261, 370, 3, 2, 2, 2, 56, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 527, 537, 541, 544, 553, 555, 566, 607, 612, 621, 628, 633, 635, 646, 654, 657, 659, 664, 669, 675, 682, 687, 693, 696, 704, 708, 835, 840, 845, 847, 853, 902, 907, 942, 946, 951, 956, 961, 963, 1051, 1056, 1194, 1196, 26, 7, 4, 2, 7, 6, 2, 7, 8, 2, 7, 3, 2, 7, 5, 2, 7, 10, 2, 7, 7, 2, 7, 11, 2, 2, 3, 2, 9, 65, 2, 7, 2, 2, 9, 28, 2, 6, 2, 2, 9, 66, 2, 9, 36, 2, 9, 35, 2, 9, 68, 2, 9, 38, 2, 9, 77, 2, 7, 12, 2, 7, 9, 2, 9, 87, 2, 9, 86, 2, 9, 67, 2] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 107, 1267, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 4, 181, 9, 181, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 6, 20, 528, 10, 20, 13, 20, 14, 20, 529, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 538, 10, 21, 12, 21, 14, 21, 541, 11, 21, 3, 21, 5, 21, 544, 10, 21, 3, 21, 5, 21, 547, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 556, 10, 22, 12, 22, 14, 22, 559, 11, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 6, 23, 567, 10, 23, 13, 23, 14, 23, 568, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 5, 34, 610, 10, 34, 3, 34, 6, 34, 613, 10, 34, 13, 34, 14, 34, 614, 3, 35, 3, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 5, 37, 624, 10, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 5, 39, 631, 10, 39, 3, 40, 3, 40, 3, 40, 7, 40, 636, 10, 40, 12, 40, 14, 40, 639, 11, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 647, 10, 40, 12, 40, 14, 40, 650, 11, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 657, 10, 40, 3, 40, 5, 40, 660, 10, 40, 5, 40, 662, 10, 40, 3, 41, 6, 41, 665, 10, 41, 13, 41, 14, 41, 666, 3, 42, 6, 42, 670, 10, 42, 13, 42, 14, 42, 671, 3, 42, 3, 42, 7, 42, 676, 10, 42, 12, 42, 14, 42, 679, 11, 42, 3, 42, 3, 42, 6, 42, 683, 10, 42, 13, 42, 14, 42, 684, 3, 42, 6, 42, 688, 10, 42, 13, 42, 14, 42, 689, 3, 42, 3, 42, 7, 42, 694, 10, 42, 12, 42, 14, 42, 697, 11, 42, 5, 42, 699, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 6, 42, 705, 10, 42, 13, 42, 14, 42, 706, 3, 42, 3, 42, 5, 42, 711, 10, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 73, 3, 73, 3, 74, 3, 74, 3, 75, 3, 75, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 7, 79, 839, 10, 79, 12, 79, 14, 79, 842, 11, 79, 3, 79, 3, 79, 5, 79, 846, 10, 79, 3, 79, 6, 79, 849, 10, 79, 13, 79, 14, 79, 850, 5, 79, 853, 10, 79, 3, 80, 3, 80, 6, 80, 857, 10, 80, 13, 80, 14, 80, 858, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 5, 90, 908, 10, 90, 3, 91, 6, 91, 911, 10, 91, 13, 91, 14, 91, 912, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 5, 99, 948, 10, 99, 3, 100, 3, 100, 5, 100, 952, 10, 100, 3, 100, 7, 100, 955, 10, 100, 12, 100, 14, 100, 958, 11, 100, 3, 100, 3, 100, 5, 100, 962, 10, 100, 3, 100, 6, 100, 965, 10, 100, 13, 100, 14, 100, 966, 5, 100, 969, 10, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 120, 3, 120, 3, 121, 3, 121, 5, 121, 1057, 10, 121, 3, 121, 7, 121, 1060, 10, 121, 12, 121, 14, 121, 1063, 11, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 149, 3, 149, 3, 149, 3, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 6, 152, 1200, 10, 152, 13, 152, 14, 152, 1201, 3, 153, 3, 153, 3, 153, 3, 153, 3, 154, 3, 154, 3, 154, 3, 154, 3, 155, 3, 155, 3, 155, 3, 155, 3, 156, 3, 156, 3, 157, 3, 157, 3, 158, 3, 158, 3, 159, 3, 159, 3, 160, 3, 160, 3, 161, 3, 161, 3, 162, 3, 162, 3, 163, 3, 163, 3, 164, 3, 164, 3, 165, 3, 165, 3, 166, 3, 166, 3, 167, 3, 167, 3, 168, 3, 168, 3, 169, 3, 169, 3, 170, 3, 170, 3, 171, 3, 171, 3, 172, 3, 172, 3, 173, 3, 173, 3, 174, 3, 174, 3, 175, 3, 175, 3, 176, 3, 176, 3, 177, 3, 177, 3, 178, 3, 178, 3, 179, 3, 179, 3, 180, 3, 180, 3, 181, 3, 181, 4, 557, 648, 2, 2, 182, 13, 2, 3, 15, 2, 4, 17, 2, 5, 19, 2, 6, 21, 2, 7, 23, 2, 8, 25, 2, 9, 27, 2, 10, 29, 2, 11, 31, 2, 12, 33, 2, 13, 35, 2, 14, 37, 2, 15, 39, 2, 16, 41, 2, 17, 43, 2, 18, 45, 2, 19, 47, 2, 20, 49, 2, 21, 51, 2, 22, 53, 2, 23, 55, 2, 24, 57, 2, 2, 59, 2, 2, 61, 2, 25, 63, 2, 26, 65, 2, 27, 67, 2, 28, 69, 2, 2, 71, 2, 2, 73, 2, 2, 75, 2, 2, 77, 2, 2, 79, 2, 2, 81, 2, 2, 83, 2, 2, 85, 2, 2, 87, 2, 2, 89, 2, 29, 91, 2, 30, 93, 2, 31, 95, 2, 32, 97, 2, 33, 99, 2, 34, 101, 2, 35, 103, 2, 36, 105, 2, 37, 107, 2, 38, 109, 2, 39, 111, 2, 40, 113, 2, 41, 115, 2, 42, 117, 2, 43, 119, 2, 44, 121, 2, 45, 123, 2, 46, 125, 2, 47, 127, 2, 48, 129, 2, 49, 131, 2, 50, 133, 2, 51, 135, 2, 52, 137, 2, 53, 139, 2, 54, 141, 2, 55, 143, 2, 56, 145, 2, 57, 147, 2, 58, 149, 2, 59, 151, 2, 60, 153, 2, 61, 155, 2, 62, 157, 2, 63, 159, 2, 64, 161, 2, 65, 163, 2, 66, 165, 2, 67, 167, 2, 68, 169, 2, 69, 171, 2, 70, 173, 2, 71, 175, 2, 72, 177, 2, 2, 179, 2, 2, 181, 2, 2, 183, 2, 2, 185, 2, 2, 187, 2, 73, 189, 2, 2, 191, 2, 74, 193, 2, 2, 195, 2, 75, 197, 2, 76, 199, 2, 77, 201, 2, 2, 203, 2, 2, 205, 2, 2, 207, 2, 2, 209, 2, 78, 211, 2, 2, 213, 2, 2, 215, 2, 79, 217, 2, 80, 219, 2, 81, 221, 2, 2, 223, 2, 2, 225, 2, 2, 227, 2, 2, 229, 2, 82, 231, 2, 2, 233, 2, 2, 235, 2, 83, 237, 2, 84, 239, 2, 85, 241, 2, 2, 243, 2, 2, 245, 2, 86, 247, 2, 87, 249, 2, 2, 251, 2, 88, 253, 2, 2, 255, 2, 2, 257, 2, 89, 259, 2, 90, 261, 2, 91, 263, 2, 2, 265, 2, 2, 267, 2, 2, 269, 2, 2, 271, 2, 2, 273, 2, 2, 275, 2, 2, 277, 2, 92, 279, 2, 93, 281, 2, 94, 283, 2, 2, 285, 2, 2, 287, 2, 2, 289, 2, 2, 291, 2, 95, 293, 2, 96, 295, 2, 97, 297, 2, 2, 299, 2, 98, 301, 2, 99, 303, 2, 100, 305, 2, 101, 307, 2, 102, 309, 2, 2, 311, 2, 103, 313, 2, 104, 315, 2, 105, 317, 2, 106, 319, 2, 107, 321, 2, 2, 323, 2, 2, 325, 2, 2, 327, 2, 2, 329, 2, 2, 331, 2, 2, 333, 2, 2, 335, 2, 2, 337, 2, 2, 339, 2, 2, 341, 2, 2, 343, 2, 2, 345, 2, 2, 347, 2, 2, 349, 2, 2, 351, 2, 2, 353, 2, 2, 355, 2, 2, 357, 2, 2, 359, 2, 2, 361, 2, 2, 363, 2, 2, 365, 2, 2, 367, 2, 2, 369, 2, 2, 371, 2, 2, 13, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 40, 8, 2, 11, 12, 15, 15, 34, 34, 49, 49, 93, 93, 95, 95, 4, 2, 12, 12, 15, 15, 5, 2, 11, 12, 15, 15, 34, 34, 3, 2, 50, 59, 4, 2, 67, 92, 99, 124, 7, 2, 36, 36, 94, 94, 112, 112, 116, 116, 118, 118, 6, 2, 12, 12, 15, 15, 36, 36, 94, 94, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 3, 2, 98, 98, 12, 2, 11, 12, 15, 15, 34, 34, 46, 46, 49, 49, 63, 63, 93, 93, 95, 95, 98, 98, 126, 126, 4, 2, 44, 44, 49, 49, 13, 2, 11, 12, 15, 15, 34, 34, 36, 37, 46, 46, 49, 49, 60, 60, 62, 62, 64, 65, 94, 94, 126, 126, 4, 2, 67, 67, 99, 99, 4, 2, 68, 68, 100, 100, 4, 2, 69, 69, 101, 101, 4, 2, 70, 70, 102, 102, 4, 2, 72, 72, 104, 104, 4, 2, 73, 73, 105, 105, 4, 2, 74, 74, 106, 106, 4, 2, 75, 75, 107, 107, 4, 2, 76, 76, 108, 108, 4, 2, 77, 77, 109, 109, 4, 2, 78, 78, 110, 110, 4, 2, 79, 79, 111, 111, 4, 2, 80, 80, 112, 112, 4, 2, 81, 81, 113, 113, 4, 2, 82, 82, 114, 114, 4, 2, 83, 83, 115, 115, 4, 2, 84, 84, 116, 116, 4, 2, 85, 85, 117, 117, 4, 2, 86, 86, 118, 118, 4, 2, 87, 87, 119, 119, 4, 2, 88, 88, 120, 120, 4, 2, 89, 89, 121, 121, 4, 2, 90, 90, 122, 122, 4, 2, 91, 91, 123, 123, 4, 2, 92, 92, 124, 124, 2, 1268, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 3, 57, 3, 2, 2, 2, 3, 59, 3, 2, 2, 2, 3, 61, 3, 2, 2, 2, 3, 63, 3, 2, 2, 2, 3, 65, 3, 2, 2, 2, 4, 67, 3, 2, 2, 2, 4, 89, 3, 2, 2, 2, 4, 91, 3, 2, 2, 2, 4, 93, 3, 2, 2, 2, 4, 95, 3, 2, 2, 2, 4, 97, 3, 2, 2, 2, 4, 99, 3, 2, 2, 2, 4, 101, 3, 2, 2, 2, 4, 103, 3, 2, 2, 2, 4, 105, 3, 2, 2, 2, 4, 107, 3, 2, 2, 2, 4, 109, 3, 2, 2, 2, 4, 111, 3, 2, 2, 2, 4, 113, 3, 2, 2, 2, 4, 115, 3, 2, 2, 2, 4, 117, 3, 2, 2, 2, 4, 119, 3, 2, 2, 2, 4, 121, 3, 2, 2, 2, 4, 123, 3, 2, 2, 2, 4, 125, 3, 2, 2, 2, 4, 127, 3, 2, 2, 2, 4, 129, 3, 2, 2, 2, 4, 131, 3, 2, 2, 2, 4, 133, 3, 2, 2, 2, 4, 135, 3, 2, 2, 2, 4, 137, 3, 2, 2, 2, 4, 139, 3, 2, 2, 2, 4, 141, 3, 2, 2, 2, 4, 143, 3, 2, 2, 2, 4, 145, 3, 2, 2, 2, 4, 147, 3, 2, 2, 2, 4, 149, 3, 2, 2, 2, 4, 151, 3, 2, 2, 2, 4, 153, 3, 2, 2, 2, 4, 155, 3, 2, 2, 2, 4, 157, 3, 2, 2, 2, 4, 159, 3, 2, 2, 2, 4, 161, 3, 2, 2, 2, 4, 163, 3, 2, 2, 2, 4, 165, 3, 2, 2, 2, 4, 167, 3, 2, 2, 2, 4, 169, 3, 2, 2, 2, 4, 171, 3, 2, 2, 2, 4, 173, 3, 2, 2, 2, 4, 175, 3, 2, 2, 2, 5, 177, 3, 2, 2, 2, 5, 179, 3, 2, 2, 2, 5, 181, 3, 2, 2, 2, 5, 183, 3, 2, 2, 2, 5, 185, 3, 2, 2, 2, 5, 187, 3, 2, 2, 2, 5, 191, 3, 2, 2, 2, 5, 193, 3, 2, 2, 2, 5, 195, 3, 2, 2, 2, 5, 197, 3, 2, 2, 2, 5, 199, 3, 2, 2, 2, 6, 201, 3, 2, 2, 2, 6, 203, 3, 2, 2, 2, 6, 205, 3, 2, 2, 2, 6, 209, 3, 2, 2, 2, 6, 211, 3, 2, 2, 2, 6, 213, 3, 2, 2, 2, 6, 215, 3, 2, 2, 2, 6, 217, 3, 2, 2, 2, 6, 219, 3, 2, 2, 2, 7, 221, 3, 2, 2, 2, 7, 223, 3, 2, 2, 2, 7, 225, 3, 2, 2, 2, 7, 227, 3, 2, 2, 2, 7, 229, 3, 2, 2, 2, 7, 231, 3, 2, 2, 2, 7, 233, 3, 2, 2, 2, 7, 235, 3, 2, 2, 2, 7, 237, 3, 2, 2, 2, 7, 239, 3, 2, 2, 2, 8, 241, 3, 2, 2, 2, 8, 243, 3, 2, 2, 2, 8, 245, 3, 2, 2, 2, 8, 247, 3, 2, 2, 2, 8, 251, 3, 2, 2, 2, 8, 253, 3, 2, 2, 2, 8, 255, 3, 2, 2, 2, 8, 257, 3, 2, 2, 2, 8, 259, 3, 2, 2, 2, 8, 261, 3, 2, 2, 2, 9, 263, 3, 2, 2, 2, 9, 265, 3, 2, 2, 2, 9, 267, 3, 2, 2, 2, 9, 269, 3, 2, 2, 2, 9, 271, 3, 2, 2, 2, 9, 273, 3, 2, 2, 2, 9, 275, 3, 2, 2, 2, 9, 277, 3, 2, 2, 2, 9, 279, 3, 2, 2, 2, 9, 281, 3, 2, 2, 2, 10, 283, 3, 2, 2, 2, 10, 285, 3, 2, 2, 2, 10, 287, 3, 2, 2, 2, 10, 289, 3, 2, 2, 2, 10, 291, 3, 2, 2, 2, 10, 293, 3, 2, 2, 2, 10, 295, 3, 2, 2, 2, 11, 297, 3, 2, 2, 2, 11, 299, 3, 2, 2, 2, 11, 301, 3, 2, 2, 2, 11, 303, 3, 2, 2, 2, 11, 305, 3, 2, 2, 2, 11, 307, 3, 2, 2, 2, 12, 309, 3, 2, 2, 2, 12, 311, 3, 2, 2, 2, 12, 313, 3, 2, 2, 2, 12, 315, 3, 2, 2, 2, 12, 317, 3, 2, 2, 2, 12, 319, 3, 2, 2, 2, 13, 373, 3, 2, 2, 2, 15, 383, 3, 2, 2, 2, 17, 390, 3, 2, 2, 2, 19, 399, 3, 2, 2, 2, 21, 406, 3, 2, 2, 2, 23, 416, 3, 2, 2, 2, 25, 423, 3, 2, 2, 2, 27, 430, 3, 2, 2, 2, 29, 444, 3, 2, 2, 2, 31, 451, 3, 2, 2, 2, 33, 459, 3, 2, 2, 2, 35, 471, 3, 2, 2, 2, 37, 481, 3, 2, 2, 2, 39, 490, 3, 2, 2, 2, 41, 496, 3, 2, 2, 2, 43, 503, 3, 2, 2, 2, 45, 510, 3, 2, 2, 2, 47, 518, 3, 2, 2, 2, 49, 527, 3, 2, 2, 2, 51, 533, 3, 2, 2, 2, 53, 550, 3, 2, 2, 2, 55, 566, 3, 2, 2, 2, 57, 572, 3, 2, 2, 2, 59, 577, 3, 2, 2, 2, 61, 582, 3, 2, 2, 2, 63, 586, 3, 2, 2, 2, 65, 590, 3, 2, 2, 2, 67, 594, 3, 2, 2, 2, 69, 598, 3, 2, 2, 2, 71, 600, 3, 2, 2, 2, 73, 602, 3, 2, 2, 2, 75, 605, 3, 2, 2, 2, 77, 607, 3, 2, 2, 2, 79, 616, 3, 2, 2, 2, 81, 618, 3, 2, 2, 2, 83, 623, 3, 2, 2, 2, 85, 625, 3, 2, 2, 2, 87, 630, 3, 2, 2, 2, 89, 661, 3, 2, 2, 2, 91, 664, 3, 2, 2, 2, 93, 710, 3, 2, 2, 2, 95, 712, 3, 2, 2, 2, 97, 715, 3, 2, 2, 2, 99, 719, 3, 2, 2, 2, 101, 723, 3, 2, 2, 2, 103, 725, 3, 2, 2, 2, 105, 727, 3, 2, 2, 2, 107, 732, 3, 2, 2, 2, 109, 734, 3, 2, 2, 2, 111, 740, 3, 2, 2, 2, 113, 746, 3, 2, 2, 2, 115, 751, 3, 2, 2, 2, 117, 753, 3, 2, 2, 2, 119, 756, 3, 2, 2, 2, 121, 759, 3, 2, 2, 2, 123, 764, 3, 2, 2, 2, 125, 768, 3, 2, 2, 2, 127, 773, 3, 2, 2, 2, 129, 779, 3, 2, 2, 2, 131, 782, 3, 2, 2, 2, 133, 784, 3, 2, 2, 2, 135, 790, 3, 2, 2, 2, 137, 792, 3, 2, 2, 2, 139, 797, 3, 2, 2, 2, 141, 800, 3, 2, 2, 2, 143, 803, 3, 2, 2, 2, 145, 806, 3, 2, 2, 2, 147, 808, 3, 2, 2, 2, 149, 811, 3, 2, 2, 2, 151, 813, 3, 2, 2, 2, 153, 816, 3, 2, 2, 2, 155, 818, 3, 2, 2, 2, 157, 820, 3, 2, 2, 2, 159, 822, 3, 2, 2, 2, 161, 824, 3, 2, 2, 2, 163, 826, 3, 2, 2, 2, 165, 831, 3, 2, 2, 2, 167, 852, 3, 2, 2, 2, 169, 854, 3, 2, 2, 2, 171, 862, 3, 2, 2, 2, 173, 866, 3, 2, 2, 2, 175, 870, 3, 2, 2, 2, 177, 874, 3, 2, 2, 2, 179, 879, 3, 2, 2, 2, 181, 883, 3, 2, 2, 2, 183, 887, 3, 2, 2, 2, 185, 891, 3, 2, 2, 2, 187, 895, 3, 2, 2, 2, 189, 907, 3, 2, 2, 2, 191, 910, 3, 2, 2, 2, 193, 914, 3, 2, 2, 2, 195, 918, 3, 2, 2, 2, 197, 922, 3, 2, 2, 2, 199, 926, 3, 2, 2, 2, 201, 930, 3, 2, 2, 2, 203, 935, 3, 2, 2, 2, 205, 939, 3, 2, 2, 2, 207, 947, 3, 2, 2, 2, 209, 968, 3, 2, 2, 2, 211, 970, 3, 2, 2, 2, 213, 974, 3, 2, 2, 2, 215, 978, 3, 2, 2, 2, 217, 982, 3, 2, 2, 2, 219, 986, 3, 2, 2, 2, 221, 990, 3, 2, 2, 2, 223, 995, 3, 2, 2, 2, 225, 999, 3, 2, 2, 2, 227, 1003, 3, 2, 2, 2, 229, 1007, 3, 2, 2, 2, 231, 1010, 3, 2, 2, 2, 233, 1014, 3, 2, 2, 2, 235, 1018, 3, 2, 2, 2, 237, 1022, 3, 2, 2, 2, 239, 1026, 3, 2, 2, 2, 241, 1030, 3, 2, 2, 2, 243, 1035, 3, 2, 2, 2, 245, 1040, 3, 2, 2, 2, 247, 1045, 3, 2, 2, 2, 249, 1052, 3, 2, 2, 2, 251, 1056, 3, 2, 2, 2, 253, 1064, 3, 2, 2, 2, 255, 1068, 3, 2, 2, 2, 257, 1072, 3, 2, 2, 2, 259, 1076, 3, 2, 2, 2, 261, 1080, 3, 2, 2, 2, 263, 1084, 3, 2, 2, 2, 265, 1090, 3, 2, 2, 2, 267, 1094, 3, 2, 2, 2, 269, 1098, 3, 2, 2, 2, 271, 1102, 3, 2, 2, 2, 273, 1106, 3, 2, 2, 2, 275, 1110, 3, 2, 2, 2, 277, 1114, 3, 2, 2, 2, 279, 1118, 3, 2, 2, 2, 281, 1122, 3, 2, 2, 2, 283, 1126, 3, 2, 2, 2, 285, 1131, 3, 2, 2, 2, 287, 1135, 3, 2, 2, 2, 289, 1139, 3, 2, 2, 2, 291, 1143, 3, 2, 2, 2, 293, 1147, 3, 2, 2, 2, 295, 1151, 3, 2, 2, 2, 297, 1155, 3, 2, 2, 2, 299, 1160, 3, 2, 2, 2, 301, 1165, 3, 2, 2, 2, 303, 1175, 3, 2, 2, 2, 305, 1179, 3, 2, 2, 2, 307, 1183, 3, 2, 2, 2, 309, 1187, 3, 2, 2, 2, 311, 1192, 3, 2, 2, 2, 313, 1199, 3, 2, 2, 2, 315, 1203, 3, 2, 2, 2, 317, 1207, 3, 2, 2, 2, 319, 1211, 3, 2, 2, 2, 321, 1215, 3, 2, 2, 2, 323, 1217, 3, 2, 2, 2, 325, 1219, 3, 2, 2, 2, 327, 1221, 3, 2, 2, 2, 329, 1223, 3, 2, 2, 2, 331, 1225, 3, 2, 2, 2, 333, 1227, 3, 2, 2, 2, 335, 1229, 3, 2, 2, 2, 337, 1231, 3, 2, 2, 2, 339, 1233, 3, 2, 2, 2, 341, 1235, 3, 2, 2, 2, 343, 1237, 3, 2, 2, 2, 345, 1239, 3, 2, 2, 2, 347, 1241, 3, 2, 2, 2, 349, 1243, 3, 2, 2, 2, 351, 1245, 3, 2, 2, 2, 353, 1247, 3, 2, 2, 2, 355, 1249, 3, 2, 2, 2, 357, 1251, 3, 2, 2, 2, 359, 1253, 3, 2, 2, 2, 361, 1255, 3, 2, 2, 2, 363, 1257, 3, 2, 2, 2, 365, 1259, 3, 2, 2, 2, 367, 1261, 3, 2, 2, 2, 369, 1263, 3, 2, 2, 2, 371, 1265, 3, 2, 2, 2, 373, 374, 5, 327, 159, 2, 374, 375, 5, 337, 164, 2, 375, 376, 5, 357, 174, 2, 376, 377, 5, 357, 174, 2, 377, 378, 5, 329, 160, 2, 378, 379, 5, 325, 158, 2, 379, 380, 5, 359, 175, 2, 380, 381, 3, 2, 2, 2, 381, 382, 8, 2, 2, 2, 382, 14, 3, 2, 2, 2, 383, 384, 5, 327, 159, 2, 384, 385, 5, 355, 173, 2, 385, 386, 5, 349, 170, 2, 386, 387, 5, 351, 171, 2, 387, 388, 3, 2, 2, 2, 388, 389, 8, 3, 3, 2, 389, 16, 3, 2, 2, 2, 390, 391, 5, 329, 160, 2, 391, 392, 5, 347, 169, 2, 392, 393, 5, 355, 173, 2, 393, 394, 5, 337, 164, 2, 394, 395, 5, 325, 158, 2, 395, 396, 5, 335, 163, 2, 396, 397, 3, 2, 2, 2, 397, 398, 8, 4, 4, 2, 398, 18, 3, 2, 2, 2, 399, 400, 5, 329, 160, 2, 400, 401, 5, 363, 177, 2, 401, 402, 5, 321, 156, 2, 402, 403, 5, 343, 167, 2, 403, 404, 3, 2, 2, 2, 404, 405, 8, 5, 2, 2, 405, 20, 3, 2, 2, 2, 406, 407, 5, 329, 160, 2, 407, 408, 5, 367, 179, 2, 408, 409, 5, 351, 171, 2, 409, 410, 5, 343, 167, 2, 410, 411, 5, 321, 156, 2, 411, 412, 5, 337, 164, 2, 412, 413, 5, 347, 169, 2, 413, 414, 3, 2, 2, 2, 414, 415, 8, 6, 5, 2, 415, 22, 3, 2, 2, 2, 416, 417, 5, 331, 161, 2, 417, 418, 5, 355, 173, 2, 418, 419, 5, 349, 170, 2, 419, 420, 5, 345, 168, 2, 420, 421, 3, 2, 2, 2, 421, 422, 8, 7, 6, 2, 422, 24, 3, 2, 2, 2, 423, 424, 5, 333, 162, 2, 424, 425, 5, 355, 173, 2, 425, 426, 5, 349, 170, 2, 426, 427, 5, 341, 166, 2, 427, 428, 3, 2, 2, 2, 428, 429, 8, 8, 2, 2, 429, 26, 3, 2, 2, 2, 430, 431, 5, 337, 164, 2, 431, 432, 5, 347, 169, 2, 432, 433, 5, 343, 167, 2, 433, 434, 5, 337, 164, 2, 434, 435, 5, 347, 169, 2, 435, 436, 5, 329, 160, 2, 436, 437, 5, 357, 174, 2, 437, 438, 5, 359, 175, 2, 438, 439, 5, 321, 156, 2, 439, 440, 5, 359, 175, 2, 440, 441, 5, 357, 174, 2, 441, 442, 3, 2, 2, 2, 442, 443, 8, 9, 2, 2, 443, 28, 3, 2, 2, 2, 444, 445, 5, 341, 166, 2, 445, 446, 5, 329, 160, 2, 446, 447, 5, 329, 160, 2, 447, 448, 5, 351, 171, 2, 448, 449, 3, 2, 2, 2, 449, 450, 8, 10, 3, 2, 450, 30, 3, 2, 2, 2, 451, 452, 5, 343, 167, 2, 452, 453, 5, 337, 164, 2, 453, 454, 5, 345, 168, 2, 454, 455, 5, 337, 164, 2, 455, 456, 5, 359, 175, 2, 456, 457, 3, 2, 2, 2, 457, 458, 8, 11, 2, 2, 458, 32, 3, 2, 2, 2, 459, 460, 5, 345, 168, 2, 460, 461, 5, 363, 177, 2, 461, 462, 5, 85, 38, 2, 462, 463, 5, 329, 160, 2, 463, 464, 5, 367, 179, 2, 464, 465, 5, 351, 171, 2, 465, 466, 5, 321, 156, 2, 466, 467, 5, 347, 169, 2, 467, 468, 5, 327, 159, 2, 468, 469, 3, 2, 2, 2, 469, 470, 8, 12, 7, 2, 470, 34, 3, 2, 2, 2, 471, 472, 5, 351, 171, 2, 472, 473, 5, 355, 173, 2, 473, 474, 5, 349, 170, 2, 474, 475, 5, 339, 165, 2, 475, 476, 5, 329, 160, 2, 476, 477, 5, 325, 158, 2, 477, 478, 5, 359, 175, 2, 478, 479, 3, 2, 2, 2, 479, 480, 8, 13, 3, 2, 480, 36, 3, 2, 2, 2, 481, 482, 5, 355, 173, 2, 482, 483, 5, 329, 160, 2, 483, 484, 5, 347, 169, 2, 484, 485, 5, 321, 156, 2, 485, 486, 5, 345, 168, 2, 486, 487, 5, 329, 160, 2, 487, 488, 3, 2, 2, 2, 488, 489, 8, 14, 8, 2, 489, 38, 3, 2, 2, 2, 490, 491, 5, 355, 173, 2, 491, 492, 5, 349, 170, 2, 492, 493, 5, 365, 178, 2, 493, 494, 3, 2, 2, 2, 494, 495, 8, 15, 2, 2, 495, 40, 3, 2, 2, 2, 496, 497, 5, 357, 174, 2, 497, 498, 5, 335, 163, 2, 498, 499, 5, 349, 170, 2, 499, 500, 5, 365, 178, 2, 500, 501, 3, 2, 2, 2, 501, 502, 8, 16, 9, 2, 502, 42, 3, 2, 2, 2, 503, 504, 5, 357, 174, 2, 504, 505, 5, 349, 170, 2, 505, 506, 5, 355, 173, 2, 506, 507, 5, 359, 175, 2, 507, 508, 3, 2, 2, 2, 508, 509, 8, 17, 2, 2, 509, 44, 3, 2, 2, 2, 510, 511, 5, 357, 174, 2, 511, 512, 5, 359, 175, 2, 512, 513, 5, 321, 156, 2, 513, 514, 5, 359, 175, 2, 514, 515, 5, 357, 174, 2, 515, 516, 3, 2, 2, 2, 516, 517, 8, 18, 2, 2, 517, 46, 3, 2, 2, 2, 518, 519, 5, 365, 178, 2, 519, 520, 5, 335, 163, 2, 520, 521, 5, 329, 160, 2, 521, 522, 5, 355, 173, 2, 522, 523, 5, 329, 160, 2, 523, 524, 3, 2, 2, 2, 524, 525, 8, 19, 2, 2, 525, 48, 3, 2, 2, 2, 526, 528, 10, 2, 2, 2, 527, 526, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 531, 3, 2, 2, 2, 531, 532, 8, 20, 2, 2, 532, 50, 3, 2, 2, 2, 533, 534, 7, 49, 2, 2, 534, 535, 7, 49, 2, 2, 535, 539, 3, 2, 2, 2, 536, 538, 10, 3, 2, 2, 537, 536, 3, 2, 2, 2, 538, 541, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 539, 540, 3, 2, 2, 2, 540, 543, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 542, 544, 7, 15, 2, 2, 543, 542, 3, 2, 2, 2, 543, 544, 3, 2, 2, 2, 544, 546, 3, 2, 2, 2, 545, 547, 7, 12, 2, 2, 546, 545, 3, 2, 2, 2, 546, 547, 3, 2, 2, 2, 547, 548, 3, 2, 2, 2, 548, 549, 8, 21, 10, 2, 549, 52, 3, 2, 2, 2, 550, 551, 7, 49, 2, 2, 551, 552, 7, 44, 2, 2, 552, 557, 3, 2, 2, 2, 553, 556, 5, 53, 22, 2, 554, 556, 11, 2, 2, 2, 555, 553, 3, 2, 2, 2, 555, 554, 3, 2, 2, 2, 556, 559, 3, 2, 2, 2, 557, 558, 3, 2, 2, 2, 557, 555, 3, 2, 2, 2, 558, 560, 3, 2, 2, 2, 559, 557, 3, 2, 2, 2, 560, 561, 7, 44, 2, 2, 561, 562, 7, 49, 2, 2, 562, 563, 3, 2, 2, 2, 563, 564, 8, 22, 10, 2, 564, 54, 3, 2, 2, 2, 565, 567, 9, 4, 2, 2, 566, 565, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 566, 3, 2, 2, 2, 568, 569, 3, 2, 2, 2, 569, 570, 3, 2, 2, 2, 570, 571, 8, 23, 10, 2, 571, 56, 3, 2, 2, 2, 572, 573, 5, 163, 77, 2, 573, 574, 3, 2, 2, 2, 574, 575, 8, 24, 11, 2, 575, 576, 8, 24, 12, 2, 576, 58, 3, 2, 2, 2, 577, 578, 5, 67, 29, 2, 578, 579, 3, 2, 2, 2, 579, 580, 8, 25, 13, 2, 580, 581, 8, 25, 14, 2, 581, 60, 3, 2, 2, 2, 582, 583, 5, 55, 23, 2, 583, 584, 3, 2, 2, 2, 584, 585, 8, 26, 10, 2, 585, 62, 3, 2, 2, 2, 586, 587, 5, 51, 21, 2, 587, 588, 3, 2, 2, 2, 588, 589, 8, 27, 10, 2, 589, 64, 3, 2, 2, 2, 590, 591, 5, 53, 22, 2, 591, 592, 3, 2, 2, 2, 592, 593, 8, 28, 10, 2, 593, 66, 3, 2, 2, 2, 594, 595, 7, 126, 2, 2, 595, 596, 3, 2, 2, 2, 596, 597, 8, 29, 14, 2, 597, 68, 3, 2, 2, 2, 598, 599, 9, 5, 2, 2, 599, 70, 3, 2, 2, 2, 600, 601, 9, 6, 2, 2, 601, 72, 3, 2, 2, 2, 602, 603, 7, 94, 2, 2, 603, 604, 9, 7, 2, 2, 604, 74, 3, 2, 2, 2, 605, 606, 10, 8, 2, 2, 606, 76, 3, 2, 2, 2, 607, 609, 9, 9, 2, 2, 608, 610, 9, 10, 2, 2, 609, 608, 3, 2, 2, 2, 609, 610, 3, 2, 2, 2, 610, 612, 3, 2, 2, 2, 611, 613, 5, 69, 30, 2, 612, 611, 3, 2, 2, 2, 613, 614, 3, 2, 2, 2, 614, 612, 3, 2, 2, 2, 614, 615, 3, 2, 2, 2, 615, 78, 3, 2, 2, 2, 616, 617, 7, 66, 2, 2, 617, 80, 3, 2, 2, 2, 618, 619, 7, 98, 2, 2, 619, 82, 3, 2, 2, 2, 620, 624, 10, 11, 2, 2, 621, 622, 7, 98, 2, 2, 622, 624, 7, 98, 2, 2, 623, 620, 3, 2, 2, 2, 623, 621, 3, 2, 2, 2, 624, 84, 3, 2, 2, 2, 625, 626, 7, 97, 2, 2, 626, 86, 3, 2, 2, 2, 627, 631, 5, 71, 31, 2, 628, 631, 5, 69, 30, 2, 629, 631, 5, 85, 38, 2, 630, 627, 3, 2, 2, 2, 630, 628, 3, 2, 2, 2, 630, 629, 3, 2, 2, 2, 631, 88, 3, 2, 2, 2, 632, 637, 7, 36, 2, 2, 633, 636, 5, 73, 32, 2, 634, 636, 5, 75, 33, 2, 635, 633, 3, 2, 2, 2, 635, 634, 3, 2, 2, 2, 636, 639, 3, 2, 2, 2, 637, 635, 3, 2, 2, 2, 637, 638, 3, 2, 2, 2, 638, 640, 3, 2, 2, 2, 639, 637, 3, 2, 2, 2, 640, 662, 7, 36, 2, 2, 641, 642, 7, 36, 2, 2, 642, 643, 7, 36, 2, 2, 643, 644, 7, 36, 2, 2, 644, 648, 3, 2, 2, 2, 645, 647, 10, 3, 2, 2, 646, 645, 3, 2, 2, 2, 647, 650, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 648, 646, 3, 2, 2, 2, 649, 651, 3, 2, 2, 2, 650, 648, 3, 2, 2, 2, 651, 652, 7, 36, 2, 2, 652, 653, 7, 36, 2, 2, 653, 654, 7, 36, 2, 2, 654, 656, 3, 2, 2, 2, 655, 657, 7, 36, 2, 2, 656, 655, 3, 2, 2, 2, 656, 657, 3, 2, 2, 2, 657, 659, 3, 2, 2, 2, 658, 660, 7, 36, 2, 2, 659, 658, 3, 2, 2, 2, 659, 660, 3, 2, 2, 2, 660, 662, 3, 2, 2, 2, 661, 632, 3, 2, 2, 2, 661, 641, 3, 2, 2, 2, 662, 90, 3, 2, 2, 2, 663, 665, 5, 69, 30, 2, 664, 663, 3, 2, 2, 2, 665, 666, 3, 2, 2, 2, 666, 664, 3, 2, 2, 2, 666, 667, 3, 2, 2, 2, 667, 92, 3, 2, 2, 2, 668, 670, 5, 69, 30, 2, 669, 668, 3, 2, 2, 2, 670, 671, 3, 2, 2, 2, 671, 669, 3, 2, 2, 2, 671, 672, 3, 2, 2, 2, 672, 673, 3, 2, 2, 2, 673, 677, 5, 107, 49, 2, 674, 676, 5, 69, 30, 2, 675, 674, 3, 2, 2, 2, 676, 679, 3, 2, 2, 2, 677, 675, 3, 2, 2, 2, 677, 678, 3, 2, 2, 2, 678, 711, 3, 2, 2, 2, 679, 677, 3, 2, 2, 2, 680, 682, 5, 107, 49, 2, 681, 683, 5, 69, 30, 2, 682, 681, 3, 2, 2, 2, 683, 684, 3, 2, 2, 2, 684, 682, 3, 2, 2, 2, 684, 685, 3, 2, 2, 2, 685, 711, 3, 2, 2, 2, 686, 688, 5, 69, 30, 2, 687, 686, 3, 2, 2, 2, 688, 689, 3, 2, 2, 2, 689, 687, 3, 2, 2, 2, 689, 690, 3, 2, 2, 2, 690, 698, 3, 2, 2, 2, 691, 695, 5, 107, 49, 2, 692, 694, 5, 69, 30, 2, 693, 692, 3, 2, 2, 2, 694, 697, 3, 2, 2, 2, 695, 693, 3, 2, 2, 2, 695, 696, 3, 2, 2, 2, 696, 699, 3, 2, 2, 2, 697, 695, 3, 2, 2, 2, 698, 691, 3, 2, 2, 2, 698, 699, 3, 2, 2, 2, 699, 700, 3, 2, 2, 2, 700, 701, 5, 77, 34, 2, 701, 711, 3, 2, 2, 2, 702, 704, 5, 107, 49, 2, 703, 705, 5, 69, 30, 2, 704, 703, 3, 2, 2, 2, 705, 706, 3, 2, 2, 2, 706, 704, 3, 2, 2, 2, 706, 707, 3, 2, 2, 2, 707, 708, 3, 2, 2, 2, 708, 709, 5, 77, 34, 2, 709, 711, 3, 2, 2, 2, 710, 669, 3, 2, 2, 2, 710, 680, 3, 2, 2, 2, 710, 687, 3, 2, 2, 2, 710, 702, 3, 2, 2, 2, 711, 94, 3, 2, 2, 2, 712, 713, 5, 323, 157, 2, 713, 714, 5, 369, 180, 2, 714, 96, 3, 2, 2, 2, 715, 716, 5, 321, 156, 2, 716, 717, 5, 347, 169, 2, 717, 718, 5, 327, 159, 2, 718, 98, 3, 2, 2, 2, 719, 720, 5, 321, 156, 2, 720, 721, 5, 357, 174, 2, 721, 722, 5, 325, 158, 2, 722, 100, 3, 2, 2, 2, 723, 724, 7, 63, 2, 2, 724, 102, 3, 2, 2, 2, 725, 726, 7, 46, 2, 2, 726, 104, 3, 2, 2, 2, 727, 728, 5, 327, 159, 2, 728, 729, 5, 329, 160, 2, 729, 730, 5, 357, 174, 2, 730, 731, 5, 325, 158, 2, 731, 106, 3, 2, 2, 2, 732, 733, 7, 48, 2, 2, 733, 108, 3, 2, 2, 2, 734, 735, 5, 331, 161, 2, 735, 736, 5, 321, 156, 2, 736, 737, 5, 343, 167, 2, 737, 738, 5, 357, 174, 2, 738, 739, 5, 329, 160, 2, 739, 110, 3, 2, 2, 2, 740, 741, 5, 331, 161, 2, 741, 742, 5, 337, 164, 2, 742, 743, 5, 355, 173, 2, 743, 744, 5, 357, 174, 2, 744, 745, 5, 359, 175, 2, 745, 112, 3, 2, 2, 2, 746, 747, 5, 343, 167, 2, 747, 748, 5, 321, 156, 2, 748, 749, 5, 357, 174, 2, 749, 750, 5, 359, 175, 2, 750, 114, 3, 2, 2, 2, 751, 752, 7, 42, 2, 2, 752, 116, 3, 2, 2, 2, 753, 754, 5, 337, 164, 2, 754, 755, 5, 347, 169, 2, 755, 118, 3, 2, 2, 2, 756, 757, 5, 337, 164, 2, 757, 758, 5, 357, 174, 2, 758, 120, 3, 2, 2, 2, 759, 760, 5, 343, 167, 2, 760, 761, 5, 337, 164, 2, 761, 762, 5, 341, 166, 2, 762, 763, 5, 329, 160, 2, 763, 122, 3, 2, 2, 2, 764, 765, 5, 347, 169, 2, 765, 766, 5, 349, 170, 2, 766, 767, 5, 359, 175, 2, 767, 124, 3, 2, 2, 2, 768, 769, 5, 347, 169, 2, 769, 770, 5, 361, 176, 2, 770, 771, 5, 343, 167, 2, 771, 772, 5, 343, 167, 2, 772, 126, 3, 2, 2, 2, 773, 774, 5, 347, 169, 2, 774, 775, 5, 361, 176, 2, 775, 776, 5, 343, 167, 2, 776, 777, 5, 343, 167, 2, 777, 778, 5, 357, 174, 2, 778, 128, 3, 2, 2, 2, 779, 780, 5, 349, 170, 2, 780, 781, 5, 355, 173, 2, 781, 130, 3, 2, 2, 2, 782, 783, 7, 65, 2, 2, 783, 132, 3, 2, 2, 2, 784, 785, 5, 355, 173, 2, 785, 786, 5, 343, 167, 2, 786, 787, 5, 337, 164, 2, 787, 788, 5, 341, 166, 2, 788, 789, 5, 329, 160, 2, 789, 134, 3, 2, 2, 2, 790, 791, 7, 43, 2, 2, 791, 136, 3, 2, 2, 2, 792, 793, 5, 359, 175, 2, 793, 794, 5, 355, 173, 2, 794, 795, 5, 361, 176, 2, 795, 796, 5, 329, 160, 2, 796, 138, 3, 2, 2, 2, 797, 798, 7, 63, 2, 2, 798, 799, 7, 63, 2, 2, 799, 140, 3, 2, 2, 2, 800, 801, 7, 63, 2, 2, 801, 802, 7, 128, 2, 2, 802, 142, 3, 2, 2, 2, 803, 804, 7, 35, 2, 2, 804, 805, 7, 63, 2, 2, 805, 144, 3, 2, 2, 2, 806, 807, 7, 62, 2, 2, 807, 146, 3, 2, 2, 2, 808, 809, 7, 62, 2, 2, 809, 810, 7, 63, 2, 2, 810, 148, 3, 2, 2, 2, 811, 812, 7, 64, 2, 2, 812, 150, 3, 2, 2, 2, 813, 814, 7, 64, 2, 2, 814, 815, 7, 63, 2, 2, 815, 152, 3, 2, 2, 2, 816, 817, 7, 45, 2, 2, 817, 154, 3, 2, 2, 2, 818, 819, 7, 47, 2, 2, 819, 156, 3, 2, 2, 2, 820, 821, 7, 44, 2, 2, 821, 158, 3, 2, 2, 2, 822, 823, 7, 49, 2, 2, 823, 160, 3, 2, 2, 2, 824, 825, 7, 39, 2, 2, 825, 162, 3, 2, 2, 2, 826, 827, 7, 93, 2, 2, 827, 828, 3, 2, 2, 2, 828, 829, 8, 77, 2, 2, 829, 830, 8, 77, 2, 2, 830, 164, 3, 2, 2, 2, 831, 832, 7, 95, 2, 2, 832, 833, 3, 2, 2, 2, 833, 834, 8, 78, 14, 2, 834, 835, 8, 78, 14, 2, 835, 166, 3, 2, 2, 2, 836, 840, 5, 71, 31, 2, 837, 839, 5, 87, 39, 2, 838, 837, 3, 2, 2, 2, 839, 842, 3, 2, 2, 2, 840, 838, 3, 2, 2, 2, 840, 841, 3, 2, 2, 2, 841, 853, 3, 2, 2, 2, 842, 840, 3, 2, 2, 2, 843, 846, 5, 85, 38, 2, 844, 846, 5, 79, 35, 2, 845, 843, 3, 2, 2, 2, 845, 844, 3, 2, 2, 2, 846, 848, 3, 2, 2, 2, 847, 849, 5, 87, 39, 2, 848, 847, 3, 2, 2, 2, 849, 850, 3, 2, 2, 2, 850, 848, 3, 2, 2, 2, 850, 851, 3, 2, 2, 2, 851, 853, 3, 2, 2, 2, 852, 836, 3, 2, 2, 2, 852, 845, 3, 2, 2, 2, 853, 168, 3, 2, 2, 2, 854, 856, 5, 81, 36, 2, 855, 857, 5, 83, 37, 2, 856, 855, 3, 2, 2, 2, 857, 858, 3, 2, 2, 2, 858, 856, 3, 2, 2, 2, 858, 859, 3, 2, 2, 2, 859, 860, 3, 2, 2, 2, 860, 861, 5, 81, 36, 2, 861, 170, 3, 2, 2, 2, 862, 863, 5, 51, 21, 2, 863, 864, 3, 2, 2, 2, 864, 865, 8, 81, 10, 2, 865, 172, 3, 2, 2, 2, 866, 867, 5, 53, 22, 2, 867, 868, 3, 2, 2, 2, 868, 869, 8, 82, 10, 2, 869, 174, 3, 2, 2, 2, 870, 871, 5, 55, 23, 2, 871, 872, 3, 2, 2, 2, 872, 873, 8, 83, 10, 2, 873, 176, 3, 2, 2, 2, 874, 875, 5, 67, 29, 2, 875, 876, 3, 2, 2, 2, 876, 877, 8, 84, 13, 2, 877, 878, 8, 84, 14, 2, 878, 178, 3, 2, 2, 2, 879, 880, 5, 163, 77, 2, 880, 881, 3, 2, 2, 2, 881, 882, 8, 85, 11, 2, 882, 180, 3, 2, 2, 2, 883, 884, 5, 165, 78, 2, 884, 885, 3, 2, 2, 2, 885, 886, 8, 86, 15, 2, 886, 182, 3, 2, 2, 2, 887, 888, 5, 103, 47, 2, 888, 889, 3, 2, 2, 2, 889, 890, 8, 87, 16, 2, 890, 184, 3, 2, 2, 2, 891, 892, 5, 101, 46, 2, 892, 893, 3, 2, 2, 2, 893, 894, 8, 88, 17, 2, 894, 186, 3, 2, 2, 2, 895, 896, 5, 345, 168, 2, 896, 897, 5, 329, 160, 2, 897, 898, 5, 359, 175, 2, 898, 899, 5, 321, 156, 2, 899, 900, 5, 327, 159, 2, 900, 901, 5, 321, 156, 2, 901, 902, 5, 359, 175, 2, 902, 903, 5, 321, 156, 2, 903, 188, 3, 2, 2, 2, 904, 908, 10, 12, 2, 2, 905, 906, 7, 49, 2, 2, 906, 908, 10, 13, 2, 2, 907, 904, 3, 2, 2, 2, 907, 905, 3, 2, 2, 2, 908, 190, 3, 2, 2, 2, 909, 911, 5, 189, 90, 2, 910, 909, 3, 2, 2, 2, 911, 912, 3, 2, 2, 2, 912, 910, 3, 2, 2, 2, 912, 913, 3, 2, 2, 2, 913, 192, 3, 2, 2, 2, 914, 915, 5, 169, 80, 2, 915, 916, 3, 2, 2, 2, 916, 917, 8, 92, 18, 2, 917, 194, 3, 2, 2, 2, 918, 919, 5, 51, 21, 2, 919, 920, 3, 2, 2, 2, 920, 921, 8, 93, 10, 2, 921, 196, 3, 2, 2, 2, 922, 923, 5, 53, 22, 2, 923, 924, 3, 2, 2, 2, 924, 925, 8, 94, 10, 2, 925, 198, 3, 2, 2, 2, 926, 927, 5, 55, 23, 2, 927, 928, 3, 2, 2, 2, 928, 929, 8, 95, 10, 2, 929, 200, 3, 2, 2, 2, 930, 931, 5, 67, 29, 2, 931, 932, 3, 2, 2, 2, 932, 933, 8, 96, 13, 2, 933, 934, 8, 96, 14, 2, 934, 202, 3, 2, 2, 2, 935, 936, 5, 107, 49, 2, 936, 937, 3, 2, 2, 2, 937, 938, 8, 97, 19, 2, 938, 204, 3, 2, 2, 2, 939, 940, 5, 103, 47, 2, 940, 941, 3, 2, 2, 2, 941, 942, 8, 98, 16, 2, 942, 206, 3, 2, 2, 2, 943, 948, 5, 71, 31, 2, 944, 948, 5, 69, 30, 2, 945, 948, 5, 85, 38, 2, 946, 948, 5, 157, 74, 2, 947, 943, 3, 2, 2, 2, 947, 944, 3, 2, 2, 2, 947, 945, 3, 2, 2, 2, 947, 946, 3, 2, 2, 2, 948, 208, 3, 2, 2, 2, 949, 952, 5, 71, 31, 2, 950, 952, 5, 157, 74, 2, 951, 949, 3, 2, 2, 2, 951, 950, 3, 2, 2, 2, 952, 956, 3, 2, 2, 2, 953, 955, 5, 207, 99, 2, 954, 953, 3, 2, 2, 2, 955, 958, 3, 2, 2, 2, 956, 954, 3, 2, 2, 2, 956, 957, 3, 2, 2, 2, 957, 969, 3, 2, 2, 2, 958, 956, 3, 2, 2, 2, 959, 962, 5, 85, 38, 2, 960, 962, 5, 79, 35, 2, 961, 959, 3, 2, 2, 2, 961, 960, 3, 2, 2, 2, 962, 964, 3, 2, 2, 2, 963, 965, 5, 207, 99, 2, 964, 963, 3, 2, 2, 2, 965, 966, 3, 2, 2, 2, 966, 964, 3, 2, 2, 2, 966, 967, 3, 2, 2, 2, 967, 969, 3, 2, 2, 2, 968, 951, 3, 2, 2, 2, 968, 961, 3, 2, 2, 2, 969, 210, 3, 2, 2, 2, 970, 971, 5, 209, 100, 2, 971, 972, 3, 2, 2, 2, 972, 973, 8, 101, 20, 2, 973, 212, 3, 2, 2, 2, 974, 975, 5, 169, 80, 2, 975, 976, 3, 2, 2, 2, 976, 977, 8, 102, 18, 2, 977, 214, 3, 2, 2, 2, 978, 979, 5, 51, 21, 2, 979, 980, 3, 2, 2, 2, 980, 981, 8, 103, 10, 2, 981, 216, 3, 2, 2, 2, 982, 983, 5, 53, 22, 2, 983, 984, 3, 2, 2, 2, 984, 985, 8, 104, 10, 2, 985, 218, 3, 2, 2, 2, 986, 987, 5, 55, 23, 2, 987, 988, 3, 2, 2, 2, 988, 989, 8, 105, 10, 2, 989, 220, 3, 2, 2, 2, 990, 991, 5, 67, 29, 2, 991, 992, 3, 2, 2, 2, 992, 993, 8, 106, 13, 2, 993, 994, 8, 106, 14, 2, 994, 222, 3, 2, 2, 2, 995, 996, 5, 101, 46, 2, 996, 997, 3, 2, 2, 2, 997, 998, 8, 107, 17, 2, 998, 224, 3, 2, 2, 2, 999, 1000, 5, 103, 47, 2, 1000, 1001, 3, 2, 2, 2, 1001, 1002, 8, 108, 16, 2, 1002, 226, 3, 2, 2, 2, 1003, 1004, 5, 107, 49, 2, 1004, 1005, 3, 2, 2, 2, 1005, 1006, 8, 109, 19, 2, 1006, 228, 3, 2, 2, 2, 1007, 1008, 5, 321, 156, 2, 1008, 1009, 5, 357, 174, 2, 1009, 230, 3, 2, 2, 2, 1010, 1011, 5, 169, 80, 2, 1011, 1012, 3, 2, 2, 2, 1012, 1013, 8, 111, 18, 2, 1013, 232, 3, 2, 2, 2, 1014, 1015, 5, 209, 100, 2, 1015, 1016, 3, 2, 2, 2, 1016, 1017, 8, 112, 20, 2, 1017, 234, 3, 2, 2, 2, 1018, 1019, 5, 51, 21, 2, 1019, 1020, 3, 2, 2, 2, 1020, 1021, 8, 113, 10, 2, 1021, 236, 3, 2, 2, 2, 1022, 1023, 5, 53, 22, 2, 1023, 1024, 3, 2, 2, 2, 1024, 1025, 8, 114, 10, 2, 1025, 238, 3, 2, 2, 2, 1026, 1027, 5, 55, 23, 2, 1027, 1028, 3, 2, 2, 2, 1028, 1029, 8, 115, 10, 2, 1029, 240, 3, 2, 2, 2, 1030, 1031, 5, 67, 29, 2, 1031, 1032, 3, 2, 2, 2, 1032, 1033, 8, 116, 13, 2, 1033, 1034, 8, 116, 14, 2, 1034, 242, 3, 2, 2, 2, 1035, 1036, 5, 163, 77, 2, 1036, 1037, 3, 2, 2, 2, 1037, 1038, 8, 117, 11, 2, 1038, 1039, 8, 117, 21, 2, 1039, 244, 3, 2, 2, 2, 1040, 1041, 5, 349, 170, 2, 1041, 1042, 5, 347, 169, 2, 1042, 1043, 3, 2, 2, 2, 1043, 1044, 8, 118, 22, 2, 1044, 246, 3, 2, 2, 2, 1045, 1046, 5, 365, 178, 2, 1046, 1047, 5, 337, 164, 2, 1047, 1048, 5, 359, 175, 2, 1048, 1049, 5, 335, 163, 2, 1049, 1050, 3, 2, 2, 2, 1050, 1051, 8, 119, 22, 2, 1051, 248, 3, 2, 2, 2, 1052, 1053, 10, 14, 2, 2, 1053, 250, 3, 2, 2, 2, 1054, 1057, 5, 71, 31, 2, 1055, 1057, 5, 69, 30, 2, 1056, 1054, 3, 2, 2, 2, 1056, 1055, 3, 2, 2, 2, 1057, 1061, 3, 2, 2, 2, 1058, 1060, 5, 249, 120, 2, 1059, 1058, 3, 2, 2, 2, 1060, 1063, 3, 2, 2, 2, 1061, 1059, 3, 2, 2, 2, 1061, 1062, 3, 2, 2, 2, 1062, 252, 3, 2, 2, 2, 1063, 1061, 3, 2, 2, 2, 1064, 1065, 5, 169, 80, 2, 1065, 1066, 3, 2, 2, 2, 1066, 1067, 8, 122, 18, 2, 1067, 254, 3, 2, 2, 2, 1068, 1069, 5, 251, 121, 2, 1069, 1070, 3, 2, 2, 2, 1070, 1071, 8, 123, 23, 2, 1071, 256, 3, 2, 2, 2, 1072, 1073, 5, 51, 21, 2, 1073, 1074, 3, 2, 2, 2, 1074, 1075, 8, 124, 10, 2, 1075, 258, 3, 2, 2, 2, 1076, 1077, 5, 53, 22, 2, 1077, 1078, 3, 2, 2, 2, 1078, 1079, 8, 125, 10, 2, 1079, 260, 3, 2, 2, 2, 1080, 1081, 5, 55, 23, 2, 1081, 1082, 3, 2, 2, 2, 1082, 1083, 8, 126, 10, 2, 1083, 262, 3, 2, 2, 2, 1084, 1085, 5, 67, 29, 2, 1085, 1086, 3, 2, 2, 2, 1086, 1087, 8, 127, 13, 2, 1087, 1088, 8, 127, 14, 2, 1088, 1089, 8, 127, 14, 2, 1089, 264, 3, 2, 2, 2, 1090, 1091, 5, 101, 46, 2, 1091, 1092, 3, 2, 2, 2, 1092, 1093, 8, 128, 17, 2, 1093, 266, 3, 2, 2, 2, 1094, 1095, 5, 103, 47, 2, 1095, 1096, 3, 2, 2, 2, 1096, 1097, 8, 129, 16, 2, 1097, 268, 3, 2, 2, 2, 1098, 1099, 5, 107, 49, 2, 1099, 1100, 3, 2, 2, 2, 1100, 1101, 8, 130, 19, 2, 1101, 270, 3, 2, 2, 2, 1102, 1103, 5, 247, 119, 2, 1103, 1104, 3, 2, 2, 2, 1104, 1105, 8, 131, 24, 2, 1105, 272, 3, 2, 2, 2, 1106, 1107, 5, 209, 100, 2, 1107, 1108, 3, 2, 2, 2, 1108, 1109, 8, 132, 20, 2, 1109, 274, 3, 2, 2, 2, 1110, 1111, 5, 169, 80, 2, 1111, 1112, 3, 2, 2, 2, 1112, 1113, 8, 133, 18, 2, 1113, 276, 3, 2, 2, 2, 1114, 1115, 5, 51, 21, 2, 1115, 1116, 3, 2, 2, 2, 1116, 1117, 8, 134, 10, 2, 1117, 278, 3, 2, 2, 2, 1118, 1119, 5, 53, 22, 2, 1119, 1120, 3, 2, 2, 2, 1120, 1121, 8, 135, 10, 2, 1121, 280, 3, 2, 2, 2, 1122, 1123, 5, 55, 23, 2, 1123, 1124, 3, 2, 2, 2, 1124, 1125, 8, 136, 10, 2, 1125, 282, 3, 2, 2, 2, 1126, 1127, 5, 67, 29, 2, 1127, 1128, 3, 2, 2, 2, 1128, 1129, 8, 137, 13, 2, 1129, 1130, 8, 137, 14, 2, 1130, 284, 3, 2, 2, 2, 1131, 1132, 5, 107, 49, 2, 1132, 1133, 3, 2, 2, 2, 1133, 1134, 8, 138, 19, 2, 1134, 286, 3, 2, 2, 2, 1135, 1136, 5, 169, 80, 2, 1136, 1137, 3, 2, 2, 2, 1137, 1138, 8, 139, 18, 2, 1138, 288, 3, 2, 2, 2, 1139, 1140, 5, 167, 79, 2, 1140, 1141, 3, 2, 2, 2, 1141, 1142, 8, 140, 25, 2, 1142, 290, 3, 2, 2, 2, 1143, 1144, 5, 51, 21, 2, 1144, 1145, 3, 2, 2, 2, 1145, 1146, 8, 141, 10, 2, 1146, 292, 3, 2, 2, 2, 1147, 1148, 5, 53, 22, 2, 1148, 1149, 3, 2, 2, 2, 1149, 1150, 8, 142, 10, 2, 1150, 294, 3, 2, 2, 2, 1151, 1152, 5, 55, 23, 2, 1152, 1153, 3, 2, 2, 2, 1153, 1154, 8, 143, 10, 2, 1154, 296, 3, 2, 2, 2, 1155, 1156, 5, 67, 29, 2, 1156, 1157, 3, 2, 2, 2, 1157, 1158, 8, 144, 13, 2, 1158, 1159, 8, 144, 14, 2, 1159, 298, 3, 2, 2, 2, 1160, 1161, 5, 337, 164, 2, 1161, 1162, 5, 347, 169, 2, 1162, 1163, 5, 331, 161, 2, 1163, 1164, 5, 349, 170, 2, 1164, 300, 3, 2, 2, 2, 1165, 1166, 5, 331, 161, 2, 1166, 1167, 5, 361, 176, 2, 1167, 1168, 5, 347, 169, 2, 1168, 1169, 5, 325, 158, 2, 1169, 1170, 5, 359, 175, 2, 1170, 1171, 5, 337, 164, 2, 1171, 1172, 5, 349, 170, 2, 1172, 1173, 5, 347, 169, 2, 1173, 1174, 5, 357, 174, 2, 1174, 302, 3, 2, 2, 2, 1175, 1176, 5, 51, 21, 2, 1176, 1177, 3, 2, 2, 2, 1177, 1178, 8, 147, 10, 2, 1178, 304, 3, 2, 2, 2, 1179, 1180, 5, 53, 22, 2, 1180, 1181, 3, 2, 2, 2, 1181, 1182, 8, 148, 10, 2, 1182, 306, 3, 2, 2, 2, 1183, 1184, 5, 55, 23, 2, 1184, 1185, 3, 2, 2, 2, 1185, 1186, 8, 149, 10, 2, 1186, 308, 3, 2, 2, 2, 1187, 1188, 5, 165, 78, 2, 1188, 1189, 3, 2, 2, 2, 1189, 1190, 8, 150, 15, 2, 1190, 1191, 8, 150, 14, 2, 1191, 310, 3, 2, 2, 2, 1192, 1193, 7, 60, 2, 2, 1193, 312, 3, 2, 2, 2, 1194, 1200, 5, 79, 35, 2, 1195, 1200, 5, 69, 30, 2, 1196, 1200, 5, 107, 49, 2, 1197, 1200, 5, 71, 31, 2, 1198, 1200, 5, 85, 38, 2, 1199, 1194, 3, 2, 2, 2, 1199, 1195, 3, 2, 2, 2, 1199, 1196, 3, 2, 2, 2, 1199, 1197, 3, 2, 2, 2, 1199, 1198, 3, 2, 2, 2, 1200, 1201, 3, 2, 2, 2, 1201, 1199, 3, 2, 2, 2, 1201, 1202, 3, 2, 2, 2, 1202, 314, 3, 2, 2, 2, 1203, 1204, 5, 51, 21, 2, 1204, 1205, 3, 2, 2, 2, 1205, 1206, 8, 153, 10, 2, 1206, 316, 3, 2, 2, 2, 1207, 1208, 5, 53, 22, 2, 1208, 1209, 3, 2, 2, 2, 1209, 1210, 8, 154, 10, 2, 1210, 318, 3, 2, 2, 2, 1211, 1212, 5, 55, 23, 2, 1212, 1213, 3, 2, 2, 2, 1213, 1214, 8, 155, 10, 2, 1214, 320, 3, 2, 2, 2, 1215, 1216, 9, 15, 2, 2, 1216, 322, 3, 2, 2, 2, 1217, 1218, 9, 16, 2, 2, 1218, 324, 3, 2, 2, 2, 1219, 1220, 9, 17, 2, 2, 1220, 326, 3, 2, 2, 2, 1221, 1222, 9, 18, 2, 2, 1222, 328, 3, 2, 2, 2, 1223, 1224, 9, 9, 2, 2, 1224, 330, 3, 2, 2, 2, 1225, 1226, 9, 19, 2, 2, 1226, 332, 3, 2, 2, 2, 1227, 1228, 9, 20, 2, 2, 1228, 334, 3, 2, 2, 2, 1229, 1230, 9, 21, 2, 2, 1230, 336, 3, 2, 2, 2, 1231, 1232, 9, 22, 2, 2, 1232, 338, 3, 2, 2, 2, 1233, 1234, 9, 23, 2, 2, 1234, 340, 3, 2, 2, 2, 1235, 1236, 9, 24, 2, 2, 1236, 342, 3, 2, 2, 2, 1237, 1238, 9, 25, 2, 2, 1238, 344, 3, 2, 2, 2, 1239, 1240, 9, 26, 2, 2, 1240, 346, 3, 2, 2, 2, 1241, 1242, 9, 27, 2, 2, 1242, 348, 3, 2, 2, 2, 1243, 1244, 9, 28, 2, 2, 1244, 350, 3, 2, 2, 2, 1245, 1246, 9, 29, 2, 2, 1246, 352, 3, 2, 2, 2, 1247, 1248, 9, 30, 2, 2, 1248, 354, 3, 2, 2, 2, 1249, 1250, 9, 31, 2, 2, 1250, 356, 3, 2, 2, 2, 1251, 1252, 9, 32, 2, 2, 1252, 358, 3, 2, 2, 2, 1253, 1254, 9, 33, 2, 2, 1254, 360, 3, 2, 2, 2, 1255, 1256, 9, 34, 2, 2, 1256, 362, 3, 2, 2, 2, 1257, 1258, 9, 35, 2, 2, 1258, 364, 3, 2, 2, 2, 1259, 1260, 9, 36, 2, 2, 1260, 366, 3, 2, 2, 2, 1261, 1262, 9, 37, 2, 2, 1262, 368, 3, 2, 2, 2, 1263, 1264, 9, 38, 2, 2, 1264, 370, 3, 2, 2, 2, 1265, 1266, 9, 39, 2, 2, 1266, 372, 3, 2, 2, 2, 56, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 529, 539, 543, 546, 555, 557, 568, 609, 614, 623, 630, 635, 637, 648, 656, 659, 661, 666, 671, 677, 684, 689, 695, 698, 706, 710, 840, 845, 850, 852, 858, 907, 912, 947, 951, 956, 961, 966, 968, 1056, 1061, 1199, 1201, 26, 7, 4, 2, 7, 6, 2, 7, 8, 2, 7, 3, 2, 7, 5, 2, 7, 10, 2, 7, 7, 2, 7, 11, 2, 2, 3, 2, 9, 66, 2, 7, 2, 2, 9, 28, 2, 6, 2, 2, 9, 67, 2, 9, 36, 2, 9, 35, 2, 9, 69, 2, 9, 38, 2, 9, 78, 2, 7, 12, 2, 7, 9, 2, 9, 88, 2, 9, 87, 2, 9, 68, 2] \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens b/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens index 073febb9e1783..4bdf0572a3b8a 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens +++ b/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens @@ -50,58 +50,59 @@ RLIKE=49 RP=50 TRUE=51 EQ=52 -NEQ=53 -LT=54 -LTE=55 -GT=56 -GTE=57 -PLUS=58 -MINUS=59 -ASTERISK=60 -SLASH=61 -PERCENT=62 -OPENING_BRACKET=63 -CLOSING_BRACKET=64 -UNQUOTED_IDENTIFIER=65 -QUOTED_IDENTIFIER=66 -EXPR_LINE_COMMENT=67 -EXPR_MULTILINE_COMMENT=68 -EXPR_WS=69 -METADATA=70 -FROM_UNQUOTED_IDENTIFIER=71 -FROM_LINE_COMMENT=72 -FROM_MULTILINE_COMMENT=73 -FROM_WS=74 -UNQUOTED_ID_PATTERN=75 -PROJECT_LINE_COMMENT=76 -PROJECT_MULTILINE_COMMENT=77 -PROJECT_WS=78 -AS=79 -RENAME_LINE_COMMENT=80 -RENAME_MULTILINE_COMMENT=81 -RENAME_WS=82 -ON=83 -WITH=84 -ENRICH_POLICY_NAME=85 -ENRICH_LINE_COMMENT=86 -ENRICH_MULTILINE_COMMENT=87 -ENRICH_WS=88 -ENRICH_FIELD_LINE_COMMENT=89 -ENRICH_FIELD_MULTILINE_COMMENT=90 -ENRICH_FIELD_WS=91 -MVEXPAND_LINE_COMMENT=92 -MVEXPAND_MULTILINE_COMMENT=93 -MVEXPAND_WS=94 -INFO=95 -FUNCTIONS=96 -SHOW_LINE_COMMENT=97 -SHOW_MULTILINE_COMMENT=98 -SHOW_WS=99 -COLON=100 -SETTING=101 -SETTING_LINE_COMMENT=102 -SETTTING_MULTILINE_COMMENT=103 -SETTING_WS=104 +CIEQ=53 +NEQ=54 +LT=55 +LTE=56 +GT=57 +GTE=58 +PLUS=59 +MINUS=60 +ASTERISK=61 +SLASH=62 +PERCENT=63 +OPENING_BRACKET=64 +CLOSING_BRACKET=65 +UNQUOTED_IDENTIFIER=66 +QUOTED_IDENTIFIER=67 +EXPR_LINE_COMMENT=68 +EXPR_MULTILINE_COMMENT=69 +EXPR_WS=70 +METADATA=71 +FROM_UNQUOTED_IDENTIFIER=72 +FROM_LINE_COMMENT=73 +FROM_MULTILINE_COMMENT=74 +FROM_WS=75 +UNQUOTED_ID_PATTERN=76 +PROJECT_LINE_COMMENT=77 +PROJECT_MULTILINE_COMMENT=78 +PROJECT_WS=79 +AS=80 +RENAME_LINE_COMMENT=81 +RENAME_MULTILINE_COMMENT=82 +RENAME_WS=83 +ON=84 +WITH=85 +ENRICH_POLICY_NAME=86 +ENRICH_LINE_COMMENT=87 +ENRICH_MULTILINE_COMMENT=88 +ENRICH_WS=89 +ENRICH_FIELD_LINE_COMMENT=90 +ENRICH_FIELD_MULTILINE_COMMENT=91 +ENRICH_FIELD_WS=92 +MVEXPAND_LINE_COMMENT=93 +MVEXPAND_MULTILINE_COMMENT=94 +MVEXPAND_WS=95 +INFO=96 +FUNCTIONS=97 +SHOW_LINE_COMMENT=98 +SHOW_MULTILINE_COMMENT=99 +SHOW_WS=100 +COLON=101 +SETTING=102 +SETTING_LINE_COMMENT=103 +SETTTING_MULTILINE_COMMENT=104 +SETTING_WS=105 '|'=26 '='=33 ','=34 @@ -110,15 +111,16 @@ SETTING_WS=104 '?'=48 ')'=50 '=='=52 -'!='=53 -'<'=54 -'<='=55 -'>'=56 -'>='=57 -'+'=58 -'-'=59 -'*'=60 -'/'=61 -'%'=62 -']'=64 -':'=100 +'=~'=53 +'!='=54 +'<'=55 +'<='=56 +'>'=57 +'>='=58 +'+'=59 +'-'=60 +'*'=61 +'/'=62 +'%'=63 +']'=65 +':'=101 diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts b/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts index 220f6417faa08..1bea52f3e5f29 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts +++ b/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts @@ -69,58 +69,59 @@ export class esql_lexer extends Lexer { public static readonly RP = 50; public static readonly TRUE = 51; public static readonly EQ = 52; - public static readonly NEQ = 53; - public static readonly LT = 54; - public static readonly LTE = 55; - public static readonly GT = 56; - public static readonly GTE = 57; - public static readonly PLUS = 58; - public static readonly MINUS = 59; - public static readonly ASTERISK = 60; - public static readonly SLASH = 61; - public static readonly PERCENT = 62; - public static readonly OPENING_BRACKET = 63; - public static readonly CLOSING_BRACKET = 64; - public static readonly UNQUOTED_IDENTIFIER = 65; - public static readonly QUOTED_IDENTIFIER = 66; - public static readonly EXPR_LINE_COMMENT = 67; - public static readonly EXPR_MULTILINE_COMMENT = 68; - public static readonly EXPR_WS = 69; - public static readonly METADATA = 70; - public static readonly FROM_UNQUOTED_IDENTIFIER = 71; - public static readonly FROM_LINE_COMMENT = 72; - public static readonly FROM_MULTILINE_COMMENT = 73; - public static readonly FROM_WS = 74; - public static readonly UNQUOTED_ID_PATTERN = 75; - public static readonly PROJECT_LINE_COMMENT = 76; - public static readonly PROJECT_MULTILINE_COMMENT = 77; - public static readonly PROJECT_WS = 78; - public static readonly AS = 79; - public static readonly RENAME_LINE_COMMENT = 80; - public static readonly RENAME_MULTILINE_COMMENT = 81; - public static readonly RENAME_WS = 82; - public static readonly ON = 83; - public static readonly WITH = 84; - public static readonly ENRICH_POLICY_NAME = 85; - public static readonly ENRICH_LINE_COMMENT = 86; - public static readonly ENRICH_MULTILINE_COMMENT = 87; - public static readonly ENRICH_WS = 88; - public static readonly ENRICH_FIELD_LINE_COMMENT = 89; - public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 90; - public static readonly ENRICH_FIELD_WS = 91; - public static readonly MVEXPAND_LINE_COMMENT = 92; - public static readonly MVEXPAND_MULTILINE_COMMENT = 93; - public static readonly MVEXPAND_WS = 94; - public static readonly INFO = 95; - public static readonly FUNCTIONS = 96; - public static readonly SHOW_LINE_COMMENT = 97; - public static readonly SHOW_MULTILINE_COMMENT = 98; - public static readonly SHOW_WS = 99; - public static readonly COLON = 100; - public static readonly SETTING = 101; - public static readonly SETTING_LINE_COMMENT = 102; - public static readonly SETTTING_MULTILINE_COMMENT = 103; - public static readonly SETTING_WS = 104; + public static readonly CIEQ = 53; + public static readonly NEQ = 54; + public static readonly LT = 55; + public static readonly LTE = 56; + public static readonly GT = 57; + public static readonly GTE = 58; + public static readonly PLUS = 59; + public static readonly MINUS = 60; + public static readonly ASTERISK = 61; + public static readonly SLASH = 62; + public static readonly PERCENT = 63; + public static readonly OPENING_BRACKET = 64; + public static readonly CLOSING_BRACKET = 65; + public static readonly UNQUOTED_IDENTIFIER = 66; + public static readonly QUOTED_IDENTIFIER = 67; + public static readonly EXPR_LINE_COMMENT = 68; + public static readonly EXPR_MULTILINE_COMMENT = 69; + public static readonly EXPR_WS = 70; + public static readonly METADATA = 71; + public static readonly FROM_UNQUOTED_IDENTIFIER = 72; + public static readonly FROM_LINE_COMMENT = 73; + public static readonly FROM_MULTILINE_COMMENT = 74; + public static readonly FROM_WS = 75; + public static readonly UNQUOTED_ID_PATTERN = 76; + public static readonly PROJECT_LINE_COMMENT = 77; + public static readonly PROJECT_MULTILINE_COMMENT = 78; + public static readonly PROJECT_WS = 79; + public static readonly AS = 80; + public static readonly RENAME_LINE_COMMENT = 81; + public static readonly RENAME_MULTILINE_COMMENT = 82; + public static readonly RENAME_WS = 83; + public static readonly ON = 84; + public static readonly WITH = 85; + public static readonly ENRICH_POLICY_NAME = 86; + public static readonly ENRICH_LINE_COMMENT = 87; + public static readonly ENRICH_MULTILINE_COMMENT = 88; + public static readonly ENRICH_WS = 89; + public static readonly ENRICH_FIELD_LINE_COMMENT = 90; + public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 91; + public static readonly ENRICH_FIELD_WS = 92; + public static readonly MVEXPAND_LINE_COMMENT = 93; + public static readonly MVEXPAND_MULTILINE_COMMENT = 94; + public static readonly MVEXPAND_WS = 95; + public static readonly INFO = 96; + public static readonly FUNCTIONS = 97; + public static readonly SHOW_LINE_COMMENT = 98; + public static readonly SHOW_MULTILINE_COMMENT = 99; + public static readonly SHOW_WS = 100; + public static readonly COLON = 101; + public static readonly SETTING = 102; + public static readonly SETTING_LINE_COMMENT = 103; + public static readonly SETTTING_MULTILINE_COMMENT = 104; + public static readonly SETTING_WS = 105; public static readonly EXPLAIN_MODE = 1; public static readonly EXPRESSION_MODE = 2; public static readonly FROM_MODE = 3; @@ -154,8 +155,8 @@ export class esql_lexer extends Lexer { "UNDERSCORE", "UNQUOTED_ID_BODY", "STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "COMMA", "DESC", "DOT", "FALSE", "FIRST", "LAST", "LP", "IN", "IS", "LIKE", "NOT", "NULL", "NULLS", "OR", "PARAM", - "RLIKE", "RP", "TRUE", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", - "MINUS", "ASTERISK", "SLASH", "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", + "RLIKE", "RP", "TRUE", "EQ", "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", + "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "FROM_PIPE", "FROM_OPENING_BRACKET", "FROM_CLOSING_BRACKET", "FROM_COMMA", "FROM_ASSIGN", "METADATA", "FROM_UNQUOTED_IDENTIFIER_PART", @@ -188,13 +189,13 @@ export class esql_lexer extends Lexer { undefined, undefined, undefined, undefined, undefined, "'='", "','", undefined, "'.'", undefined, undefined, undefined, "'('", undefined, undefined, undefined, undefined, undefined, undefined, undefined, "'?'", undefined, "')'", undefined, - "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", - "'%'", undefined, "']'", undefined, undefined, undefined, undefined, undefined, + "'=='", "'=~'", "'!='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", + "'/'", "'%'", undefined, "']'", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, "':'", + undefined, undefined, undefined, "':'", ]; private static readonly _SYMBOLIC_NAMES: Array = [ undefined, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", @@ -204,8 +205,8 @@ export class esql_lexer extends Lexer { "PIPE", "STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "COMMA", "DESC", "DOT", "FALSE", "FIRST", "LAST", "LP", "IN", "IS", "LIKE", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", - "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", - "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", + "EQ", "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", + "SLASH", "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "METADATA", "FROM_UNQUOTED_IDENTIFIER", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", "FROM_WS", "UNQUOTED_ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", @@ -249,7 +250,7 @@ export class esql_lexer extends Lexer { private static readonly _serializedATNSegments: number = 3; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02j\u04EE\b\x01" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02k\u04F3\b\x01" + "\b\x01\b\x01\b\x01\b\x01\b\x01\b\x01\b\x01\b\x01\b\x01\b\x01\x04\x02\t" + "\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07\t" + "\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04\x0E" + @@ -278,599 +279,602 @@ export class esql_lexer extends Lexer { "\t\xA5\x04\xA6\t\xA6\x04\xA7\t\xA7\x04\xA8\t\xA8\x04\xA9\t\xA9\x04\xAA" + "\t\xAA\x04\xAB\t\xAB\x04\xAC\t\xAC\x04\xAD\t\xAD\x04\xAE\t\xAE\x04\xAF" + "\t\xAF\x04\xB0\t\xB0\x04\xB1\t\xB1\x04\xB2\t\xB2\x04\xB3\t\xB3\x04\xB4" + - "\t\xB4\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" + - "\x03\x02\x03\x02\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" + - "\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" + - "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x06\x03\x06" + - "\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x07" + - "\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\b\x03\b\x03\b\x03" + - "\b\x03\b\x03\b\x03\b\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03" + - "\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03" + - "\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\f\x03\f\x03\f\x03" + - "\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\r\x03\r\x03\r\x03" + - "\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\x0E\x03\x0E\x03\x0E\x03\x0E" + - "\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + - "\x03\x0F\x03\x0F\x03\x10\x03\x10\x03\x10\x03\x10\x03\x10\x03\x10\x03\x10" + - "\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x12\x03\x12" + - "\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x13\x03\x13\x03\x13" + - "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x14\x06\x14\u020E\n\x14\r" + - "\x14\x0E\x14\u020F\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x07" + - "\x15\u0218\n\x15\f\x15\x0E\x15\u021B\v\x15\x03\x15\x05\x15\u021E\n\x15" + - "\x03\x15\x05\x15\u0221\n\x15\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03" + - "\x16\x03\x16\x07\x16\u022A\n\x16\f\x16\x0E\x16\u022D\v\x16\x03\x16\x03" + - "\x16\x03\x16\x03\x16\x03\x16\x03\x17\x06\x17\u0235\n\x17\r\x17\x0E\x17" + - "\u0236\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x19" + - "\x03\x19\x03\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B" + - "\x03\x1B\x03\x1B\x03\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1D\x03\x1D" + - "\x03\x1D\x03\x1D\x03\x1E\x03\x1E\x03\x1F\x03\x1F\x03 \x03 \x03 \x03!\x03" + - "!\x03\"\x03\"\x05\"\u0260\n\"\x03\"\x06\"\u0263\n\"\r\"\x0E\"\u0264\x03" + - "#\x03#\x03$\x03$\x03%\x03%\x03%\x05%\u026E\n%\x03&\x03&\x03\'\x03\'\x03" + - "\'\x05\'\u0275\n\'\x03(\x03(\x03(\x07(\u027A\n(\f(\x0E(\u027D\v(\x03(" + - "\x03(\x03(\x03(\x03(\x03(\x07(\u0285\n(\f(\x0E(\u0288\v(\x03(\x03(\x03" + - "(\x03(\x03(\x05(\u028F\n(\x03(\x05(\u0292\n(\x05(\u0294\n(\x03)\x06)\u0297" + - "\n)\r)\x0E)\u0298\x03*\x06*\u029C\n*\r*\x0E*\u029D\x03*\x03*\x07*\u02A2" + - "\n*\f*\x0E*\u02A5\v*\x03*\x03*\x06*\u02A9\n*\r*\x0E*\u02AA\x03*\x06*\u02AE" + - "\n*\r*\x0E*\u02AF\x03*\x03*\x07*\u02B4\n*\f*\x0E*\u02B7\v*\x05*\u02B9" + - "\n*\x03*\x03*\x03*\x03*\x06*\u02BF\n*\r*\x0E*\u02C0\x03*\x03*\x05*\u02C5" + - "\n*\x03+\x03+\x03+\x03,\x03,\x03,\x03,\x03-\x03-\x03-\x03-\x03.\x03.\x03" + - "/\x03/\x030\x030\x030\x030\x030\x031\x031\x032\x032\x032\x032\x032\x03" + - "2\x033\x033\x033\x033\x033\x033\x034\x034\x034\x034\x034\x035\x035\x03" + - "6\x036\x036\x037\x037\x037\x038\x038\x038\x038\x038\x039\x039\x039\x03" + - "9\x03:\x03:\x03:\x03:\x03:\x03;\x03;\x03;\x03;\x03;\x03;\x03<\x03<\x03" + - "<\x03=\x03=\x03>\x03>\x03>\x03>\x03>\x03>\x03?\x03?\x03@\x03@\x03@\x03" + - "@\x03@\x03A\x03A\x03A\x03B\x03B\x03B\x03C\x03C\x03D\x03D\x03D\x03E\x03" + - "E\x03F\x03F\x03F\x03G\x03G\x03H\x03H\x03I\x03I\x03J\x03J\x03K\x03K\x03" + - "L\x03L\x03L\x03L\x03L\x03M\x03M\x03M\x03M\x03M\x03N\x03N\x07N\u0342\n" + - "N\fN\x0EN\u0345\vN\x03N\x03N\x05N\u0349\nN\x03N\x06N\u034C\nN\rN\x0EN" + - "\u034D\x05N\u0350\nN\x03O\x03O\x06O\u0354\nO\rO\x0EO\u0355\x03O\x03O\x03" + - "P\x03P\x03P\x03P\x03Q\x03Q\x03Q\x03Q\x03R\x03R\x03R\x03R\x03S\x03S\x03" + - "S\x03S\x03S\x03T\x03T\x03T\x03T\x03U\x03U\x03U\x03U\x03V\x03V\x03V\x03" + - "V\x03W\x03W\x03W\x03W\x03X\x03X\x03X\x03X\x03X\x03X\x03X\x03X\x03X\x03" + - "Y\x03Y\x03Y\x05Y\u0387\nY\x03Z\x06Z\u038A\nZ\rZ\x0EZ\u038B\x03[\x03[\x03" + - "[\x03[\x03\\\x03\\\x03\\\x03\\\x03]\x03]\x03]\x03]\x03^\x03^\x03^\x03" + - "^\x03_\x03_\x03_\x03_\x03_\x03`\x03`\x03`\x03`\x03a\x03a\x03a\x03a\x03" + - "b\x03b\x03b\x03b\x05b\u03AF\nb\x03c\x03c\x05c\u03B3\nc\x03c\x07c\u03B6" + - "\nc\fc\x0Ec\u03B9\vc\x03c\x03c\x05c\u03BD\nc\x03c\x06c\u03C0\nc\rc\x0E" + - "c\u03C1\x05c\u03C4\nc\x03d\x03d\x03d\x03d\x03e\x03e\x03e\x03e\x03f\x03" + - "f\x03f\x03f\x03g\x03g\x03g\x03g\x03h\x03h\x03h\x03h\x03i\x03i\x03i\x03" + - "i\x03i\x03j\x03j\x03j\x03j\x03k\x03k\x03k\x03k\x03l\x03l\x03l\x03l\x03" + - "m\x03m\x03m\x03n\x03n\x03n\x03n\x03o\x03o\x03o\x03o\x03p\x03p\x03p\x03" + - "p\x03q\x03q\x03q\x03q\x03r\x03r\x03r\x03r\x03s\x03s\x03s\x03s\x03s\x03" + - "t\x03t\x03t\x03t\x03t\x03u\x03u\x03u\x03u\x03u\x03v\x03v\x03v\x03v\x03" + - "v\x03v\x03v\x03w\x03w\x03x\x03x\x05x\u041C\nx\x03x\x07x\u041F\nx\fx\x0E" + - "x\u0422\vx\x03y\x03y\x03y\x03y\x03z\x03z\x03z\x03z\x03{\x03{\x03{\x03" + - "{\x03|\x03|\x03|\x03|\x03}\x03}\x03}\x03}\x03~\x03~\x03~\x03~\x03~\x03" + - "~\x03\x7F\x03\x7F\x03\x7F\x03\x7F\x03\x80\x03\x80\x03\x80\x03\x80\x03" + - "\x81\x03\x81\x03\x81\x03\x81\x03\x82\x03\x82\x03\x82\x03\x82\x03\x83\x03" + - "\x83\x03\x83\x03\x83\x03\x84\x03\x84\x03\x84\x03\x84\x03\x85\x03\x85\x03" + - "\x85\x03\x85\x03\x86\x03\x86\x03\x86\x03\x86\x03\x87\x03\x87\x03\x87\x03" + - "\x87\x03\x88\x03\x88\x03\x88\x03\x88\x03\x88\x03\x89\x03\x89\x03\x89\x03" + - "\x89\x03\x8A\x03\x8A\x03\x8A\x03\x8A\x03\x8B\x03\x8B\x03\x8B\x03\x8B\x03" + - "\x8C\x03\x8C\x03\x8C\x03\x8C\x03\x8D\x03\x8D\x03\x8D\x03\x8D\x03\x8E\x03" + - "\x8E\x03\x8E\x03\x8E\x03\x8F\x03\x8F\x03\x8F\x03\x8F\x03\x8F\x03\x90\x03" + - "\x90\x03\x90\x03\x90\x03\x90\x03\x91\x03\x91\x03\x91\x03\x91\x03\x91\x03" + - "\x91\x03\x91\x03\x91\x03\x91\x03\x91\x03\x92\x03\x92\x03\x92\x03\x92\x03" + - "\x93\x03\x93\x03\x93\x03\x93\x03\x94\x03\x94\x03\x94\x03\x94\x03\x95\x03" + - "\x95\x03\x95\x03\x95\x03\x95\x03\x96\x03\x96\x03\x97\x03\x97\x03\x97\x03" + - "\x97\x03\x97\x06\x97\u04AB\n\x97\r\x97\x0E\x97\u04AC\x03\x98\x03\x98\x03" + - "\x98\x03\x98\x03\x99\x03\x99\x03\x99\x03\x99\x03\x9A\x03\x9A\x03\x9A\x03" + - "\x9A\x03\x9B\x03\x9B\x03\x9C\x03\x9C\x03\x9D\x03\x9D\x03\x9E\x03\x9E\x03" + - "\x9F\x03\x9F\x03\xA0\x03\xA0\x03\xA1\x03\xA1\x03\xA2\x03\xA2\x03\xA3\x03" + - "\xA3\x03\xA4\x03\xA4\x03\xA5\x03\xA5\x03\xA6\x03\xA6\x03\xA7\x03\xA7\x03" + - "\xA8\x03\xA8\x03\xA9\x03\xA9\x03\xAA\x03\xAA\x03\xAB\x03\xAB\x03\xAC\x03" + - "\xAC\x03\xAD\x03\xAD\x03\xAE\x03\xAE\x03\xAF\x03\xAF\x03\xB0\x03\xB0\x03" + - "\xB1\x03\xB1\x03\xB2\x03\xB2\x03\xB3\x03\xB3\x03\xB4\x03\xB4\x04\u022B" + - "\u0286\x02\x02\xB5\r\x02\x03\x0F\x02\x04\x11\x02\x05\x13\x02\x06\x15\x02" + - "\x07\x17\x02\b\x19\x02\t\x1B\x02\n\x1D\x02\v\x1F\x02\f!\x02\r#\x02\x0E" + - "%\x02\x0F\'\x02\x10)\x02\x11+\x02\x12-\x02\x13/\x02\x141\x02\x153\x02" + - "\x165\x02\x177\x02\x189\x02\x02;\x02\x02=\x02\x19?\x02\x1AA\x02\x1BC\x02" + - "\x1CE\x02\x02G\x02\x02I\x02\x02K\x02\x02M\x02\x02O\x02\x02Q\x02\x02S\x02" + - "\x02U\x02\x02W\x02\x02Y\x02\x1D[\x02\x1E]\x02\x1F_\x02 a\x02!c\x02\"e" + - "\x02#g\x02$i\x02%k\x02&m\x02\'o\x02(q\x02)s\x02*u\x02+w\x02,y\x02-{\x02" + - ".}\x02/\x7F\x020\x81\x021\x83\x022\x85\x023\x87\x024\x89\x025\x8B\x02" + - "6\x8D\x027\x8F\x028\x91\x029\x93\x02:\x95\x02;\x97\x02<\x99\x02=\x9B\x02" + - ">\x9D\x02?\x9F\x02@\xA1\x02A\xA3\x02B\xA5\x02C\xA7\x02D\xA9\x02E\xAB\x02" + - "F\xAD\x02G\xAF\x02\x02\xB1\x02\x02\xB3\x02\x02\xB5\x02\x02\xB7\x02\x02" + - "\xB9\x02H\xBB\x02\x02\xBD\x02I\xBF\x02\x02\xC1\x02J\xC3\x02K\xC5\x02L" + - "\xC7\x02\x02\xC9\x02\x02\xCB\x02\x02\xCD\x02\x02\xCF\x02M\xD1\x02\x02" + - "\xD3\x02\x02\xD5\x02N\xD7\x02O\xD9\x02P\xDB\x02\x02\xDD\x02\x02\xDF\x02" + - "\x02\xE1\x02\x02\xE3\x02Q\xE5\x02\x02\xE7\x02\x02\xE9\x02R\xEB\x02S\xED" + - "\x02T\xEF\x02\x02\xF1\x02\x02\xF3\x02U\xF5\x02V\xF7\x02\x02\xF9\x02W\xFB" + - "\x02\x02\xFD\x02\x02\xFF\x02X\u0101\x02Y\u0103\x02Z\u0105\x02\x02\u0107" + - "\x02\x02\u0109\x02\x02\u010B\x02\x02\u010D\x02\x02\u010F\x02\x02\u0111" + - "\x02\x02\u0113\x02[\u0115\x02\\\u0117\x02]\u0119\x02\x02\u011B\x02\x02" + - "\u011D\x02\x02\u011F\x02\x02\u0121\x02^\u0123\x02_\u0125\x02`\u0127\x02" + - "\x02\u0129\x02a\u012B\x02b\u012D\x02c\u012F\x02d\u0131\x02e\u0133\x02" + - "\x02\u0135\x02f\u0137\x02g\u0139\x02h\u013B\x02i\u013D\x02j\u013F\x02" + - "\x02\u0141\x02\x02\u0143\x02\x02\u0145\x02\x02\u0147\x02\x02\u0149\x02" + - "\x02\u014B\x02\x02\u014D\x02\x02\u014F\x02\x02\u0151\x02\x02\u0153\x02" + - "\x02\u0155\x02\x02\u0157\x02\x02\u0159\x02\x02\u015B\x02\x02\u015D\x02" + - "\x02\u015F\x02\x02\u0161\x02\x02\u0163\x02\x02\u0165\x02\x02\u0167\x02" + - "\x02\u0169\x02\x02\u016B\x02\x02\u016D\x02\x02\u016F\x02\x02\u0171\x02" + - "\x02\r\x02\x03\x04\x05\x06\x07\b\t\n\v\f(\b\x02\v\f\x0F\x0F\"\"11]]__" + - "\x04\x02\f\f\x0F\x0F\x05\x02\v\f\x0F\x0F\"\"\x03\x022;\x04\x02C\\c|\x07" + - "\x02$$^^ppttvv\x06\x02\f\f\x0F\x0F$$^^\x04\x02GGgg\x04\x02--//\x03\x02" + - "bb\f\x02\v\f\x0F\x0F\"\"..11??]]__bb~~\x04\x02,,11\r\x02\v\f\x0F\x0F\"" + - "\"$%..11<<>>@A^^~~\x04\x02CCcc\x04\x02DDdd\x04\x02EEee\x04\x02FFff\x04" + - "\x02HHhh\x04\x02IIii\x04\x02JJjj\x04\x02KKkk\x04\x02LLll\x04\x02MMmm\x04" + - "\x02NNnn\x04\x02OOoo\x04\x02PPpp\x04\x02QQqq\x04\x02RRrr\x04\x02SSss\x04" + - "\x02TTtt\x04\x02UUuu\x04\x02VVvv\x04\x02WWww\x04\x02XXxx\x04\x02YYyy\x04" + - "\x02ZZzz\x04\x02[[{{\x04\x02\\\\||\x02\u04EF\x02\r\x03\x02\x02\x02\x02" + - "\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02\x13\x03\x02\x02\x02\x02" + - "\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02\x19\x03\x02\x02\x02\x02" + - "\x1B\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02\x1F\x03\x02\x02\x02\x02" + - "!\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03\x02\x02\x02\x02\'\x03" + - "\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02\x02\x02-\x03\x02\x02" + - "\x02\x02/\x03\x02\x02\x02\x021\x03\x02\x02\x02\x023\x03\x02\x02\x02\x02" + - "5\x03\x02\x02\x02\x027\x03\x02\x02\x02\x039\x03\x02\x02\x02\x03;\x03\x02" + - "\x02\x02\x03=\x03\x02\x02\x02\x03?\x03\x02\x02\x02\x03A\x03\x02\x02\x02" + - "\x04C\x03\x02\x02\x02\x04Y\x03\x02\x02\x02\x04[\x03\x02\x02\x02\x04]\x03" + - "\x02\x02\x02\x04_\x03\x02\x02\x02\x04a\x03\x02\x02\x02\x04c\x03\x02\x02" + - "\x02\x04e\x03\x02\x02\x02\x04g\x03\x02\x02\x02\x04i\x03\x02\x02\x02\x04" + - "k\x03\x02\x02\x02\x04m\x03\x02\x02\x02\x04o\x03\x02\x02\x02\x04q\x03\x02" + - "\x02\x02\x04s\x03\x02\x02\x02\x04u\x03\x02\x02\x02\x04w\x03\x02\x02\x02" + - "\x04y\x03\x02\x02\x02\x04{\x03\x02\x02\x02\x04}\x03\x02\x02\x02\x04\x7F" + - "\x03\x02\x02\x02\x04\x81\x03\x02\x02\x02\x04\x83\x03\x02\x02\x02\x04\x85" + - "\x03\x02\x02\x02\x04\x87\x03\x02\x02\x02\x04\x89\x03\x02\x02\x02\x04\x8B" + - "\x03\x02\x02\x02\x04\x8D\x03\x02\x02\x02\x04\x8F\x03\x02\x02\x02\x04\x91" + - "\x03\x02\x02\x02\x04\x93\x03\x02\x02\x02\x04\x95\x03\x02\x02\x02\x04\x97" + - "\x03\x02\x02\x02\x04\x99\x03\x02\x02\x02\x04\x9B\x03\x02\x02\x02\x04\x9D" + - "\x03\x02\x02\x02\x04\x9F\x03\x02\x02\x02\x04\xA1\x03\x02\x02\x02\x04\xA3" + - "\x03\x02\x02\x02\x04\xA5\x03\x02\x02\x02\x04\xA7\x03\x02\x02\x02\x04\xA9" + - "\x03\x02\x02\x02\x04\xAB\x03\x02\x02\x02\x04\xAD\x03\x02\x02\x02\x05\xAF" + - "\x03\x02\x02\x02\x05\xB1\x03\x02\x02\x02\x05\xB3\x03\x02\x02\x02\x05\xB5" + - "\x03\x02\x02\x02\x05\xB7\x03\x02\x02\x02\x05\xB9\x03\x02\x02\x02\x05\xBD" + - "\x03\x02\x02\x02\x05\xBF\x03\x02\x02\x02\x05\xC1\x03\x02\x02\x02\x05\xC3" + - "\x03\x02\x02\x02\x05\xC5\x03\x02\x02\x02\x06\xC7\x03\x02\x02\x02\x06\xC9" + - "\x03\x02\x02\x02\x06\xCB\x03\x02\x02\x02\x06\xCF\x03\x02\x02\x02\x06\xD1" + - "\x03\x02\x02\x02\x06\xD3\x03\x02\x02\x02\x06\xD5\x03\x02\x02\x02\x06\xD7" + - "\x03\x02\x02\x02\x06\xD9\x03\x02\x02\x02\x07\xDB\x03\x02\x02\x02\x07\xDD" + - "\x03\x02\x02\x02\x07\xDF\x03\x02\x02\x02\x07\xE1\x03\x02\x02\x02\x07\xE3" + - "\x03\x02\x02\x02\x07\xE5\x03\x02\x02\x02\x07\xE7\x03\x02\x02\x02\x07\xE9" + - "\x03\x02\x02\x02\x07\xEB\x03\x02\x02\x02\x07\xED\x03\x02\x02\x02\b\xEF" + - "\x03\x02\x02\x02\b\xF1\x03\x02\x02\x02\b\xF3\x03\x02\x02\x02\b\xF5\x03" + - "\x02\x02\x02\b\xF9\x03\x02\x02\x02\b\xFB\x03\x02\x02\x02\b\xFD\x03\x02" + - "\x02\x02\b\xFF\x03\x02\x02\x02\b\u0101\x03\x02\x02\x02\b\u0103\x03\x02" + - "\x02\x02\t\u0105\x03\x02\x02\x02\t\u0107\x03\x02\x02\x02\t\u0109\x03\x02" + - "\x02\x02\t\u010B\x03\x02\x02\x02\t\u010D\x03\x02\x02\x02\t\u010F\x03\x02" + - "\x02\x02\t\u0111\x03\x02\x02\x02\t\u0113\x03\x02\x02\x02\t\u0115\x03\x02" + - "\x02\x02\t\u0117\x03\x02\x02\x02\n\u0119\x03\x02\x02\x02\n\u011B\x03\x02" + - "\x02\x02\n\u011D\x03\x02\x02\x02\n\u011F\x03\x02\x02\x02\n\u0121\x03\x02" + - "\x02\x02\n\u0123\x03\x02\x02\x02\n\u0125\x03\x02\x02\x02\v\u0127\x03\x02" + - "\x02\x02\v\u0129\x03\x02\x02\x02\v\u012B\x03\x02\x02\x02\v\u012D\x03\x02" + - "\x02\x02\v\u012F\x03\x02\x02\x02\v\u0131\x03\x02\x02\x02\f\u0133\x03\x02" + - "\x02\x02\f\u0135\x03\x02\x02\x02\f\u0137\x03\x02\x02\x02\f\u0139\x03\x02" + - "\x02\x02\f\u013B\x03\x02\x02\x02\f\u013D\x03\x02\x02\x02\r\u0173\x03\x02" + - "\x02\x02\x0F\u017D\x03\x02\x02\x02\x11\u0184\x03\x02\x02\x02\x13\u018D" + - "\x03\x02\x02\x02\x15\u0194\x03\x02\x02\x02\x17\u019E\x03\x02\x02\x02\x19" + - "\u01A5\x03\x02\x02\x02\x1B\u01AC\x03\x02\x02\x02\x1D\u01BA\x03\x02\x02" + - "\x02\x1F\u01C1\x03\x02\x02\x02!\u01C9\x03\x02\x02\x02#\u01D5\x03\x02\x02" + - "\x02%\u01DF\x03\x02\x02\x02\'\u01E8\x03\x02\x02\x02)\u01EE\x03\x02\x02" + - "\x02+\u01F5\x03\x02\x02\x02-\u01FC\x03\x02\x02\x02/\u0204\x03\x02\x02" + - "\x021\u020D\x03\x02\x02\x023\u0213\x03\x02\x02\x025\u0224\x03\x02\x02" + - "\x027\u0234\x03\x02\x02\x029\u023A\x03\x02\x02\x02;\u023F\x03\x02\x02" + - "\x02=\u0244\x03\x02\x02\x02?\u0248\x03\x02\x02\x02A\u024C\x03\x02\x02" + - "\x02C\u0250\x03\x02\x02\x02E\u0254\x03\x02\x02\x02G\u0256\x03\x02\x02" + - "\x02I\u0258\x03\x02\x02\x02K\u025B\x03\x02\x02\x02M\u025D\x03\x02\x02" + - "\x02O\u0266\x03\x02\x02\x02Q\u0268\x03\x02\x02\x02S\u026D\x03\x02\x02" + - "\x02U\u026F\x03\x02\x02\x02W\u0274\x03\x02\x02\x02Y\u0293\x03\x02\x02" + - "\x02[\u0296\x03\x02\x02\x02]\u02C4\x03\x02\x02\x02_\u02C6\x03\x02\x02" + - "\x02a\u02C9\x03\x02\x02\x02c\u02CD\x03\x02\x02\x02e\u02D1\x03\x02\x02" + - "\x02g\u02D3\x03\x02\x02\x02i\u02D5\x03\x02\x02\x02k\u02DA\x03\x02\x02" + - "\x02m\u02DC\x03\x02\x02\x02o\u02E2\x03\x02\x02\x02q\u02E8\x03\x02\x02" + - "\x02s\u02ED\x03\x02\x02\x02u\u02EF\x03\x02\x02\x02w\u02F2\x03\x02\x02" + - "\x02y\u02F5\x03\x02\x02\x02{\u02FA\x03\x02\x02\x02}\u02FE\x03\x02\x02" + - "\x02\x7F\u0303\x03\x02\x02\x02\x81\u0309\x03\x02\x02\x02\x83\u030C\x03" + - "\x02\x02\x02\x85\u030E\x03\x02\x02\x02\x87\u0314\x03\x02\x02\x02\x89\u0316" + - "\x03\x02\x02\x02\x8B\u031B\x03\x02\x02\x02\x8D\u031E\x03\x02\x02\x02\x8F" + - "\u0321\x03\x02\x02\x02\x91\u0323\x03\x02\x02\x02\x93\u0326\x03\x02\x02" + - "\x02\x95\u0328\x03\x02\x02\x02\x97\u032B\x03\x02\x02\x02\x99\u032D\x03" + - "\x02\x02\x02\x9B\u032F\x03\x02\x02\x02\x9D\u0331\x03\x02\x02\x02\x9F\u0333" + - "\x03\x02\x02\x02\xA1\u0335\x03\x02\x02\x02\xA3\u033A\x03\x02\x02\x02\xA5" + - "\u034F\x03\x02\x02\x02\xA7\u0351\x03\x02\x02\x02\xA9\u0359\x03\x02\x02" + - "\x02\xAB\u035D\x03\x02\x02\x02\xAD\u0361\x03\x02\x02\x02\xAF\u0365\x03" + - "\x02\x02\x02\xB1\u036A\x03\x02\x02\x02\xB3\u036E\x03\x02\x02\x02\xB5\u0372" + - "\x03\x02\x02\x02\xB7\u0376\x03\x02\x02\x02\xB9\u037A\x03\x02\x02\x02\xBB" + - "\u0386\x03\x02\x02\x02\xBD\u0389\x03\x02\x02\x02\xBF\u038D\x03\x02\x02" + - "\x02\xC1\u0391\x03\x02\x02\x02\xC3\u0395\x03\x02\x02\x02\xC5\u0399\x03" + - "\x02\x02\x02\xC7\u039D\x03\x02\x02\x02\xC9\u03A2\x03\x02\x02\x02\xCB\u03A6" + - "\x03\x02\x02\x02\xCD\u03AE\x03\x02\x02\x02\xCF\u03C3\x03\x02\x02\x02\xD1" + - "\u03C5\x03\x02\x02\x02\xD3\u03C9\x03\x02\x02\x02\xD5\u03CD\x03\x02\x02" + - "\x02\xD7\u03D1\x03\x02\x02\x02\xD9\u03D5\x03\x02\x02\x02\xDB\u03D9\x03" + - "\x02\x02\x02\xDD\u03DE\x03\x02\x02\x02\xDF\u03E2\x03\x02\x02\x02\xE1\u03E6" + - "\x03\x02\x02\x02\xE3\u03EA\x03\x02\x02\x02\xE5\u03ED\x03\x02\x02\x02\xE7" + - "\u03F1\x03\x02\x02\x02\xE9\u03F5\x03\x02\x02\x02\xEB\u03F9\x03\x02\x02" + - "\x02\xED\u03FD\x03\x02\x02\x02\xEF\u0401\x03\x02\x02\x02\xF1\u0406\x03" + - "\x02\x02\x02\xF3\u040B\x03\x02\x02\x02\xF5\u0410\x03\x02\x02\x02\xF7\u0417" + - "\x03\x02\x02\x02\xF9\u041B\x03\x02\x02\x02\xFB\u0423\x03\x02\x02\x02\xFD" + - "\u0427\x03\x02\x02\x02\xFF\u042B\x03\x02"; + "\t\xB4\x04\xB5\t\xB5\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" + + "\x02\x03\x02\x03\x02\x03\x02\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" + + "\x03\x03\x03\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" + + "\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + + "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03" + + "\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\b\x03" + + "\b\x03\b\x03\b\x03\b\x03\b\x03\b\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03" + + "\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\n\x03\n\x03\n\x03\n\x03" + + "\n\x03\n\x03\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\f\x03" + + "\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\r\x03" + + "\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\x0E\x03\x0E\x03" + + "\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03" + + "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x10\x03\x10\x03\x10\x03\x10\x03\x10\x03" + + "\x10\x03\x10\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03" + + "\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x13\x03" + + "\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x14\x06\x14\u0210" + + "\n\x14\r\x14\x0E\x14\u0211\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03" + + "\x15\x07\x15\u021A\n\x15\f\x15\x0E\x15\u021D\v\x15\x03\x15\x05\x15\u0220" + + "\n\x15\x03\x15\x05\x15\u0223\n\x15\x03\x15\x03\x15\x03\x16\x03\x16\x03" + + "\x16\x03\x16\x03\x16\x07\x16\u022C\n\x16\f\x16\x0E\x16\u022F\v\x16\x03" + + "\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x17\x06\x17\u0237\n\x17\r\x17" + + "\x0E\x17\u0238\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x19\x03\x19\x03\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x03\x1A\x03\x1A" + + "\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1D" + + "\x03\x1D\x03\x1D\x03\x1D\x03\x1E\x03\x1E\x03\x1F\x03\x1F\x03 \x03 \x03" + + " \x03!\x03!\x03\"\x03\"\x05\"\u0262\n\"\x03\"\x06\"\u0265\n\"\r\"\x0E" + + "\"\u0266\x03#\x03#\x03$\x03$\x03%\x03%\x03%\x05%\u0270\n%\x03&\x03&\x03" + + "\'\x03\'\x03\'\x05\'\u0277\n\'\x03(\x03(\x03(\x07(\u027C\n(\f(\x0E(\u027F" + + "\v(\x03(\x03(\x03(\x03(\x03(\x03(\x07(\u0287\n(\f(\x0E(\u028A\v(\x03(" + + "\x03(\x03(\x03(\x03(\x05(\u0291\n(\x03(\x05(\u0294\n(\x05(\u0296\n(\x03" + + ")\x06)\u0299\n)\r)\x0E)\u029A\x03*\x06*\u029E\n*\r*\x0E*\u029F\x03*\x03" + + "*\x07*\u02A4\n*\f*\x0E*\u02A7\v*\x03*\x03*\x06*\u02AB\n*\r*\x0E*\u02AC" + + "\x03*\x06*\u02B0\n*\r*\x0E*\u02B1\x03*\x03*\x07*\u02B6\n*\f*\x0E*\u02B9" + + "\v*\x05*\u02BB\n*\x03*\x03*\x03*\x03*\x06*\u02C1\n*\r*\x0E*\u02C2\x03" + + "*\x03*\x05*\u02C7\n*\x03+\x03+\x03+\x03,\x03,\x03,\x03,\x03-\x03-\x03" + + "-\x03-\x03.\x03.\x03/\x03/\x030\x030\x030\x030\x030\x031\x031\x032\x03" + + "2\x032\x032\x032\x032\x033\x033\x033\x033\x033\x033\x034\x034\x034\x03" + + "4\x034\x035\x035\x036\x036\x036\x037\x037\x037\x038\x038\x038\x038\x03" + + "8\x039\x039\x039\x039\x03:\x03:\x03:\x03:\x03:\x03;\x03;\x03;\x03;\x03" + + ";\x03;\x03<\x03<\x03<\x03=\x03=\x03>\x03>\x03>\x03>\x03>\x03>\x03?\x03" + + "?\x03@\x03@\x03@\x03@\x03@\x03A\x03A\x03A\x03B\x03B\x03B\x03C\x03C\x03" + + "C\x03D\x03D\x03E\x03E\x03E\x03F\x03F\x03G\x03G\x03G\x03H\x03H\x03I\x03" + + "I\x03J\x03J\x03K\x03K\x03L\x03L\x03M\x03M\x03M\x03M\x03M\x03N\x03N\x03" + + "N\x03N\x03N\x03O\x03O\x07O\u0347\nO\fO\x0EO\u034A\vO\x03O\x03O\x05O\u034E" + + "\nO\x03O\x06O\u0351\nO\rO\x0EO\u0352\x05O\u0355\nO\x03P\x03P\x06P\u0359" + + "\nP\rP\x0EP\u035A\x03P\x03P\x03Q\x03Q\x03Q\x03Q\x03R\x03R\x03R\x03R\x03" + + "S\x03S\x03S\x03S\x03T\x03T\x03T\x03T\x03T\x03U\x03U\x03U\x03U\x03V\x03" + + "V\x03V\x03V\x03W\x03W\x03W\x03W\x03X\x03X\x03X\x03X\x03Y\x03Y\x03Y\x03" + + "Y\x03Y\x03Y\x03Y\x03Y\x03Y\x03Z\x03Z\x03Z\x05Z\u038C\nZ\x03[\x06[\u038F" + + "\n[\r[\x0E[\u0390\x03\\\x03\\\x03\\\x03\\\x03]\x03]\x03]\x03]\x03^\x03" + + "^\x03^\x03^\x03_\x03_\x03_\x03_\x03`\x03`\x03`\x03`\x03`\x03a\x03a\x03" + + "a\x03a\x03b\x03b\x03b\x03b\x03c\x03c\x03c\x03c\x05c\u03B4\nc\x03d\x03" + + "d\x05d\u03B8\nd\x03d\x07d\u03BB\nd\fd\x0Ed\u03BE\vd\x03d\x03d\x05d\u03C2" + + "\nd\x03d\x06d\u03C5\nd\rd\x0Ed\u03C6\x05d\u03C9\nd\x03e\x03e\x03e\x03" + + "e\x03f\x03f\x03f\x03f\x03g\x03g\x03g\x03g\x03h\x03h\x03h\x03h\x03i\x03" + + "i\x03i\x03i\x03j\x03j\x03j\x03j\x03j\x03k\x03k\x03k\x03k\x03l\x03l\x03" + + "l\x03l\x03m\x03m\x03m\x03m\x03n\x03n\x03n\x03o\x03o\x03o\x03o\x03p\x03" + + "p\x03p\x03p\x03q\x03q\x03q\x03q\x03r\x03r\x03r\x03r\x03s\x03s\x03s\x03" + + "s\x03t\x03t\x03t\x03t\x03t\x03u\x03u\x03u\x03u\x03u\x03v\x03v\x03v\x03" + + "v\x03v\x03w\x03w\x03w\x03w\x03w\x03w\x03w\x03x\x03x\x03y\x03y\x05y\u0421" + + "\ny\x03y\x07y\u0424\ny\fy\x0Ey\u0427\vy\x03z\x03z\x03z\x03z\x03{\x03{" + + "\x03{\x03{\x03|\x03|\x03|\x03|\x03}\x03}\x03}\x03}\x03~\x03~\x03~\x03" + + "~\x03\x7F\x03\x7F\x03\x7F\x03\x7F\x03\x7F\x03\x7F\x03\x80\x03\x80\x03" + + "\x80\x03\x80\x03\x81\x03\x81\x03\x81\x03\x81\x03\x82\x03\x82\x03\x82\x03" + + "\x82\x03\x83\x03\x83\x03\x83\x03\x83\x03\x84\x03\x84\x03\x84\x03\x84\x03" + + "\x85\x03\x85\x03\x85\x03\x85\x03\x86\x03\x86\x03\x86\x03\x86\x03\x87\x03" + + "\x87\x03\x87\x03\x87\x03\x88\x03\x88\x03\x88\x03\x88\x03\x89\x03\x89\x03" + + "\x89\x03\x89\x03\x89\x03\x8A\x03\x8A\x03\x8A\x03\x8A\x03\x8B\x03\x8B\x03" + + "\x8B\x03\x8B\x03\x8C\x03\x8C\x03\x8C\x03\x8C\x03\x8D\x03\x8D\x03\x8D\x03" + + "\x8D\x03\x8E\x03\x8E\x03\x8E\x03\x8E\x03\x8F\x03\x8F\x03\x8F\x03\x8F\x03" + + "\x90\x03\x90\x03\x90\x03\x90\x03\x90\x03\x91\x03\x91\x03\x91\x03\x91\x03" + + "\x91\x03\x92\x03\x92\x03\x92\x03\x92\x03\x92\x03\x92\x03\x92\x03\x92\x03" + + "\x92\x03\x92\x03\x93\x03\x93\x03\x93\x03\x93\x03\x94\x03\x94\x03\x94\x03" + + "\x94\x03\x95\x03\x95\x03\x95\x03\x95\x03\x96\x03\x96\x03\x96\x03\x96\x03" + + "\x96\x03\x97\x03\x97\x03\x98\x03\x98\x03\x98\x03\x98\x03\x98\x06\x98\u04B0" + + "\n\x98\r\x98\x0E\x98\u04B1\x03\x99\x03\x99\x03\x99\x03\x99\x03\x9A\x03" + + "\x9A\x03\x9A\x03\x9A\x03\x9B\x03\x9B\x03\x9B\x03\x9B\x03\x9C\x03\x9C\x03" + + "\x9D\x03\x9D\x03\x9E\x03\x9E\x03\x9F\x03\x9F\x03\xA0\x03\xA0\x03\xA1\x03" + + "\xA1\x03\xA2\x03\xA2\x03\xA3\x03\xA3\x03\xA4\x03\xA4\x03\xA5\x03\xA5\x03" + + "\xA6\x03\xA6\x03\xA7\x03\xA7\x03\xA8\x03\xA8\x03\xA9\x03\xA9\x03\xAA\x03" + + "\xAA\x03\xAB\x03\xAB\x03\xAC\x03\xAC\x03\xAD\x03\xAD\x03\xAE\x03\xAE\x03" + + "\xAF\x03\xAF\x03\xB0\x03\xB0\x03\xB1\x03\xB1\x03\xB2\x03\xB2\x03\xB3\x03" + + "\xB3\x03\xB4\x03\xB4\x03\xB5\x03\xB5\x04\u022D\u0288\x02\x02\xB6\r\x02" + + "\x03\x0F\x02\x04\x11\x02\x05\x13\x02\x06\x15\x02\x07\x17\x02\b\x19\x02" + + "\t\x1B\x02\n\x1D\x02\v\x1F\x02\f!\x02\r#\x02\x0E%\x02\x0F\'\x02\x10)\x02" + + "\x11+\x02\x12-\x02\x13/\x02\x141\x02\x153\x02\x165\x02\x177\x02\x189\x02" + + "\x02;\x02\x02=\x02\x19?\x02\x1AA\x02\x1BC\x02\x1CE\x02\x02G\x02\x02I\x02" + + "\x02K\x02\x02M\x02\x02O\x02\x02Q\x02\x02S\x02\x02U\x02\x02W\x02\x02Y\x02" + + "\x1D[\x02\x1E]\x02\x1F_\x02 a\x02!c\x02\"e\x02#g\x02$i\x02%k\x02&m\x02" + + "\'o\x02(q\x02)s\x02*u\x02+w\x02,y\x02-{\x02.}\x02/\x7F\x020\x81\x021\x83" + + "\x022\x85\x023\x87\x024\x89\x025\x8B\x026\x8D\x027\x8F\x028\x91\x029\x93" + + "\x02:\x95\x02;\x97\x02<\x99\x02=\x9B\x02>\x9D\x02?\x9F\x02@\xA1\x02A\xA3" + + "\x02B\xA5\x02C\xA7\x02D\xA9\x02E\xAB\x02F\xAD\x02G\xAF\x02H\xB1\x02\x02" + + "\xB3\x02\x02\xB5\x02\x02\xB7\x02\x02\xB9\x02\x02\xBB\x02I\xBD\x02\x02" + + "\xBF\x02J\xC1\x02\x02\xC3\x02K\xC5\x02L\xC7\x02M\xC9\x02\x02\xCB\x02\x02" + + "\xCD\x02\x02\xCF\x02\x02\xD1\x02N\xD3\x02\x02\xD5\x02\x02\xD7\x02O\xD9" + + "\x02P\xDB\x02Q\xDD\x02\x02\xDF\x02\x02\xE1\x02\x02\xE3\x02\x02\xE5\x02" + + "R\xE7\x02\x02\xE9\x02\x02\xEB\x02S\xED\x02T\xEF\x02U\xF1\x02\x02\xF3\x02" + + "\x02\xF5\x02V\xF7\x02W\xF9\x02\x02\xFB\x02X\xFD\x02\x02\xFF\x02\x02\u0101" + + "\x02Y\u0103\x02Z\u0105\x02[\u0107\x02\x02\u0109\x02\x02\u010B\x02\x02" + + "\u010D\x02\x02\u010F\x02\x02\u0111\x02\x02\u0113\x02\x02\u0115\x02\\\u0117" + + "\x02]\u0119\x02^\u011B\x02\x02\u011D\x02\x02\u011F\x02\x02\u0121\x02\x02" + + "\u0123\x02_\u0125\x02`\u0127\x02a\u0129\x02\x02\u012B\x02b\u012D\x02c" + + "\u012F\x02d\u0131\x02e\u0133\x02f\u0135\x02\x02\u0137\x02g\u0139\x02h" + + "\u013B\x02i\u013D\x02j\u013F\x02k\u0141\x02\x02\u0143\x02\x02\u0145\x02" + + "\x02\u0147\x02\x02\u0149\x02\x02\u014B\x02\x02\u014D\x02\x02\u014F\x02" + + "\x02\u0151\x02\x02\u0153\x02\x02\u0155\x02\x02\u0157\x02\x02\u0159\x02" + + "\x02\u015B\x02\x02\u015D\x02\x02\u015F\x02\x02\u0161\x02\x02\u0163\x02" + + "\x02\u0165\x02\x02\u0167\x02\x02\u0169\x02\x02\u016B\x02\x02\u016D\x02" + + "\x02\u016F\x02\x02\u0171\x02\x02\u0173\x02\x02\r\x02\x03\x04\x05\x06\x07" + + "\b\t\n\v\f(\b\x02\v\f\x0F\x0F\"\"11]]__\x04\x02\f\f\x0F\x0F\x05\x02\v" + + "\f\x0F\x0F\"\"\x03\x022;\x04\x02C\\c|\x07\x02$$^^ppttvv\x06\x02\f\f\x0F" + + "\x0F$$^^\x04\x02GGgg\x04\x02--//\x03\x02bb\f\x02\v\f\x0F\x0F\"\"..11?" + + "?]]__bb~~\x04\x02,,11\r\x02\v\f\x0F\x0F\"\"$%..11<<>>@A^^~~\x04\x02CC" + + "cc\x04\x02DDdd\x04\x02EEee\x04\x02FFff\x04\x02HHhh\x04\x02IIii\x04\x02" + + "JJjj\x04\x02KKkk\x04\x02LLll\x04\x02MMmm\x04\x02NNnn\x04\x02OOoo\x04\x02" + + "PPpp\x04\x02QQqq\x04\x02RRrr\x04\x02SSss\x04\x02TTtt\x04\x02UUuu\x04\x02" + + "VVvv\x04\x02WWww\x04\x02XXxx\x04\x02YYyy\x04\x02ZZzz\x04\x02[[{{\x04\x02" + + "\\\\||\x02\u04F4\x02\r\x03\x02\x02\x02\x02\x0F\x03\x02\x02\x02\x02\x11" + + "\x03\x02\x02\x02\x02\x13\x03\x02\x02\x02\x02\x15\x03\x02\x02\x02\x02\x17" + + "\x03\x02\x02\x02\x02\x19\x03\x02\x02\x02\x02\x1B\x03\x02\x02\x02\x02\x1D" + + "\x03\x02\x02\x02\x02\x1F\x03\x02\x02\x02\x02!\x03\x02\x02\x02\x02#\x03" + + "\x02\x02\x02\x02%\x03\x02\x02\x02\x02\'\x03\x02\x02\x02\x02)\x03\x02\x02" + + "\x02\x02+\x03\x02\x02\x02\x02-\x03\x02\x02\x02\x02/\x03\x02\x02\x02\x02" + + "1\x03\x02\x02\x02\x023\x03\x02\x02\x02\x025\x03\x02\x02\x02\x027\x03\x02" + + "\x02\x02\x039\x03\x02\x02\x02\x03;\x03\x02\x02\x02\x03=\x03\x02\x02\x02" + + "\x03?\x03\x02\x02\x02\x03A\x03\x02\x02\x02\x04C\x03\x02\x02\x02\x04Y\x03" + + "\x02\x02\x02\x04[\x03\x02\x02\x02\x04]\x03\x02\x02\x02\x04_\x03\x02\x02" + + "\x02\x04a\x03\x02\x02\x02\x04c\x03\x02\x02\x02\x04e\x03\x02\x02\x02\x04" + + "g\x03\x02\x02\x02\x04i\x03\x02\x02\x02\x04k\x03\x02\x02\x02\x04m\x03\x02" + + "\x02\x02\x04o\x03\x02\x02\x02\x04q\x03\x02\x02\x02\x04s\x03\x02\x02\x02" + + "\x04u\x03\x02\x02\x02\x04w\x03\x02\x02\x02\x04y\x03\x02\x02\x02\x04{\x03" + + "\x02\x02\x02\x04}\x03\x02\x02\x02\x04\x7F\x03\x02\x02\x02\x04\x81\x03" + + "\x02\x02\x02\x04\x83\x03\x02\x02\x02\x04\x85\x03\x02\x02\x02\x04\x87\x03" + + "\x02\x02\x02\x04\x89\x03\x02\x02\x02\x04\x8B\x03\x02\x02\x02\x04\x8D\x03" + + "\x02\x02\x02\x04\x8F\x03\x02\x02\x02\x04\x91\x03\x02\x02\x02\x04\x93\x03" + + "\x02\x02\x02\x04\x95\x03\x02\x02\x02\x04\x97\x03\x02\x02\x02\x04\x99\x03" + + "\x02\x02\x02\x04\x9B\x03\x02\x02\x02\x04\x9D\x03\x02\x02\x02\x04\x9F\x03" + + "\x02\x02\x02\x04\xA1\x03\x02\x02\x02\x04\xA3\x03\x02\x02\x02\x04\xA5\x03" + + "\x02\x02\x02\x04\xA7\x03\x02\x02\x02\x04\xA9\x03\x02\x02\x02\x04\xAB\x03" + + "\x02\x02\x02\x04\xAD\x03\x02\x02\x02\x04\xAF\x03\x02\x02\x02\x05\xB1\x03" + + "\x02\x02\x02\x05\xB3\x03\x02\x02\x02\x05\xB5\x03\x02\x02\x02\x05\xB7\x03" + + "\x02\x02\x02\x05\xB9\x03\x02\x02\x02\x05\xBB\x03\x02\x02\x02\x05\xBF\x03" + + "\x02\x02\x02\x05\xC1\x03\x02\x02\x02\x05\xC3\x03\x02\x02\x02\x05\xC5\x03" + + "\x02\x02\x02\x05\xC7\x03\x02\x02\x02\x06\xC9\x03\x02\x02\x02\x06\xCB\x03" + + "\x02\x02\x02\x06\xCD\x03\x02\x02\x02\x06\xD1\x03\x02\x02\x02\x06\xD3\x03" + + "\x02\x02\x02\x06\xD5\x03\x02\x02\x02\x06\xD7\x03\x02\x02\x02\x06\xD9\x03" + + "\x02\x02\x02\x06\xDB\x03\x02\x02\x02\x07\xDD\x03\x02\x02\x02\x07\xDF\x03" + + "\x02\x02\x02\x07\xE1\x03\x02\x02\x02\x07\xE3\x03\x02\x02\x02\x07\xE5\x03" + + "\x02\x02\x02\x07\xE7\x03\x02\x02\x02\x07\xE9\x03\x02\x02\x02\x07\xEB\x03" + + "\x02\x02\x02\x07\xED\x03\x02\x02\x02\x07\xEF\x03\x02\x02\x02\b\xF1\x03" + + "\x02\x02\x02\b\xF3\x03\x02\x02\x02\b\xF5\x03\x02\x02\x02\b\xF7\x03\x02" + + "\x02\x02\b\xFB\x03\x02\x02\x02\b\xFD\x03\x02\x02\x02\b\xFF\x03\x02\x02" + + "\x02\b\u0101\x03\x02\x02\x02\b\u0103\x03\x02\x02\x02\b\u0105\x03\x02\x02" + + "\x02\t\u0107\x03\x02\x02\x02\t\u0109\x03\x02\x02\x02\t\u010B\x03\x02\x02" + + "\x02\t\u010D\x03\x02\x02\x02\t\u010F\x03\x02\x02\x02\t\u0111\x03\x02\x02" + + "\x02\t\u0113\x03\x02\x02\x02\t\u0115\x03\x02\x02\x02\t\u0117\x03\x02\x02" + + "\x02\t\u0119\x03\x02\x02\x02\n\u011B\x03\x02\x02\x02\n\u011D\x03\x02\x02" + + "\x02\n\u011F\x03\x02\x02\x02\n\u0121\x03\x02\x02\x02\n\u0123\x03\x02\x02" + + "\x02\n\u0125\x03\x02\x02\x02\n\u0127\x03\x02\x02\x02\v\u0129\x03\x02\x02" + + "\x02\v\u012B\x03\x02\x02\x02\v\u012D\x03\x02\x02\x02\v\u012F\x03\x02\x02" + + "\x02\v\u0131\x03\x02\x02\x02\v\u0133\x03\x02\x02\x02\f\u0135\x03\x02\x02" + + "\x02\f\u0137\x03\x02\x02\x02\f\u0139\x03\x02\x02\x02\f\u013B\x03\x02\x02" + + "\x02\f\u013D\x03\x02\x02\x02\f\u013F\x03\x02\x02\x02\r\u0175\x03\x02\x02" + + "\x02\x0F\u017F\x03\x02\x02\x02\x11\u0186\x03\x02\x02\x02\x13\u018F\x03" + + "\x02\x02\x02\x15\u0196\x03\x02\x02\x02\x17\u01A0\x03\x02\x02\x02\x19\u01A7" + + "\x03\x02\x02\x02\x1B\u01AE\x03\x02\x02\x02\x1D\u01BC\x03\x02\x02\x02\x1F" + + "\u01C3\x03\x02\x02\x02!\u01CB\x03\x02\x02\x02#\u01D7\x03\x02\x02\x02%" + + "\u01E1\x03\x02\x02\x02\'\u01EA\x03\x02\x02\x02)\u01F0\x03\x02\x02\x02" + + "+\u01F7\x03\x02\x02\x02-\u01FE\x03\x02\x02\x02/\u0206\x03\x02\x02\x02" + + "1\u020F\x03\x02\x02\x023\u0215\x03\x02\x02\x025\u0226\x03\x02\x02\x02" + + "7\u0236\x03\x02\x02\x029\u023C\x03\x02\x02\x02;\u0241\x03\x02\x02\x02" + + "=\u0246\x03\x02\x02\x02?\u024A\x03\x02\x02\x02A\u024E\x03\x02\x02\x02" + + "C\u0252\x03\x02\x02\x02E\u0256\x03\x02\x02\x02G\u0258\x03\x02\x02\x02" + + "I\u025A\x03\x02\x02\x02K\u025D\x03\x02\x02\x02M\u025F\x03\x02\x02\x02" + + "O\u0268\x03\x02\x02\x02Q\u026A\x03\x02\x02\x02S\u026F\x03\x02\x02\x02" + + "U\u0271\x03\x02\x02\x02W\u0276\x03\x02\x02\x02Y\u0295\x03\x02\x02\x02" + + "[\u0298\x03\x02\x02\x02]\u02C6\x03\x02\x02\x02_\u02C8\x03\x02\x02\x02" + + "a\u02CB\x03\x02\x02\x02c\u02CF\x03\x02\x02\x02e\u02D3\x03\x02\x02\x02" + + "g\u02D5\x03\x02\x02\x02i\u02D7\x03\x02\x02\x02k\u02DC\x03\x02\x02\x02" + + "m\u02DE\x03\x02\x02\x02o\u02E4\x03\x02\x02\x02q\u02EA\x03\x02\x02\x02" + + "s\u02EF\x03\x02\x02\x02u\u02F1\x03\x02\x02\x02w\u02F4\x03\x02\x02\x02" + + "y\u02F7\x03\x02\x02\x02{\u02FC\x03\x02\x02\x02}\u0300\x03\x02\x02\x02" + + "\x7F\u0305\x03\x02\x02\x02\x81\u030B\x03\x02\x02\x02\x83\u030E\x03\x02" + + "\x02\x02\x85\u0310\x03\x02\x02\x02\x87\u0316\x03\x02\x02\x02\x89\u0318" + + "\x03\x02\x02\x02\x8B\u031D\x03\x02\x02\x02\x8D\u0320\x03\x02\x02\x02\x8F" + + "\u0323\x03\x02\x02\x02\x91\u0326\x03\x02\x02\x02\x93\u0328\x03\x02\x02" + + "\x02\x95\u032B\x03\x02\x02\x02\x97\u032D\x03\x02\x02\x02\x99\u0330\x03" + + "\x02\x02\x02\x9B\u0332\x03\x02\x02\x02\x9D\u0334\x03\x02\x02\x02\x9F\u0336" + + "\x03\x02\x02\x02\xA1\u0338\x03\x02\x02\x02\xA3\u033A\x03\x02\x02\x02\xA5" + + "\u033F\x03\x02\x02\x02\xA7\u0354\x03\x02\x02\x02\xA9\u0356\x03\x02\x02" + + "\x02\xAB\u035E\x03\x02\x02\x02\xAD\u0362\x03\x02\x02\x02\xAF\u0366\x03" + + "\x02\x02\x02\xB1\u036A\x03\x02\x02\x02\xB3\u036F\x03\x02\x02\x02\xB5\u0373" + + "\x03\x02\x02\x02\xB7\u0377\x03\x02\x02\x02\xB9\u037B\x03\x02\x02\x02\xBB" + + "\u037F\x03\x02\x02\x02\xBD\u038B\x03\x02\x02\x02\xBF\u038E\x03\x02\x02" + + "\x02\xC1\u0392\x03\x02\x02\x02\xC3\u0396\x03\x02\x02\x02\xC5\u039A\x03" + + "\x02\x02\x02\xC7\u039E\x03\x02\x02\x02\xC9\u03A2\x03\x02\x02\x02\xCB\u03A7" + + "\x03\x02\x02\x02\xCD\u03AB\x03\x02\x02\x02\xCF\u03B3\x03\x02\x02\x02\xD1" + + "\u03C8\x03\x02\x02\x02\xD3\u03CA\x03\x02\x02\x02\xD5\u03CE\x03\x02\x02" + + "\x02\xD7\u03D2\x03\x02\x02\x02\xD9\u03D6\x03\x02\x02\x02\xDB\u03DA\x03" + + "\x02\x02\x02\xDD\u03DE\x03\x02\x02\x02\xDF\u03E3\x03\x02\x02\x02\xE1\u03E7" + + "\x03\x02\x02\x02\xE3\u03EB\x03\x02\x02\x02\xE5\u03EF\x03\x02\x02\x02\xE7" + + "\u03F2\x03\x02\x02\x02\xE9\u03F6\x03\x02\x02\x02\xEB\u03FA\x03\x02\x02" + + "\x02\xED\u03FE\x03\x02\x02\x02\xEF\u0402\x03\x02\x02\x02\xF1\u0406\x03" + + "\x02\x02\x02\xF3\u040B\x03\x02\x02\x02\xF5\u0410\x03\x02\x02\x02\xF7\u0415" + + "\x03\x02\x02\x02\xF9\u041C\x03"; private static readonly _serializedATNSegment1: string = - "\x02\x02\u0101\u042F\x03\x02\x02\x02\u0103\u0433\x03\x02\x02\x02\u0105" + - "\u0437\x03\x02\x02\x02\u0107\u043D\x03\x02\x02\x02\u0109\u0441\x03\x02" + - "\x02\x02\u010B\u0445\x03\x02\x02\x02\u010D\u0449\x03\x02\x02\x02\u010F" + - "\u044D\x03\x02\x02\x02\u0111\u0451\x03\x02\x02\x02\u0113\u0455\x03\x02" + - "\x02\x02\u0115\u0459\x03\x02\x02\x02\u0117\u045D\x03\x02\x02\x02\u0119" + - "\u0461\x03\x02\x02\x02\u011B\u0466\x03\x02\x02\x02\u011D\u046A\x03\x02" + - "\x02\x02\u011F\u046E\x03\x02\x02\x02\u0121\u0472\x03\x02\x02\x02\u0123" + - "\u0476\x03\x02\x02\x02\u0125\u047A\x03\x02\x02\x02\u0127\u047E\x03\x02" + + "\x02\x02\x02\xFB\u0420\x03\x02\x02\x02\xFD\u0428\x03\x02\x02\x02\xFF\u042C" + + "\x03\x02\x02\x02\u0101\u0430\x03\x02\x02\x02\u0103\u0434\x03\x02\x02\x02" + + "\u0105\u0438\x03\x02\x02\x02\u0107\u043C\x03\x02\x02\x02\u0109\u0442\x03" + + "\x02\x02\x02\u010B\u0446\x03\x02\x02\x02\u010D\u044A\x03\x02\x02\x02\u010F" + + "\u044E\x03\x02\x02\x02\u0111\u0452\x03\x02\x02\x02\u0113\u0456\x03\x02" + + "\x02\x02\u0115\u045A\x03\x02\x02\x02\u0117\u045E\x03\x02\x02\x02\u0119" + + "\u0462\x03\x02\x02\x02\u011B\u0466\x03\x02\x02\x02\u011D\u046B\x03\x02" + + "\x02\x02\u011F\u046F\x03\x02\x02\x02\u0121\u0473\x03\x02\x02\x02\u0123" + + "\u0477\x03\x02\x02\x02\u0125\u047B\x03\x02\x02\x02\u0127\u047F\x03\x02" + "\x02\x02\u0129\u0483\x03\x02\x02\x02\u012B\u0488\x03\x02\x02\x02\u012D" + - "\u0492\x03\x02\x02\x02\u012F\u0496\x03\x02\x02\x02\u0131\u049A\x03\x02" + - "\x02\x02\u0133\u049E\x03\x02\x02\x02\u0135\u04A3\x03\x02\x02\x02\u0137" + - "\u04AA\x03\x02\x02\x02\u0139\u04AE\x03\x02\x02\x02\u013B\u04B2\x03\x02" + - "\x02\x02\u013D\u04B6\x03\x02\x02\x02\u013F\u04BA\x03\x02\x02\x02\u0141" + - "\u04BC\x03\x02\x02\x02\u0143\u04BE\x03\x02\x02\x02\u0145\u04C0\x03\x02" + - "\x02\x02\u0147\u04C2\x03\x02\x02\x02\u0149\u04C4\x03\x02\x02\x02\u014B" + - "\u04C6\x03\x02\x02\x02\u014D\u04C8\x03\x02\x02\x02\u014F\u04CA\x03\x02" + - "\x02\x02\u0151\u04CC\x03\x02\x02\x02\u0153\u04CE\x03\x02\x02\x02\u0155" + - "\u04D0\x03\x02\x02\x02\u0157\u04D2\x03\x02\x02\x02\u0159\u04D4\x03\x02" + - "\x02\x02\u015B\u04D6\x03\x02\x02\x02\u015D\u04D8\x03\x02\x02\x02\u015F" + - "\u04DA\x03\x02\x02\x02\u0161\u04DC\x03\x02\x02\x02\u0163\u04DE\x03\x02" + - "\x02\x02\u0165\u04E0\x03\x02\x02\x02\u0167\u04E2\x03\x02\x02\x02\u0169" + - "\u04E4\x03\x02\x02\x02\u016B\u04E6\x03\x02\x02\x02\u016D\u04E8\x03\x02" + - "\x02\x02\u016F\u04EA\x03\x02\x02\x02\u0171\u04EC\x03\x02\x02\x02\u0173" + - "\u0174\x05\u0145\x9E\x02\u0174\u0175\x05\u014F\xA3\x02\u0175\u0176\x05" + - "\u0163\xAD\x02\u0176\u0177\x05\u0163\xAD\x02\u0177\u0178\x05\u0147\x9F" + - "\x02\u0178\u0179\x05\u0143\x9D\x02\u0179\u017A\x05\u0165\xAE\x02\u017A" + - "\u017B\x03\x02\x02\x02\u017B\u017C\b\x02\x02\x02\u017C\x0E\x03\x02\x02" + - "\x02\u017D\u017E\x05\u0145\x9E\x02\u017E\u017F\x05\u0161\xAC\x02\u017F" + - "\u0180\x05\u015B\xA9\x02\u0180\u0181\x05\u015D\xAA\x02\u0181\u0182\x03" + - "\x02\x02\x02\u0182\u0183\b\x03\x03\x02\u0183\x10\x03\x02\x02\x02\u0184" + - "\u0185\x05\u0147\x9F\x02\u0185\u0186\x05\u0159\xA8\x02\u0186\u0187\x05" + - "\u0161\xAC\x02\u0187\u0188\x05\u014F\xA3\x02\u0188\u0189\x05\u0143\x9D" + - "\x02\u0189\u018A\x05\u014D\xA2\x02\u018A\u018B\x03\x02\x02\x02\u018B\u018C" + - "\b\x04\x04\x02\u018C\x12\x03\x02\x02\x02\u018D\u018E\x05\u0147\x9F\x02" + - "\u018E\u018F\x05\u0169\xB0\x02\u018F\u0190\x05\u013F\x9B\x02\u0190\u0191" + - "\x05\u0155\xA6\x02\u0191\u0192\x03\x02\x02\x02\u0192\u0193\b\x05\x02\x02" + - "\u0193\x14\x03\x02\x02\x02\u0194\u0195\x05\u0147\x9F\x02\u0195\u0196\x05" + - "\u016D\xB2\x02\u0196\u0197\x05\u015D\xAA\x02\u0197\u0198\x05\u0155\xA6" + - "\x02\u0198\u0199\x05\u013F\x9B\x02\u0199\u019A\x05\u014F\xA3\x02\u019A" + - "\u019B\x05\u0159\xA8\x02\u019B\u019C\x03\x02\x02\x02\u019C\u019D\b\x06" + - "\x05\x02\u019D\x16\x03\x02\x02\x02\u019E\u019F\x05\u0149\xA0\x02\u019F" + - "\u01A0\x05\u0161\xAC\x02\u01A0\u01A1\x05\u015B\xA9\x02\u01A1\u01A2\x05" + - "\u0157\xA7\x02\u01A2\u01A3\x03\x02\x02\x02\u01A3\u01A4\b\x07\x06\x02\u01A4" + - "\x18\x03\x02\x02\x02\u01A5\u01A6\x05\u014B\xA1\x02\u01A6\u01A7\x05\u0161" + - "\xAC\x02\u01A7\u01A8\x05\u015B\xA9\x02\u01A8\u01A9\x05\u0153\xA5\x02\u01A9" + - "\u01AA\x03\x02\x02\x02\u01AA\u01AB\b\b\x02\x02\u01AB\x1A\x03\x02\x02\x02" + - "\u01AC\u01AD\x05\u014F\xA3\x02\u01AD\u01AE\x05\u0159\xA8\x02\u01AE\u01AF" + - "\x05\u0155\xA6\x02\u01AF\u01B0\x05\u014F\xA3\x02\u01B0\u01B1\x05\u0159" + - "\xA8\x02\u01B1\u01B2\x05\u0147\x9F\x02\u01B2\u01B3\x05\u0163\xAD\x02\u01B3" + - "\u01B4\x05\u0165\xAE\x02\u01B4\u01B5\x05\u013F\x9B\x02\u01B5\u01B6\x05" + - "\u0165\xAE\x02\u01B6\u01B7\x05\u0163\xAD\x02\u01B7\u01B8\x03\x02\x02\x02" + - "\u01B8\u01B9\b\t\x02\x02\u01B9\x1C\x03\x02\x02\x02\u01BA\u01BB\x05\u0153" + - "\xA5\x02\u01BB\u01BC\x05\u0147\x9F\x02\u01BC\u01BD\x05\u0147\x9F\x02\u01BD" + - "\u01BE\x05\u015D\xAA\x02\u01BE\u01BF\x03\x02\x02\x02\u01BF\u01C0\b\n\x03" + - "\x02\u01C0\x1E\x03\x02\x02\x02\u01C1\u01C2\x05\u0155\xA6\x02\u01C2\u01C3" + - "\x05\u014F\xA3\x02\u01C3\u01C4\x05\u0157\xA7\x02\u01C4\u01C5\x05\u014F" + - "\xA3\x02\u01C5\u01C6\x05\u0165\xAE\x02\u01C6\u01C7\x03\x02\x02\x02\u01C7" + - "\u01C8\b\v\x02\x02\u01C8 \x03\x02\x02\x02\u01C9\u01CA\x05\u0157\xA7\x02" + - "\u01CA\u01CB\x05\u0169\xB0\x02\u01CB\u01CC\x05U&\x02\u01CC\u01CD\x05\u0147" + - "\x9F\x02\u01CD\u01CE\x05\u016D\xB2\x02\u01CE\u01CF\x05\u015D\xAA\x02\u01CF" + - "\u01D0\x05\u013F\x9B\x02\u01D0\u01D1\x05\u0159\xA8\x02\u01D1\u01D2\x05" + - "\u0145\x9E\x02\u01D2\u01D3\x03\x02\x02\x02\u01D3\u01D4\b\f\x07\x02\u01D4" + - "\"\x03\x02\x02\x02\u01D5\u01D6\x05\u015D\xAA\x02\u01D6\u01D7\x05\u0161" + - "\xAC\x02\u01D7\u01D8\x05\u015B\xA9\x02\u01D8\u01D9\x05\u0151\xA4\x02\u01D9" + - "\u01DA\x05\u0147\x9F\x02\u01DA\u01DB\x05\u0143\x9D\x02\u01DB\u01DC\x05" + - "\u0165\xAE\x02\u01DC\u01DD\x03\x02\x02\x02\u01DD\u01DE\b\r\x03\x02\u01DE" + - "$\x03\x02\x02\x02\u01DF\u01E0\x05\u0161\xAC\x02\u01E0\u01E1\x05\u0147" + - "\x9F\x02\u01E1\u01E2\x05\u0159\xA8\x02\u01E2\u01E3\x05\u013F\x9B\x02\u01E3" + - "\u01E4\x05\u0157\xA7\x02\u01E4\u01E5\x05\u0147\x9F\x02\u01E5\u01E6\x03" + - "\x02\x02\x02\u01E6\u01E7\b\x0E\b\x02\u01E7&\x03\x02\x02\x02\u01E8\u01E9" + - "\x05\u0161\xAC\x02\u01E9\u01EA\x05\u015B\xA9\x02\u01EA\u01EB\x05\u016B" + - "\xB1\x02\u01EB\u01EC\x03\x02\x02\x02\u01EC\u01ED\b\x0F\x02\x02\u01ED(" + - "\x03\x02\x02\x02\u01EE\u01EF\x05\u0163\xAD\x02\u01EF\u01F0\x05\u014D\xA2" + - "\x02\u01F0\u01F1\x05\u015B\xA9\x02\u01F1\u01F2\x05\u016B\xB1\x02\u01F2" + - "\u01F3\x03\x02\x02\x02\u01F3\u01F4\b\x10\t\x02\u01F4*\x03\x02\x02\x02" + - "\u01F5\u01F6\x05\u0163\xAD\x02\u01F6\u01F7\x05\u015B\xA9\x02\u01F7\u01F8" + - "\x05\u0161\xAC\x02\u01F8\u01F9\x05\u0165\xAE\x02\u01F9\u01FA\x03\x02\x02" + - "\x02\u01FA\u01FB\b\x11\x02\x02\u01FB,\x03\x02\x02\x02\u01FC\u01FD\x05" + - "\u0163\xAD\x02\u01FD\u01FE\x05\u0165\xAE\x02\u01FE\u01FF\x05\u013F\x9B" + - "\x02\u01FF\u0200\x05\u0165\xAE\x02\u0200\u0201\x05\u0163\xAD\x02\u0201" + - "\u0202\x03\x02\x02\x02\u0202\u0203\b\x12\x02\x02\u0203.\x03\x02\x02\x02" + - "\u0204\u0205\x05\u016B\xB1\x02\u0205\u0206\x05\u014D\xA2\x02\u0206\u0207" + - "\x05\u0147\x9F\x02\u0207\u0208\x05\u0161\xAC\x02\u0208\u0209\x05\u0147" + - "\x9F\x02\u0209\u020A\x03\x02\x02\x02\u020A\u020B\b\x13\x02\x02\u020B0" + - "\x03\x02\x02\x02\u020C\u020E\n\x02\x02\x02\u020D\u020C\x03\x02\x02\x02" + - "\u020E\u020F\x03\x02\x02\x02\u020F\u020D\x03\x02\x02\x02\u020F\u0210\x03" + - "\x02\x02\x02\u0210\u0211\x03\x02\x02\x02\u0211\u0212\b\x14\x02\x02\u0212" + - "2\x03\x02\x02\x02\u0213\u0214\x071\x02\x02\u0214\u0215\x071\x02\x02\u0215" + - "\u0219\x03\x02\x02\x02\u0216\u0218\n\x03\x02\x02\u0217\u0216\x03\x02\x02" + - "\x02\u0218\u021B\x03\x02\x02\x02\u0219\u0217\x03\x02\x02\x02\u0219\u021A" + - "\x03\x02\x02\x02\u021A\u021D\x03\x02\x02\x02\u021B\u0219\x03\x02\x02\x02" + - "\u021C\u021E\x07\x0F\x02\x02\u021D\u021C\x03\x02\x02\x02\u021D\u021E\x03" + - "\x02\x02\x02\u021E\u0220\x03\x02\x02\x02\u021F\u0221\x07\f\x02\x02\u0220" + - "\u021F\x03\x02\x02\x02\u0220\u0221\x03\x02\x02\x02\u0221\u0222\x03\x02" + - "\x02\x02\u0222\u0223\b\x15\n\x02\u02234\x03\x02\x02\x02\u0224\u0225\x07" + - "1\x02\x02\u0225\u0226\x07,\x02\x02\u0226\u022B\x03\x02\x02\x02\u0227\u022A" + - "\x055\x16\x02\u0228\u022A\v\x02\x02\x02\u0229\u0227\x03\x02\x02\x02\u0229" + - "\u0228\x03\x02\x02\x02\u022A\u022D\x03\x02\x02\x02\u022B\u022C\x03\x02" + - "\x02\x02\u022B\u0229\x03\x02\x02\x02\u022C\u022E\x03\x02\x02\x02\u022D" + - "\u022B\x03\x02\x02\x02\u022E\u022F\x07,\x02\x02\u022F\u0230\x071\x02\x02" + - "\u0230\u0231\x03\x02\x02\x02\u0231\u0232\b\x16\n\x02\u02326\x03\x02\x02" + - "\x02\u0233\u0235\t\x04\x02\x02\u0234\u0233\x03\x02\x02\x02\u0235\u0236" + - "\x03\x02\x02\x02\u0236\u0234\x03\x02\x02\x02\u0236\u0237\x03\x02\x02\x02" + - "\u0237\u0238\x03\x02\x02\x02\u0238\u0239\b\x17\n\x02\u02398\x03\x02\x02" + - "\x02\u023A\u023B\x05\xA1L\x02\u023B\u023C\x03\x02\x02\x02\u023C\u023D" + - "\b\x18\v\x02\u023D\u023E\b\x18\f\x02\u023E:\x03\x02\x02\x02\u023F\u0240" + - "\x05C\x1D\x02\u0240\u0241\x03\x02\x02\x02\u0241\u0242\b\x19\r\x02\u0242" + - "\u0243\b\x19\x0E\x02\u0243<\x03\x02\x02\x02\u0244\u0245\x057\x17\x02\u0245" + - "\u0246\x03\x02\x02\x02\u0246\u0247\b\x1A\n\x02\u0247>\x03\x02\x02\x02" + - "\u0248\u0249\x053\x15\x02\u0249\u024A\x03\x02\x02\x02\u024A\u024B\b\x1B" + - "\n\x02\u024B@\x03\x02\x02\x02\u024C\u024D\x055\x16\x02\u024D\u024E\x03" + - "\x02\x02\x02\u024E\u024F\b\x1C\n\x02\u024FB\x03\x02\x02\x02\u0250\u0251" + - "\x07~\x02\x02\u0251\u0252\x03\x02\x02\x02\u0252\u0253\b\x1D\x0E\x02\u0253" + - "D\x03\x02\x02\x02\u0254\u0255\t\x05\x02\x02\u0255F\x03\x02\x02\x02\u0256" + - "\u0257\t\x06\x02\x02\u0257H\x03\x02\x02\x02\u0258\u0259\x07^\x02\x02\u0259" + - "\u025A\t\x07\x02\x02\u025AJ\x03\x02\x02\x02\u025B\u025C\n\b\x02\x02\u025C" + - "L\x03\x02\x02\x02\u025D\u025F\t\t\x02\x02\u025E\u0260\t\n\x02\x02\u025F" + - "\u025E\x03\x02\x02\x02\u025F\u0260\x03\x02\x02\x02\u0260\u0262\x03\x02" + - "\x02\x02\u0261\u0263\x05E\x1E\x02\u0262\u0261\x03\x02\x02\x02\u0263\u0264" + - "\x03\x02\x02\x02\u0264\u0262\x03\x02\x02\x02\u0264\u0265\x03\x02\x02\x02" + - "\u0265N\x03\x02\x02\x02\u0266\u0267\x07B\x02\x02\u0267P\x03\x02\x02\x02" + - "\u0268\u0269\x07b\x02\x02\u0269R\x03\x02\x02\x02\u026A\u026E\n\v\x02\x02" + - "\u026B\u026C\x07b\x02\x02\u026C\u026E\x07b\x02\x02\u026D\u026A\x03\x02" + - "\x02\x02\u026D\u026B\x03\x02\x02\x02\u026ET\x03\x02\x02\x02\u026F\u0270" + - "\x07a\x02\x02\u0270V\x03\x02\x02\x02\u0271\u0275\x05G\x1F\x02\u0272\u0275" + - "\x05E\x1E\x02\u0273\u0275\x05U&\x02\u0274\u0271\x03\x02\x02\x02\u0274" + - "\u0272\x03\x02\x02\x02\u0274\u0273\x03\x02\x02\x02\u0275X\x03\x02\x02" + - "\x02\u0276\u027B\x07$\x02\x02\u0277\u027A\x05I \x02\u0278\u027A\x05K!" + - "\x02\u0279\u0277\x03\x02\x02\x02\u0279\u0278\x03\x02\x02\x02\u027A\u027D" + - "\x03\x02\x02\x02\u027B\u0279\x03\x02\x02\x02\u027B\u027C\x03\x02\x02\x02" + - "\u027C\u027E\x03\x02\x02\x02\u027D\u027B\x03\x02\x02\x02\u027E\u0294\x07" + - "$\x02\x02\u027F\u0280\x07$\x02\x02\u0280\u0281\x07$\x02\x02\u0281\u0282" + - "\x07$\x02\x02\u0282\u0286\x03\x02\x02\x02\u0283\u0285\n\x03\x02\x02\u0284" + - "\u0283\x03\x02\x02\x02\u0285\u0288\x03\x02\x02\x02\u0286\u0287\x03\x02" + - "\x02\x02\u0286\u0284\x03\x02\x02\x02\u0287\u0289\x03\x02\x02\x02\u0288" + - "\u0286\x03\x02\x02\x02\u0289\u028A\x07$\x02\x02\u028A\u028B\x07$\x02\x02" + - "\u028B\u028C\x07$\x02\x02\u028C\u028E\x03\x02\x02\x02\u028D\u028F\x07" + - "$\x02\x02\u028E\u028D\x03\x02\x02\x02\u028E\u028F\x03\x02\x02\x02\u028F" + - "\u0291\x03\x02\x02\x02\u0290\u0292\x07$\x02\x02\u0291\u0290\x03\x02\x02" + - "\x02\u0291\u0292\x03\x02\x02\x02\u0292\u0294\x03\x02\x02\x02\u0293\u0276" + - "\x03\x02\x02\x02\u0293\u027F\x03\x02\x02\x02\u0294Z\x03\x02\x02\x02\u0295" + - "\u0297\x05E\x1E\x02\u0296\u0295\x03\x02\x02\x02\u0297\u0298\x03\x02\x02" + - "\x02\u0298\u0296\x03\x02\x02\x02\u0298\u0299\x03\x02\x02\x02\u0299\\\x03" + - "\x02\x02\x02\u029A\u029C\x05E\x1E\x02\u029B\u029A\x03\x02\x02\x02\u029C" + - "\u029D\x03\x02\x02\x02\u029D\u029B\x03\x02\x02\x02\u029D\u029E\x03\x02" + - "\x02\x02\u029E\u029F\x03\x02\x02\x02\u029F\u02A3\x05k1\x02\u02A0\u02A2" + - "\x05E\x1E\x02\u02A1\u02A0\x03\x02\x02\x02\u02A2\u02A5\x03\x02\x02\x02" + - "\u02A3\u02A1\x03\x02\x02\x02\u02A3\u02A4\x03\x02\x02\x02\u02A4\u02C5\x03" + - "\x02\x02\x02\u02A5\u02A3\x03\x02\x02\x02\u02A6\u02A8\x05k1\x02\u02A7\u02A9" + - "\x05E\x1E\x02\u02A8\u02A7\x03\x02\x02\x02\u02A9\u02AA\x03\x02\x02\x02" + - "\u02AA\u02A8\x03\x02\x02\x02\u02AA\u02AB\x03\x02\x02\x02\u02AB\u02C5\x03" + - "\x02\x02\x02\u02AC\u02AE\x05E\x1E\x02\u02AD\u02AC\x03\x02\x02\x02\u02AE" + - "\u02AF\x03\x02\x02\x02\u02AF\u02AD\x03\x02\x02\x02\u02AF\u02B0\x03\x02" + - "\x02\x02\u02B0\u02B8\x03\x02\x02\x02\u02B1\u02B5\x05k1\x02\u02B2\u02B4" + - "\x05E\x1E\x02\u02B3\u02B2\x03\x02\x02\x02\u02B4\u02B7\x03\x02\x02\x02" + - "\u02B5\u02B3\x03\x02\x02\x02\u02B5\u02B6\x03\x02\x02\x02\u02B6\u02B9\x03" + - "\x02\x02\x02\u02B7\u02B5\x03\x02\x02\x02\u02B8\u02B1\x03\x02\x02\x02\u02B8" + - "\u02B9\x03\x02\x02\x02\u02B9\u02BA\x03\x02\x02\x02\u02BA\u02BB\x05M\"" + - "\x02\u02BB\u02C5\x03\x02\x02\x02\u02BC\u02BE\x05k1\x02\u02BD\u02BF\x05" + - "E\x1E\x02\u02BE\u02BD\x03\x02\x02\x02\u02BF\u02C0\x03\x02\x02\x02\u02C0" + - "\u02BE\x03\x02\x02\x02\u02C0\u02C1\x03\x02\x02\x02\u02C1\u02C2\x03\x02" + - "\x02\x02\u02C2\u02C3\x05M\"\x02\u02C3\u02C5\x03\x02\x02\x02\u02C4\u029B" + - "\x03\x02\x02\x02\u02C4\u02A6\x03\x02\x02\x02\u02C4\u02AD\x03\x02\x02\x02" + - "\u02C4\u02BC\x03\x02\x02\x02\u02C5^\x03\x02\x02\x02\u02C6\u02C7\x05\u0141" + - "\x9C\x02\u02C7\u02C8\x05\u016F\xB3\x02\u02C8`\x03\x02\x02\x02\u02C9\u02CA" + - "\x05\u013F\x9B\x02\u02CA\u02CB\x05\u0159\xA8\x02\u02CB\u02CC\x05\u0145" + - "\x9E\x02\u02CCb\x03\x02\x02\x02\u02CD\u02CE\x05\u013F\x9B\x02\u02CE\u02CF" + - "\x05\u0163\xAD\x02\u02CF\u02D0\x05\u0143\x9D\x02\u02D0d\x03\x02\x02\x02" + - "\u02D1\u02D2\x07?\x02\x02\u02D2f\x03\x02\x02\x02\u02D3\u02D4\x07.\x02" + - "\x02\u02D4h\x03\x02\x02\x02\u02D5\u02D6\x05\u0145\x9E\x02\u02D6\u02D7" + - "\x05\u0147\x9F\x02\u02D7\u02D8\x05\u0163\xAD\x02\u02D8\u02D9\x05\u0143" + - "\x9D\x02\u02D9j\x03\x02\x02\x02\u02DA\u02DB\x070\x02\x02\u02DBl\x03\x02" + - "\x02\x02\u02DC\u02DD\x05\u0149\xA0\x02\u02DD\u02DE\x05\u013F\x9B\x02\u02DE" + - "\u02DF\x05\u0155\xA6\x02\u02DF\u02E0\x05\u0163\xAD\x02\u02E0\u02E1\x05" + - "\u0147\x9F\x02\u02E1n\x03\x02\x02\x02\u02E2\u02E3\x05\u0149\xA0\x02\u02E3" + - "\u02E4\x05\u014F\xA3\x02\u02E4\u02E5\x05\u0161\xAC\x02\u02E5\u02E6\x05" + - "\u0163\xAD\x02\u02E6\u02E7\x05\u0165\xAE\x02\u02E7p\x03\x02\x02\x02\u02E8" + - "\u02E9\x05\u0155\xA6\x02\u02E9\u02EA\x05\u013F\x9B\x02\u02EA\u02EB\x05" + - "\u0163\xAD\x02\u02EB\u02EC\x05\u0165\xAE\x02\u02ECr\x03\x02\x02\x02\u02ED" + - "\u02EE\x07*\x02\x02\u02EEt\x03\x02\x02\x02\u02EF\u02F0\x05\u014F\xA3\x02" + - "\u02F0\u02F1\x05\u0159\xA8\x02\u02F1v\x03\x02\x02\x02\u02F2\u02F3\x05" + - "\u014F\xA3\x02\u02F3\u02F4\x05\u0163\xAD\x02\u02F4x\x03\x02\x02\x02\u02F5" + - "\u02F6\x05\u0155\xA6\x02\u02F6\u02F7\x05\u014F\xA3\x02\u02F7\u02F8\x05" + - "\u0153\xA5\x02\u02F8\u02F9\x05\u0147\x9F\x02\u02F9z\x03\x02\x02\x02\u02FA" + - "\u02FB\x05\u0159\xA8\x02\u02FB\u02FC\x05\u015B\xA9\x02\u02FC\u02FD\x05" + - "\u0165\xAE\x02\u02FD|\x03\x02\x02\x02\u02FE\u02FF\x05\u0159\xA8\x02\u02FF" + - "\u0300\x05\u0167\xAF\x02\u0300\u0301\x05\u0155\xA6\x02\u0301\u0302\x05" + - "\u0155\xA6\x02\u0302~\x03\x02\x02\x02\u0303\u0304\x05\u0159\xA8\x02\u0304" + - "\u0305\x05\u0167\xAF\x02\u0305\u0306\x05\u0155\xA6\x02\u0306\u0307\x05" + - "\u0155\xA6\x02\u0307\u0308\x05\u0163\xAD\x02\u0308\x80\x03\x02\x02\x02" + - "\u0309\u030A\x05\u015B\xA9\x02\u030A\u030B\x05\u0161\xAC\x02\u030B\x82" + - "\x03\x02\x02\x02\u030C\u030D\x07A\x02\x02\u030D\x84\x03\x02\x02\x02\u030E" + - "\u030F\x05\u0161\xAC\x02\u030F\u0310\x05\u0155\xA6\x02\u0310\u0311\x05" + - "\u014F\xA3\x02\u0311\u0312\x05\u0153\xA5\x02\u0312\u0313\x05\u0147\x9F" + - "\x02\u0313\x86\x03\x02\x02\x02\u0314\u0315\x07+\x02\x02\u0315\x88\x03" + - "\x02\x02\x02\u0316\u0317\x05\u0165\xAE\x02\u0317\u0318\x05\u0161\xAC\x02" + - "\u0318\u0319\x05\u0167\xAF\x02\u0319\u031A\x05\u0147\x9F\x02\u031A\x8A" + - "\x03\x02\x02\x02\u031B\u031C\x07?\x02\x02\u031C\u031D\x07?\x02\x02\u031D" + - "\x8C\x03\x02\x02\x02\u031E\u031F\x07#\x02\x02\u031F\u0320\x07?\x02\x02" + - "\u0320\x8E\x03\x02\x02\x02\u0321\u0322\x07>\x02\x02\u0322\x90\x03\x02" + - "\x02\x02\u0323\u0324\x07>\x02\x02\u0324\u0325\x07?\x02\x02\u0325\x92\x03" + - "\x02\x02\x02\u0326\u0327\x07@\x02\x02\u0327\x94\x03\x02\x02\x02\u0328" + - "\u0329\x07@\x02\x02\u0329\u032A\x07?\x02\x02\u032A\x96\x03\x02\x02\x02" + - "\u032B\u032C\x07-\x02\x02\u032C\x98\x03\x02\x02\x02\u032D\u032E\x07/\x02" + - "\x02\u032E\x9A\x03\x02\x02\x02\u032F\u0330\x07,\x02\x02\u0330\x9C\x03" + - "\x02\x02\x02\u0331\u0332\x071\x02\x02\u0332\x9E\x03\x02\x02\x02\u0333" + - "\u0334\x07\'\x02\x02\u0334\xA0\x03\x02\x02\x02\u0335\u0336\x07]\x02\x02" + - "\u0336\u0337\x03\x02\x02\x02\u0337\u0338\bL\x02\x02\u0338\u0339\bL\x02" + - "\x02\u0339\xA2\x03\x02\x02\x02\u033A\u033B\x07_\x02\x02\u033B\u033C\x03" + - "\x02\x02\x02\u033C\u033D\bM\x0E\x02\u033D\u033E\bM\x0E\x02\u033E\xA4\x03" + - "\x02\x02\x02\u033F\u0343\x05G\x1F\x02\u0340\u0342\x05W\'\x02\u0341\u0340" + - "\x03\x02\x02\x02\u0342\u0345\x03\x02\x02\x02\u0343\u0341\x03\x02\x02\x02" + - "\u0343\u0344\x03\x02\x02\x02\u0344\u0350\x03\x02\x02\x02\u0345\u0343\x03" + - "\x02\x02\x02\u0346\u0349\x05U&\x02\u0347\u0349\x05O#\x02\u0348\u0346\x03" + - "\x02\x02\x02\u0348\u0347\x03\x02\x02\x02\u0349\u034B\x03\x02\x02\x02\u034A" + - "\u034C\x05W\'\x02\u034B\u034A\x03\x02\x02\x02\u034C\u034D\x03\x02\x02" + - "\x02\u034D\u034B\x03\x02\x02\x02\u034D\u034E\x03\x02\x02\x02\u034E\u0350" + - "\x03\x02\x02\x02\u034F\u033F\x03\x02\x02\x02\u034F\u0348\x03\x02\x02\x02" + - "\u0350\xA6\x03\x02\x02\x02\u0351\u0353\x05Q$\x02\u0352\u0354\x05S%\x02" + - "\u0353\u0352\x03\x02\x02\x02\u0354\u0355\x03\x02\x02\x02\u0355\u0353\x03" + - "\x02\x02\x02\u0355\u0356\x03\x02\x02\x02\u0356\u0357\x03\x02\x02\x02\u0357" + - "\u0358\x05Q$\x02\u0358\xA8\x03\x02\x02\x02\u0359\u035A\x053\x15\x02\u035A" + - "\u035B\x03\x02\x02\x02\u035B\u035C\bP\n\x02\u035C\xAA\x03\x02\x02\x02" + - "\u035D\u035E\x055\x16\x02\u035E\u035F\x03\x02\x02\x02\u035F\u0360\bQ\n" + - "\x02\u0360\xAC\x03\x02\x02\x02\u0361\u0362\x057\x17\x02\u0362\u0363\x03" + - "\x02\x02\x02\u0363\u0364\bR\n\x02\u0364\xAE\x03\x02\x02\x02\u0365\u0366" + - "\x05C\x1D\x02\u0366\u0367\x03\x02\x02\x02\u0367\u0368\bS\r\x02\u0368\u0369" + - "\bS\x0E\x02\u0369\xB0\x03\x02\x02\x02\u036A\u036B\x05\xA1L\x02\u036B\u036C" + - "\x03\x02\x02\x02\u036C\u036D\bT\v\x02\u036D\xB2\x03\x02\x02\x02\u036E" + - "\u036F\x05\xA3M\x02\u036F\u0370\x03\x02\x02\x02\u0370\u0371\bU\x0F\x02" + - "\u0371\xB4\x03\x02\x02\x02\u0372\u0373\x05g/\x02\u0373\u0374\x03\x02\x02" + - "\x02\u0374\u0375\bV\x10\x02\u0375\xB6\x03\x02\x02\x02\u0376\u0377\x05" + - "e.\x02\u0377\u0378\x03\x02\x02\x02\u0378\u0379\bW\x11\x02\u0379\xB8\x03" + - "\x02\x02\x02\u037A\u037B\x05\u0157\xA7\x02\u037B\u037C\x05\u0147\x9F\x02" + - "\u037C\u037D\x05\u0165\xAE\x02\u037D\u037E\x05\u013F\x9B\x02\u037E\u037F" + - "\x05\u0145\x9E\x02\u037F\u0380\x05\u013F\x9B\x02\u0380\u0381\x05\u0165" + - "\xAE\x02\u0381\u0382\x05\u013F\x9B\x02\u0382\xBA\x03\x02\x02\x02\u0383" + - "\u0387\n\f\x02\x02\u0384\u0385\x071\x02\x02\u0385\u0387\n\r\x02\x02\u0386" + - "\u0383\x03\x02\x02\x02\u0386\u0384\x03\x02\x02\x02\u0387\xBC\x03\x02\x02" + - "\x02\u0388\u038A\x05\xBBY\x02\u0389\u0388\x03\x02\x02\x02\u038A\u038B" + - "\x03\x02\x02\x02\u038B\u0389\x03\x02\x02\x02\u038B\u038C\x03\x02\x02\x02" + - "\u038C\xBE\x03\x02\x02\x02\u038D\u038E\x05\xA7O\x02\u038E\u038F\x03\x02" + - "\x02\x02\u038F\u0390\b[\x12\x02\u0390\xC0\x03\x02\x02\x02\u0391\u0392" + - "\x053\x15\x02\u0392\u0393\x03\x02\x02\x02\u0393\u0394\b\\\n\x02\u0394" + - "\xC2\x03\x02\x02\x02\u0395\u0396\x055\x16\x02\u0396\u0397\x03\x02\x02" + - "\x02\u0397\u0398\b]\n\x02\u0398\xC4\x03\x02\x02\x02\u0399\u039A\x057\x17" + - "\x02\u039A\u039B\x03\x02\x02\x02\u039B\u039C\b^\n\x02\u039C\xC6\x03\x02" + - "\x02\x02\u039D\u039E\x05C\x1D\x02\u039E\u039F\x03\x02\x02\x02\u039F\u03A0" + - "\b_\r\x02\u03A0\u03A1\b_\x0E\x02\u03A1\xC8\x03\x02\x02\x02\u03A2\u03A3" + - "\x05k1\x02\u03A3\u03A4\x03\x02\x02\x02\u03A4\u03A5\b`\x13\x02\u03A5\xCA" + - "\x03\x02\x02\x02\u03A6\u03A7\x05g/\x02\u03A7\u03A8\x03\x02\x02\x02\u03A8" + - "\u03A9\ba\x10\x02\u03A9\xCC\x03\x02\x02\x02\u03AA\u03AF\x05G\x1F\x02\u03AB" + - "\u03AF\x05E\x1E\x02\u03AC\u03AF\x05U&\x02\u03AD\u03AF\x05\x9BI\x02\u03AE" + - "\u03AA\x03\x02\x02\x02\u03AE\u03AB\x03\x02\x02\x02\u03AE\u03AC\x03\x02" + - "\x02\x02\u03AE\u03AD\x03\x02\x02\x02\u03AF\xCE\x03\x02\x02\x02\u03B0\u03B3" + - "\x05G\x1F\x02\u03B1\u03B3\x05\x9BI\x02\u03B2\u03B0\x03\x02\x02\x02\u03B2" + - "\u03B1\x03\x02\x02\x02\u03B3\u03B7\x03\x02\x02\x02\u03B4\u03B6\x05\xCD" + - "b\x02\u03B5\u03B4\x03\x02\x02\x02\u03B6\u03B9\x03\x02\x02\x02\u03B7\u03B5" + - "\x03\x02\x02\x02\u03B7\u03B8\x03\x02\x02\x02\u03B8\u03C4\x03\x02\x02\x02" + - "\u03B9\u03B7\x03\x02\x02\x02\u03BA\u03BD\x05U&\x02\u03BB\u03BD\x05O#\x02" + - "\u03BC\u03BA\x03\x02\x02\x02\u03BC\u03BB\x03\x02\x02\x02\u03BD\u03BF\x03" + - "\x02\x02\x02\u03BE\u03C0\x05\xCDb\x02\u03BF\u03BE\x03\x02\x02\x02\u03C0" + - "\u03C1\x03\x02\x02\x02\u03C1\u03BF\x03\x02\x02\x02\u03C1\u03C2\x03\x02" + - "\x02\x02\u03C2\u03C4\x03\x02\x02\x02\u03C3\u03B2\x03\x02\x02\x02\u03C3" + - "\u03BC\x03\x02\x02\x02\u03C4\xD0\x03\x02\x02\x02\u03C5\u03C6\x05\xCFc" + - "\x02\u03C6\u03C7\x03\x02\x02\x02\u03C7\u03C8\bd\x14\x02\u03C8\xD2\x03" + - "\x02\x02\x02\u03C9\u03CA\x05\xA7O\x02\u03CA\u03CB\x03\x02\x02\x02\u03CB" + - "\u03CC\be\x12\x02\u03CC\xD4\x03\x02\x02\x02\u03CD\u03CE\x053\x15\x02\u03CE" + - "\u03CF\x03\x02\x02\x02\u03CF\u03D0\bf\n\x02\u03D0\xD6\x03\x02\x02\x02" + - "\u03D1\u03D2\x055\x16\x02\u03D2\u03D3\x03\x02\x02\x02\u03D3\u03D4\bg\n" + - "\x02\u03D4\xD8\x03\x02\x02\x02\u03D5\u03D6\x057\x17\x02\u03D6\u03D7\x03" + - "\x02\x02\x02\u03D7\u03D8\bh\n\x02\u03D8\xDA\x03\x02\x02\x02\u03D9\u03DA" + - "\x05C\x1D\x02\u03DA\u03DB\x03\x02\x02\x02\u03DB\u03DC\bi\r\x02\u03DC\u03DD" + - "\bi\x0E\x02\u03DD\xDC\x03\x02\x02\x02\u03DE\u03DF\x05e.\x02\u03DF\u03E0" + - "\x03\x02\x02\x02\u03E0\u03E1\bj\x11\x02\u03E1\xDE\x03\x02\x02\x02\u03E2" + - "\u03E3\x05g/\x02\u03E3\u03E4\x03\x02\x02\x02\u03E4\u03E5\bk\x10\x02\u03E5" + - "\xE0\x03\x02\x02\x02\u03E6\u03E7\x05k1\x02\u03E7\u03E8\x03\x02\x02\x02" + - "\u03E8\u03E9\bl\x13\x02\u03E9\xE2\x03\x02\x02\x02\u03EA\u03EB\x05\u013F" + - "\x9B\x02\u03EB\u03EC\x05\u0163\xAD\x02\u03EC\xE4\x03\x02\x02\x02\u03ED" + - "\u03EE\x05\xA7O\x02\u03EE\u03EF\x03\x02\x02\x02\u03EF\u03F0\bn\x12\x02" + - "\u03F0\xE6\x03\x02\x02\x02\u03F1\u03F2\x05\xCFc\x02\u03F2\u03F3\x03\x02" + - "\x02\x02\u03F3\u03F4\bo\x14\x02\u03F4\xE8\x03\x02\x02\x02\u03F5\u03F6" + - "\x053\x15\x02\u03F6\u03F7\x03\x02\x02\x02\u03F7\u03F8\bp\n\x02\u03F8\xEA" + - "\x03\x02\x02\x02\u03F9\u03FA\x055\x16\x02\u03FA\u03FB\x03\x02\x02\x02" + - "\u03FB\u03FC\bq\n\x02\u03FC\xEC\x03\x02\x02\x02\u03FD\u03FE\x057\x17\x02" + - "\u03FE\u03FF\x03\x02\x02\x02\u03FF\u0400\br\n\x02\u0400\xEE\x03\x02\x02" + - "\x02\u0401\u0402\x05C\x1D\x02\u0402\u0403\x03\x02\x02\x02\u0403\u0404" + - "\bs\r\x02\u0404\u0405\bs\x0E\x02\u0405\xF0\x03\x02\x02\x02\u0406\u0407" + - "\x05\xA1L\x02\u0407\u0408\x03\x02\x02\x02\u0408\u0409\bt\v\x02\u0409\u040A" + - "\bt\x15\x02\u040A\xF2\x03\x02\x02\x02\u040B\u040C\x05\u015B\xA9\x02\u040C" + - "\u040D\x05\u0159\xA8\x02\u040D\u040E\x03\x02\x02\x02\u040E\u040F\bu\x16" + - "\x02\u040F\xF4\x03\x02\x02\x02\u0410\u0411\x05\u016B\xB1\x02\u0411\u0412" + - "\x05\u014F\xA3\x02\u0412\u0413\x05\u0165\xAE\x02\u0413\u0414\x05\u014D" + - "\xA2\x02\u0414\u0415\x03\x02\x02\x02\u0415\u0416\bv\x16\x02\u0416\xF6" + - "\x03\x02\x02\x02\u0417\u0418\n\x0E\x02\x02\u0418\xF8\x03\x02\x02\x02\u0419" + - "\u041C\x05G\x1F\x02\u041A\u041C\x05E\x1E\x02\u041B\u0419\x03\x02\x02\x02" + - "\u041B\u041A\x03\x02\x02\x02\u041C\u0420\x03\x02\x02\x02\u041D\u041F\x05" + - "\xF7w\x02\u041E\u041D\x03\x02\x02\x02\u041F\u0422\x03\x02\x02\x02\u0420" + - "\u041E\x03\x02\x02\x02\u0420\u0421\x03\x02\x02\x02\u0421\xFA\x03\x02\x02" + - "\x02\u0422\u0420\x03\x02\x02\x02\u0423\u0424\x05\xA7O\x02\u0424\u0425" + - "\x03\x02\x02\x02\u0425\u0426\by\x12\x02\u0426\xFC\x03\x02\x02\x02\u0427" + - "\u0428\x05\xF9x\x02\u0428\u0429\x03\x02\x02\x02\u0429\u042A\bz\x17\x02" + - "\u042A\xFE\x03\x02\x02\x02\u042B\u042C\x053\x15\x02\u042C\u042D\x03\x02" + - "\x02\x02\u042D\u042E\b{\n\x02\u042E\u0100\x03\x02\x02\x02\u042F\u0430" + - "\x055\x16\x02\u0430\u0431\x03\x02\x02\x02\u0431\u0432\b|\n\x02\u0432\u0102" + - "\x03\x02\x02\x02\u0433\u0434\x057\x17\x02\u0434\u0435\x03\x02\x02\x02" + - "\u0435\u0436\b}\n\x02\u0436\u0104\x03\x02\x02\x02\u0437\u0438\x05C\x1D" + - "\x02\u0438\u0439\x03\x02\x02\x02\u0439\u043A\b~\r\x02\u043A\u043B\b~\x0E" + - "\x02\u043B\u043C\b~\x0E\x02\u043C\u0106\x03\x02\x02\x02\u043D\u043E\x05" + - "e.\x02\u043E\u043F\x03\x02\x02\x02\u043F\u0440\b\x7F\x11\x02\u0440\u0108" + - "\x03\x02\x02\x02\u0441\u0442\x05g/\x02\u0442\u0443\x03\x02\x02\x02\u0443" + - "\u0444\b\x80\x10\x02\u0444\u010A\x03\x02\x02\x02\u0445\u0446\x05k1\x02" + - "\u0446\u0447\x03\x02\x02\x02\u0447\u0448\b\x81\x13\x02\u0448\u010C\x03" + - "\x02\x02\x02\u0449\u044A\x05\xF5v\x02\u044A\u044B\x03\x02\x02\x02\u044B" + - "\u044C\b\x82\x18\x02\u044C\u010E\x03\x02\x02\x02"; + "\u048D\x03\x02\x02\x02\u012F\u0497\x03\x02\x02\x02\u0131\u049B\x03\x02" + + "\x02\x02\u0133\u049F\x03\x02\x02\x02\u0135\u04A3\x03\x02\x02\x02\u0137" + + "\u04A8\x03\x02\x02\x02\u0139\u04AF\x03\x02\x02\x02\u013B\u04B3\x03\x02" + + "\x02\x02\u013D\u04B7\x03\x02\x02\x02\u013F\u04BB\x03\x02\x02\x02\u0141" + + "\u04BF\x03\x02\x02\x02\u0143\u04C1\x03\x02\x02\x02\u0145\u04C3\x03\x02" + + "\x02\x02\u0147\u04C5\x03\x02\x02\x02\u0149\u04C7\x03\x02\x02\x02\u014B" + + "\u04C9\x03\x02\x02\x02\u014D\u04CB\x03\x02\x02\x02\u014F\u04CD\x03\x02" + + "\x02\x02\u0151\u04CF\x03\x02\x02\x02\u0153\u04D1\x03\x02\x02\x02\u0155" + + "\u04D3\x03\x02\x02\x02\u0157\u04D5\x03\x02\x02\x02\u0159\u04D7\x03\x02" + + "\x02\x02\u015B\u04D9\x03\x02\x02\x02\u015D\u04DB\x03\x02\x02\x02\u015F" + + "\u04DD\x03\x02\x02\x02\u0161\u04DF\x03\x02\x02\x02\u0163\u04E1\x03\x02" + + "\x02\x02\u0165\u04E3\x03\x02\x02\x02\u0167\u04E5\x03\x02\x02\x02\u0169" + + "\u04E7\x03\x02\x02\x02\u016B\u04E9\x03\x02\x02\x02\u016D\u04EB\x03\x02" + + "\x02\x02\u016F\u04ED\x03\x02\x02\x02\u0171\u04EF\x03\x02\x02\x02\u0173" + + "\u04F1\x03\x02\x02\x02\u0175\u0176\x05\u0147\x9F\x02\u0176\u0177\x05\u0151" + + "\xA4\x02\u0177\u0178\x05\u0165\xAE\x02\u0178\u0179\x05\u0165\xAE\x02\u0179" + + "\u017A\x05\u0149\xA0\x02\u017A\u017B\x05\u0145\x9E\x02\u017B\u017C\x05" + + "\u0167\xAF\x02\u017C\u017D\x03\x02\x02\x02\u017D\u017E\b\x02\x02\x02\u017E" + + "\x0E\x03\x02\x02\x02\u017F\u0180\x05\u0147\x9F\x02\u0180\u0181\x05\u0163" + + "\xAD\x02\u0181\u0182\x05\u015D\xAA\x02\u0182\u0183\x05\u015F\xAB\x02\u0183" + + "\u0184\x03\x02\x02\x02\u0184\u0185\b\x03\x03\x02\u0185\x10\x03\x02\x02" + + "\x02\u0186\u0187\x05\u0149\xA0\x02\u0187\u0188\x05\u015B\xA9\x02\u0188" + + "\u0189\x05\u0163\xAD\x02\u0189\u018A\x05\u0151\xA4\x02\u018A\u018B\x05" + + "\u0145\x9E\x02\u018B\u018C\x05\u014F\xA3\x02\u018C\u018D\x03\x02\x02\x02" + + "\u018D\u018E\b\x04\x04\x02\u018E\x12\x03\x02\x02\x02\u018F\u0190\x05\u0149" + + "\xA0\x02\u0190\u0191\x05\u016B\xB1\x02\u0191\u0192\x05\u0141\x9C\x02\u0192" + + "\u0193\x05\u0157\xA7\x02\u0193\u0194\x03\x02\x02\x02\u0194\u0195\b\x05" + + "\x02\x02\u0195\x14\x03\x02\x02\x02\u0196\u0197\x05\u0149\xA0\x02\u0197" + + "\u0198\x05\u016F\xB3\x02\u0198\u0199\x05\u015F\xAB\x02\u0199\u019A\x05" + + "\u0157\xA7\x02\u019A\u019B\x05\u0141\x9C\x02\u019B\u019C\x05\u0151\xA4" + + "\x02\u019C\u019D\x05\u015B\xA9\x02\u019D\u019E\x03\x02\x02\x02\u019E\u019F" + + "\b\x06\x05\x02\u019F\x16\x03\x02\x02\x02\u01A0\u01A1\x05\u014B\xA1\x02" + + "\u01A1\u01A2\x05\u0163\xAD\x02\u01A2\u01A3\x05\u015D\xAA\x02\u01A3\u01A4" + + "\x05\u0159\xA8\x02\u01A4\u01A5\x03\x02\x02\x02\u01A5\u01A6\b\x07\x06\x02" + + "\u01A6\x18\x03\x02\x02\x02\u01A7\u01A8\x05\u014D\xA2\x02\u01A8\u01A9\x05" + + "\u0163\xAD\x02\u01A9\u01AA\x05\u015D\xAA\x02\u01AA\u01AB\x05\u0155\xA6" + + "\x02\u01AB\u01AC\x03\x02\x02\x02\u01AC\u01AD\b\b\x02\x02\u01AD\x1A\x03" + + "\x02\x02\x02\u01AE\u01AF\x05\u0151\xA4\x02\u01AF\u01B0\x05\u015B\xA9\x02" + + "\u01B0\u01B1\x05\u0157\xA7\x02\u01B1\u01B2\x05\u0151\xA4\x02\u01B2\u01B3" + + "\x05\u015B\xA9\x02\u01B3\u01B4\x05\u0149\xA0\x02\u01B4\u01B5\x05\u0165" + + "\xAE\x02\u01B5\u01B6\x05\u0167\xAF\x02\u01B6\u01B7\x05\u0141\x9C\x02\u01B7" + + "\u01B8\x05\u0167\xAF\x02\u01B8\u01B9\x05\u0165\xAE\x02\u01B9\u01BA\x03" + + "\x02\x02\x02\u01BA\u01BB\b\t\x02\x02\u01BB\x1C\x03\x02\x02\x02\u01BC\u01BD" + + "\x05\u0155\xA6\x02\u01BD\u01BE\x05\u0149\xA0\x02\u01BE\u01BF\x05\u0149" + + "\xA0\x02\u01BF\u01C0\x05\u015F\xAB\x02\u01C0\u01C1\x03\x02\x02\x02\u01C1" + + "\u01C2\b\n\x03\x02\u01C2\x1E\x03\x02\x02\x02\u01C3\u01C4\x05\u0157\xA7" + + "\x02\u01C4\u01C5\x05\u0151\xA4\x02\u01C5\u01C6\x05\u0159\xA8\x02\u01C6" + + "\u01C7\x05\u0151\xA4\x02\u01C7\u01C8\x05\u0167\xAF\x02\u01C8\u01C9\x03" + + "\x02\x02\x02\u01C9\u01CA\b\v\x02\x02\u01CA \x03\x02\x02\x02\u01CB\u01CC" + + "\x05\u0159\xA8\x02\u01CC\u01CD\x05\u016B\xB1\x02\u01CD\u01CE\x05U&\x02" + + "\u01CE\u01CF\x05\u0149\xA0\x02\u01CF\u01D0\x05\u016F\xB3\x02\u01D0\u01D1" + + "\x05\u015F\xAB\x02\u01D1\u01D2\x05\u0141\x9C\x02\u01D2\u01D3\x05\u015B" + + "\xA9\x02\u01D3\u01D4\x05\u0147\x9F\x02\u01D4\u01D5\x03\x02\x02\x02\u01D5" + + "\u01D6\b\f\x07\x02\u01D6\"\x03\x02\x02\x02\u01D7\u01D8\x05\u015F\xAB\x02" + + "\u01D8\u01D9\x05\u0163\xAD\x02\u01D9\u01DA\x05\u015D\xAA\x02\u01DA\u01DB" + + "\x05\u0153\xA5\x02\u01DB\u01DC\x05\u0149\xA0\x02\u01DC\u01DD\x05\u0145" + + "\x9E\x02\u01DD\u01DE\x05\u0167\xAF\x02\u01DE\u01DF\x03\x02\x02\x02\u01DF" + + "\u01E0\b\r\x03\x02\u01E0$\x03\x02\x02\x02\u01E1\u01E2\x05\u0163\xAD\x02" + + "\u01E2\u01E3\x05\u0149\xA0\x02\u01E3\u01E4\x05\u015B\xA9\x02\u01E4\u01E5" + + "\x05\u0141\x9C\x02\u01E5\u01E6\x05\u0159\xA8\x02\u01E6\u01E7\x05\u0149" + + "\xA0\x02\u01E7\u01E8\x03\x02\x02\x02\u01E8\u01E9\b\x0E\b\x02\u01E9&\x03" + + "\x02\x02\x02\u01EA\u01EB\x05\u0163\xAD\x02\u01EB\u01EC\x05\u015D\xAA\x02" + + "\u01EC\u01ED\x05\u016D\xB2\x02\u01ED\u01EE\x03\x02\x02\x02\u01EE\u01EF" + + "\b\x0F\x02\x02\u01EF(\x03\x02\x02\x02\u01F0\u01F1\x05\u0165\xAE\x02\u01F1" + + "\u01F2\x05\u014F\xA3\x02\u01F2\u01F3\x05\u015D\xAA\x02\u01F3\u01F4\x05" + + "\u016D\xB2\x02\u01F4\u01F5\x03\x02\x02\x02\u01F5\u01F6\b\x10\t\x02\u01F6" + + "*\x03\x02\x02\x02\u01F7\u01F8\x05\u0165\xAE\x02\u01F8\u01F9\x05\u015D" + + "\xAA\x02\u01F9\u01FA\x05\u0163\xAD\x02\u01FA\u01FB\x05\u0167\xAF\x02\u01FB" + + "\u01FC\x03\x02\x02\x02\u01FC\u01FD\b\x11\x02\x02\u01FD,\x03\x02\x02\x02" + + "\u01FE\u01FF\x05\u0165\xAE\x02\u01FF\u0200\x05\u0167\xAF\x02\u0200\u0201" + + "\x05\u0141\x9C\x02\u0201\u0202\x05\u0167\xAF\x02\u0202\u0203\x05\u0165" + + "\xAE\x02\u0203\u0204\x03\x02\x02\x02\u0204\u0205\b\x12\x02\x02\u0205." + + "\x03\x02\x02\x02\u0206\u0207\x05\u016D\xB2\x02\u0207\u0208\x05\u014F\xA3" + + "\x02\u0208\u0209\x05\u0149\xA0\x02\u0209\u020A\x05\u0163\xAD\x02\u020A" + + "\u020B\x05\u0149\xA0\x02\u020B\u020C\x03\x02\x02\x02\u020C\u020D\b\x13" + + "\x02\x02\u020D0\x03\x02\x02\x02\u020E\u0210\n\x02\x02\x02\u020F\u020E" + + "\x03\x02\x02\x02\u0210\u0211\x03\x02\x02\x02\u0211\u020F\x03\x02\x02\x02" + + "\u0211\u0212\x03\x02\x02\x02\u0212\u0213\x03\x02\x02\x02\u0213\u0214\b" + + "\x14\x02\x02\u02142\x03\x02\x02\x02\u0215\u0216\x071\x02\x02\u0216\u0217" + + "\x071\x02\x02\u0217\u021B\x03\x02\x02\x02\u0218\u021A\n\x03\x02\x02\u0219" + + "\u0218\x03\x02\x02\x02\u021A\u021D\x03\x02\x02\x02\u021B\u0219\x03\x02" + + "\x02\x02\u021B\u021C\x03\x02\x02\x02\u021C\u021F\x03\x02\x02\x02\u021D" + + "\u021B\x03\x02\x02\x02\u021E\u0220\x07\x0F\x02\x02\u021F\u021E\x03\x02" + + "\x02\x02\u021F\u0220\x03\x02\x02\x02\u0220\u0222\x03\x02\x02\x02\u0221" + + "\u0223\x07\f\x02\x02\u0222\u0221\x03\x02\x02\x02\u0222\u0223\x03\x02\x02" + + "\x02\u0223\u0224\x03\x02\x02\x02\u0224\u0225\b\x15\n\x02\u02254\x03\x02" + + "\x02\x02\u0226\u0227\x071\x02\x02\u0227\u0228\x07,\x02\x02\u0228\u022D" + + "\x03\x02\x02\x02\u0229\u022C\x055\x16\x02\u022A\u022C\v\x02\x02\x02\u022B" + + "\u0229\x03\x02\x02\x02\u022B\u022A\x03\x02\x02\x02\u022C\u022F\x03\x02" + + "\x02\x02\u022D\u022E\x03\x02\x02\x02\u022D\u022B\x03\x02\x02\x02\u022E" + + "\u0230\x03\x02\x02\x02\u022F\u022D\x03\x02\x02\x02\u0230\u0231\x07,\x02" + + "\x02\u0231\u0232\x071\x02\x02\u0232\u0233\x03\x02\x02\x02\u0233\u0234" + + "\b\x16\n\x02\u02346\x03\x02\x02\x02\u0235\u0237\t\x04\x02\x02\u0236\u0235" + + "\x03\x02\x02\x02\u0237\u0238\x03\x02\x02\x02\u0238\u0236\x03\x02\x02\x02" + + "\u0238\u0239\x03\x02\x02\x02\u0239\u023A\x03\x02\x02\x02\u023A\u023B\b" + + "\x17\n\x02\u023B8\x03\x02\x02\x02\u023C\u023D\x05\xA3M\x02\u023D\u023E" + + "\x03\x02\x02\x02\u023E\u023F\b\x18\v\x02\u023F\u0240\b\x18\f\x02\u0240" + + ":\x03\x02\x02\x02\u0241\u0242\x05C\x1D\x02\u0242\u0243\x03\x02\x02\x02" + + "\u0243\u0244\b\x19\r\x02\u0244\u0245\b\x19\x0E\x02\u0245<\x03\x02\x02" + + "\x02\u0246\u0247\x057\x17\x02\u0247\u0248\x03\x02\x02\x02\u0248\u0249" + + "\b\x1A\n\x02\u0249>\x03\x02\x02\x02\u024A\u024B\x053\x15\x02\u024B\u024C" + + "\x03\x02\x02\x02\u024C\u024D\b\x1B\n\x02\u024D@\x03\x02\x02\x02\u024E" + + "\u024F\x055\x16\x02\u024F\u0250\x03\x02\x02\x02\u0250\u0251\b\x1C\n\x02" + + "\u0251B\x03\x02\x02\x02\u0252\u0253\x07~\x02\x02\u0253\u0254\x03\x02\x02" + + "\x02\u0254\u0255\b\x1D\x0E\x02\u0255D\x03\x02\x02\x02\u0256\u0257\t\x05" + + "\x02\x02\u0257F\x03\x02\x02\x02\u0258\u0259\t\x06\x02\x02\u0259H\x03\x02" + + "\x02\x02\u025A\u025B\x07^\x02\x02\u025B\u025C\t\x07\x02\x02\u025CJ\x03" + + "\x02\x02\x02\u025D\u025E\n\b\x02\x02\u025EL\x03\x02\x02\x02\u025F\u0261" + + "\t\t\x02\x02\u0260\u0262\t\n\x02\x02\u0261\u0260\x03\x02\x02\x02\u0261" + + "\u0262\x03\x02\x02\x02\u0262\u0264\x03\x02\x02\x02\u0263\u0265\x05E\x1E" + + "\x02\u0264\u0263\x03\x02\x02\x02\u0265\u0266\x03\x02\x02\x02\u0266\u0264" + + "\x03\x02\x02\x02\u0266\u0267\x03\x02\x02\x02\u0267N\x03\x02\x02\x02\u0268" + + "\u0269\x07B\x02\x02\u0269P\x03\x02\x02\x02\u026A\u026B\x07b\x02\x02\u026B" + + "R\x03\x02\x02\x02\u026C\u0270\n\v\x02\x02\u026D\u026E\x07b\x02\x02\u026E" + + "\u0270\x07b\x02\x02\u026F\u026C\x03\x02\x02\x02\u026F\u026D\x03\x02\x02" + + "\x02\u0270T\x03\x02\x02\x02\u0271\u0272\x07a\x02\x02\u0272V\x03\x02\x02" + + "\x02\u0273\u0277\x05G\x1F\x02\u0274\u0277\x05E\x1E\x02\u0275\u0277\x05" + + "U&\x02\u0276\u0273\x03\x02\x02\x02\u0276\u0274\x03\x02\x02\x02\u0276\u0275" + + "\x03\x02\x02\x02\u0277X\x03\x02\x02\x02\u0278\u027D\x07$\x02\x02\u0279" + + "\u027C\x05I \x02\u027A\u027C\x05K!\x02\u027B\u0279\x03\x02\x02\x02\u027B" + + "\u027A\x03\x02\x02\x02\u027C\u027F\x03\x02\x02\x02\u027D\u027B\x03\x02" + + "\x02\x02\u027D\u027E\x03\x02\x02\x02\u027E\u0280\x03\x02\x02\x02\u027F" + + "\u027D\x03\x02\x02\x02\u0280\u0296\x07$\x02\x02\u0281\u0282\x07$\x02\x02" + + "\u0282\u0283\x07$\x02\x02\u0283\u0284\x07$\x02\x02\u0284\u0288\x03\x02" + + "\x02\x02\u0285\u0287\n\x03\x02\x02\u0286\u0285\x03\x02\x02\x02\u0287\u028A" + + "\x03\x02\x02\x02\u0288\u0289\x03\x02\x02\x02\u0288\u0286\x03\x02\x02\x02" + + "\u0289\u028B\x03\x02\x02\x02\u028A\u0288\x03\x02\x02\x02\u028B\u028C\x07" + + "$\x02\x02\u028C\u028D\x07$\x02\x02\u028D\u028E\x07$\x02\x02\u028E\u0290" + + "\x03\x02\x02\x02\u028F\u0291\x07$\x02\x02\u0290\u028F\x03\x02\x02\x02" + + "\u0290\u0291\x03\x02\x02\x02\u0291\u0293\x03\x02\x02\x02\u0292\u0294\x07" + + "$\x02\x02\u0293\u0292\x03\x02\x02\x02\u0293\u0294\x03\x02\x02\x02\u0294" + + "\u0296\x03\x02\x02\x02\u0295\u0278\x03\x02\x02\x02\u0295\u0281\x03\x02" + + "\x02\x02\u0296Z\x03\x02\x02\x02\u0297\u0299\x05E\x1E\x02\u0298\u0297\x03" + + "\x02\x02\x02\u0299\u029A\x03\x02\x02\x02\u029A\u0298\x03\x02\x02\x02\u029A" + + "\u029B\x03\x02\x02\x02\u029B\\\x03\x02\x02\x02\u029C\u029E\x05E\x1E\x02" + + "\u029D\u029C\x03\x02\x02\x02\u029E\u029F\x03\x02\x02\x02\u029F\u029D\x03" + + "\x02\x02\x02\u029F\u02A0\x03\x02\x02\x02\u02A0\u02A1\x03\x02\x02\x02\u02A1" + + "\u02A5\x05k1\x02\u02A2\u02A4\x05E\x1E\x02\u02A3\u02A2\x03\x02\x02\x02" + + "\u02A4\u02A7\x03\x02\x02\x02\u02A5\u02A3\x03\x02\x02\x02\u02A5\u02A6\x03" + + "\x02\x02\x02\u02A6\u02C7\x03\x02\x02\x02\u02A7\u02A5\x03\x02\x02\x02\u02A8" + + "\u02AA\x05k1\x02\u02A9\u02AB\x05E\x1E\x02\u02AA\u02A9\x03\x02\x02\x02" + + "\u02AB\u02AC\x03\x02\x02\x02\u02AC\u02AA\x03\x02\x02\x02\u02AC\u02AD\x03" + + "\x02\x02\x02\u02AD\u02C7\x03\x02\x02\x02\u02AE\u02B0\x05E\x1E\x02\u02AF" + + "\u02AE\x03\x02\x02\x02\u02B0\u02B1\x03\x02\x02\x02\u02B1\u02AF\x03\x02" + + "\x02\x02\u02B1\u02B2\x03\x02\x02\x02\u02B2\u02BA\x03\x02\x02\x02\u02B3" + + "\u02B7\x05k1\x02\u02B4\u02B6\x05E\x1E\x02\u02B5\u02B4\x03\x02\x02\x02" + + "\u02B6\u02B9\x03\x02\x02\x02\u02B7\u02B5\x03\x02\x02\x02\u02B7\u02B8\x03" + + "\x02\x02\x02\u02B8\u02BB\x03\x02\x02\x02\u02B9\u02B7\x03\x02\x02\x02\u02BA" + + "\u02B3\x03\x02\x02\x02\u02BA\u02BB\x03\x02\x02\x02\u02BB\u02BC\x03\x02" + + "\x02\x02\u02BC\u02BD\x05M\"\x02\u02BD\u02C7\x03\x02\x02\x02\u02BE\u02C0" + + "\x05k1\x02\u02BF\u02C1\x05E\x1E\x02\u02C0\u02BF\x03\x02\x02\x02\u02C1" + + "\u02C2\x03\x02\x02\x02\u02C2\u02C0\x03\x02\x02\x02\u02C2\u02C3\x03\x02" + + "\x02\x02\u02C3\u02C4\x03\x02\x02\x02\u02C4\u02C5\x05M\"\x02\u02C5\u02C7" + + "\x03\x02\x02\x02\u02C6\u029D\x03\x02\x02\x02\u02C6\u02A8\x03\x02\x02\x02" + + "\u02C6\u02AF\x03\x02\x02\x02\u02C6\u02BE\x03\x02\x02\x02\u02C7^\x03\x02" + + "\x02\x02\u02C8\u02C9\x05\u0143\x9D\x02\u02C9\u02CA\x05\u0171\xB4\x02\u02CA" + + "`\x03\x02\x02\x02\u02CB\u02CC\x05\u0141\x9C\x02\u02CC\u02CD\x05\u015B" + + "\xA9\x02\u02CD\u02CE\x05\u0147\x9F\x02\u02CEb\x03\x02\x02\x02\u02CF\u02D0" + + "\x05\u0141\x9C\x02\u02D0\u02D1\x05\u0165\xAE\x02\u02D1\u02D2\x05\u0145" + + "\x9E\x02\u02D2d\x03\x02\x02\x02\u02D3\u02D4\x07?\x02\x02\u02D4f\x03\x02" + + "\x02\x02\u02D5\u02D6\x07.\x02\x02\u02D6h\x03\x02\x02\x02\u02D7\u02D8\x05" + + "\u0147\x9F\x02\u02D8\u02D9\x05\u0149\xA0\x02\u02D9\u02DA\x05\u0165\xAE" + + "\x02\u02DA\u02DB\x05\u0145\x9E\x02\u02DBj\x03\x02\x02\x02\u02DC\u02DD" + + "\x070\x02\x02\u02DDl\x03\x02\x02\x02\u02DE\u02DF\x05\u014B\xA1\x02\u02DF" + + "\u02E0\x05\u0141\x9C\x02\u02E0\u02E1\x05\u0157\xA7\x02\u02E1\u02E2\x05" + + "\u0165\xAE\x02\u02E2\u02E3\x05\u0149\xA0\x02\u02E3n\x03\x02\x02\x02\u02E4" + + "\u02E5\x05\u014B\xA1\x02\u02E5\u02E6\x05\u0151\xA4\x02\u02E6\u02E7\x05" + + "\u0163\xAD\x02\u02E7\u02E8\x05\u0165\xAE\x02\u02E8\u02E9\x05\u0167\xAF" + + "\x02\u02E9p\x03\x02\x02\x02\u02EA\u02EB\x05\u0157\xA7\x02\u02EB\u02EC" + + "\x05\u0141\x9C\x02\u02EC\u02ED\x05\u0165\xAE\x02\u02ED\u02EE\x05\u0167" + + "\xAF\x02\u02EEr\x03\x02\x02\x02\u02EF\u02F0\x07*\x02\x02\u02F0t\x03\x02" + + "\x02\x02\u02F1\u02F2\x05\u0151\xA4\x02\u02F2\u02F3\x05\u015B\xA9\x02\u02F3" + + "v\x03\x02\x02\x02\u02F4\u02F5\x05\u0151\xA4\x02\u02F5\u02F6\x05\u0165" + + "\xAE\x02\u02F6x\x03\x02\x02\x02\u02F7\u02F8\x05\u0157\xA7\x02\u02F8\u02F9" + + "\x05\u0151\xA4\x02\u02F9\u02FA\x05\u0155\xA6\x02\u02FA\u02FB\x05\u0149" + + "\xA0\x02\u02FBz\x03\x02\x02\x02\u02FC\u02FD\x05\u015B\xA9\x02\u02FD\u02FE" + + "\x05\u015D\xAA\x02\u02FE\u02FF\x05\u0167\xAF\x02\u02FF|\x03\x02\x02\x02" + + "\u0300\u0301\x05\u015B\xA9\x02\u0301\u0302\x05\u0169\xB0\x02\u0302\u0303" + + "\x05\u0157\xA7\x02\u0303\u0304\x05\u0157\xA7\x02\u0304~\x03\x02\x02\x02" + + "\u0305\u0306\x05\u015B\xA9\x02\u0306\u0307\x05\u0169\xB0\x02\u0307\u0308" + + "\x05\u0157\xA7\x02\u0308\u0309\x05\u0157\xA7\x02\u0309\u030A\x05\u0165" + + "\xAE\x02\u030A\x80\x03\x02\x02\x02\u030B\u030C\x05\u015D\xAA\x02\u030C" + + "\u030D\x05\u0163\xAD\x02\u030D\x82\x03\x02\x02\x02\u030E\u030F\x07A\x02" + + "\x02\u030F\x84\x03\x02\x02\x02\u0310\u0311\x05\u0163\xAD\x02\u0311\u0312" + + "\x05\u0157\xA7\x02\u0312\u0313\x05\u0151\xA4\x02\u0313\u0314\x05\u0155" + + "\xA6\x02\u0314\u0315\x05\u0149\xA0\x02\u0315\x86\x03\x02\x02\x02\u0316" + + "\u0317\x07+\x02\x02\u0317\x88\x03\x02\x02\x02\u0318\u0319\x05\u0167\xAF" + + "\x02\u0319\u031A\x05\u0163\xAD\x02\u031A\u031B\x05\u0169\xB0\x02\u031B" + + "\u031C\x05\u0149\xA0\x02\u031C\x8A\x03\x02\x02\x02\u031D\u031E\x07?\x02" + + "\x02\u031E\u031F\x07?\x02\x02\u031F\x8C\x03\x02\x02\x02\u0320\u0321\x07" + + "?\x02\x02\u0321\u0322\x07\x80\x02\x02\u0322\x8E\x03\x02\x02\x02\u0323" + + "\u0324\x07#\x02\x02\u0324\u0325\x07?\x02\x02\u0325\x90\x03\x02\x02\x02" + + "\u0326\u0327\x07>\x02\x02\u0327\x92\x03\x02\x02\x02\u0328\u0329\x07>\x02" + + "\x02\u0329\u032A\x07?\x02\x02\u032A\x94\x03\x02\x02\x02\u032B\u032C\x07" + + "@\x02\x02\u032C\x96\x03\x02\x02\x02\u032D\u032E\x07@\x02\x02\u032E\u032F" + + "\x07?\x02\x02\u032F\x98\x03\x02\x02\x02\u0330\u0331\x07-\x02\x02\u0331" + + "\x9A\x03\x02\x02\x02\u0332\u0333\x07/\x02\x02\u0333\x9C\x03\x02\x02\x02" + + "\u0334\u0335\x07,\x02\x02\u0335\x9E\x03\x02\x02\x02\u0336\u0337\x071\x02" + + "\x02\u0337\xA0\x03\x02\x02\x02\u0338\u0339\x07\'\x02\x02\u0339\xA2\x03" + + "\x02\x02\x02\u033A\u033B\x07]\x02\x02\u033B\u033C\x03\x02\x02\x02\u033C" + + "\u033D\bM\x02\x02\u033D\u033E\bM\x02\x02\u033E\xA4\x03\x02\x02\x02\u033F" + + "\u0340\x07_\x02\x02\u0340\u0341\x03\x02\x02\x02\u0341\u0342\bN\x0E\x02" + + "\u0342\u0343\bN\x0E\x02\u0343\xA6\x03\x02\x02\x02\u0344\u0348\x05G\x1F" + + "\x02\u0345\u0347\x05W\'\x02\u0346\u0345\x03\x02\x02\x02\u0347\u034A\x03" + + "\x02\x02\x02\u0348\u0346\x03\x02\x02\x02\u0348\u0349\x03\x02\x02\x02\u0349" + + "\u0355\x03\x02\x02\x02\u034A\u0348\x03\x02\x02\x02\u034B\u034E\x05U&\x02" + + "\u034C\u034E\x05O#\x02\u034D\u034B\x03\x02\x02\x02\u034D\u034C\x03\x02" + + "\x02\x02\u034E\u0350\x03\x02\x02\x02\u034F\u0351\x05W\'\x02\u0350\u034F" + + "\x03\x02\x02\x02\u0351\u0352\x03\x02\x02\x02\u0352\u0350\x03\x02\x02\x02" + + "\u0352\u0353\x03\x02\x02\x02\u0353\u0355\x03\x02\x02\x02\u0354\u0344\x03" + + "\x02\x02\x02\u0354\u034D\x03\x02\x02\x02\u0355\xA8\x03\x02\x02\x02\u0356" + + "\u0358\x05Q$\x02\u0357\u0359\x05S%\x02\u0358\u0357\x03\x02\x02\x02\u0359" + + "\u035A\x03\x02\x02\x02\u035A\u0358\x03\x02\x02\x02\u035A\u035B\x03\x02" + + "\x02\x02\u035B\u035C\x03\x02\x02\x02\u035C\u035D\x05Q$\x02\u035D\xAA\x03" + + "\x02\x02\x02\u035E\u035F\x053\x15\x02\u035F\u0360\x03\x02\x02\x02\u0360" + + "\u0361\bQ\n\x02\u0361\xAC\x03\x02\x02\x02\u0362\u0363\x055\x16\x02\u0363" + + "\u0364\x03\x02\x02\x02\u0364\u0365\bR\n\x02\u0365\xAE\x03\x02\x02\x02" + + "\u0366\u0367\x057\x17\x02\u0367\u0368\x03\x02\x02\x02\u0368\u0369\bS\n" + + "\x02\u0369\xB0\x03\x02\x02\x02\u036A\u036B\x05C\x1D\x02\u036B\u036C\x03" + + "\x02\x02\x02\u036C\u036D\bT\r\x02\u036D\u036E\bT\x0E\x02\u036E\xB2\x03" + + "\x02\x02\x02\u036F\u0370\x05\xA3M\x02\u0370\u0371\x03\x02\x02\x02\u0371" + + "\u0372\bU\v\x02\u0372\xB4\x03\x02\x02\x02\u0373\u0374\x05\xA5N\x02\u0374" + + "\u0375\x03\x02\x02\x02\u0375\u0376\bV\x0F\x02\u0376\xB6\x03\x02\x02\x02" + + "\u0377\u0378\x05g/\x02\u0378\u0379\x03\x02\x02\x02\u0379\u037A\bW\x10" + + "\x02\u037A\xB8\x03\x02\x02\x02\u037B\u037C\x05e.\x02\u037C\u037D\x03\x02" + + "\x02\x02\u037D\u037E\bX\x11\x02\u037E\xBA\x03\x02\x02\x02\u037F\u0380" + + "\x05\u0159\xA8\x02\u0380\u0381\x05\u0149\xA0\x02\u0381\u0382\x05\u0167" + + "\xAF\x02\u0382\u0383\x05\u0141\x9C\x02\u0383\u0384\x05\u0147\x9F\x02\u0384" + + "\u0385\x05\u0141\x9C\x02\u0385\u0386\x05\u0167\xAF\x02\u0386\u0387\x05" + + "\u0141\x9C\x02\u0387\xBC\x03\x02\x02\x02\u0388\u038C\n\f\x02\x02\u0389" + + "\u038A\x071\x02\x02\u038A\u038C\n\r\x02\x02\u038B\u0388\x03\x02\x02\x02" + + "\u038B\u0389\x03\x02\x02\x02\u038C\xBE\x03\x02\x02\x02\u038D\u038F\x05" + + "\xBDZ\x02\u038E\u038D\x03\x02\x02\x02\u038F\u0390\x03\x02\x02\x02\u0390" + + "\u038E\x03\x02\x02\x02\u0390\u0391\x03\x02\x02\x02\u0391\xC0\x03\x02\x02" + + "\x02\u0392\u0393\x05\xA9P\x02\u0393\u0394\x03\x02\x02\x02\u0394\u0395" + + "\b\\\x12\x02\u0395\xC2\x03\x02\x02\x02\u0396\u0397\x053\x15\x02\u0397" + + "\u0398\x03\x02\x02\x02\u0398\u0399\b]\n\x02\u0399\xC4\x03\x02\x02\x02" + + "\u039A\u039B\x055\x16\x02\u039B\u039C\x03\x02\x02\x02\u039C\u039D\b^\n" + + "\x02\u039D\xC6\x03\x02\x02\x02\u039E\u039F\x057\x17\x02\u039F\u03A0\x03" + + "\x02\x02\x02\u03A0\u03A1\b_\n\x02\u03A1\xC8\x03\x02\x02\x02\u03A2\u03A3" + + "\x05C\x1D\x02\u03A3\u03A4\x03\x02\x02\x02\u03A4\u03A5\b`\r\x02\u03A5\u03A6" + + "\b`\x0E\x02\u03A6\xCA\x03\x02\x02\x02\u03A7\u03A8\x05k1\x02\u03A8\u03A9" + + "\x03\x02\x02\x02\u03A9\u03AA\ba\x13\x02\u03AA\xCC\x03\x02\x02\x02\u03AB" + + "\u03AC\x05g/\x02\u03AC\u03AD\x03\x02\x02\x02\u03AD\u03AE\bb\x10\x02\u03AE" + + "\xCE\x03\x02\x02\x02\u03AF\u03B4\x05G\x1F\x02\u03B0\u03B4\x05E\x1E\x02" + + "\u03B1\u03B4\x05U&\x02\u03B2\u03B4\x05\x9DJ\x02\u03B3\u03AF\x03\x02\x02" + + "\x02\u03B3\u03B0\x03\x02\x02\x02\u03B3\u03B1\x03\x02\x02\x02\u03B3\u03B2" + + "\x03\x02\x02\x02\u03B4\xD0\x03\x02\x02\x02\u03B5\u03B8\x05G\x1F\x02\u03B6" + + "\u03B8\x05\x9DJ\x02\u03B7\u03B5\x03\x02\x02\x02\u03B7\u03B6\x03\x02\x02" + + "\x02\u03B8\u03BC\x03\x02\x02\x02\u03B9\u03BB\x05\xCFc\x02\u03BA\u03B9" + + "\x03\x02\x02\x02\u03BB\u03BE\x03\x02\x02\x02\u03BC\u03BA\x03\x02\x02\x02" + + "\u03BC\u03BD\x03\x02\x02\x02\u03BD\u03C9\x03\x02\x02\x02\u03BE\u03BC\x03" + + "\x02\x02\x02\u03BF\u03C2\x05U&\x02\u03C0\u03C2\x05O#\x02\u03C1\u03BF\x03" + + "\x02\x02\x02\u03C1\u03C0\x03\x02\x02\x02\u03C2\u03C4\x03\x02\x02\x02\u03C3" + + "\u03C5\x05\xCFc\x02\u03C4\u03C3\x03\x02\x02\x02\u03C5\u03C6\x03\x02\x02" + + "\x02\u03C6\u03C4\x03\x02\x02\x02\u03C6\u03C7\x03\x02\x02\x02\u03C7\u03C9" + + "\x03\x02\x02\x02\u03C8\u03B7\x03\x02\x02\x02\u03C8\u03C1\x03\x02\x02\x02" + + "\u03C9\xD2\x03\x02\x02\x02\u03CA\u03CB\x05\xD1d\x02\u03CB\u03CC\x03\x02" + + "\x02\x02\u03CC\u03CD\be\x14\x02\u03CD\xD4\x03\x02\x02\x02\u03CE\u03CF" + + "\x05\xA9P\x02\u03CF\u03D0\x03\x02\x02\x02\u03D0\u03D1\bf\x12\x02\u03D1" + + "\xD6\x03\x02\x02\x02\u03D2\u03D3\x053\x15\x02\u03D3\u03D4\x03\x02\x02" + + "\x02\u03D4\u03D5\bg\n\x02\u03D5\xD8\x03\x02\x02\x02\u03D6\u03D7\x055\x16" + + "\x02\u03D7\u03D8\x03\x02\x02\x02\u03D8\u03D9\bh\n\x02\u03D9\xDA\x03\x02" + + "\x02\x02\u03DA\u03DB\x057\x17\x02\u03DB\u03DC\x03\x02\x02\x02\u03DC\u03DD" + + "\bi\n\x02\u03DD\xDC\x03\x02\x02\x02\u03DE\u03DF\x05C\x1D\x02\u03DF\u03E0" + + "\x03\x02\x02\x02\u03E0\u03E1\bj\r\x02\u03E1\u03E2\bj\x0E\x02\u03E2\xDE" + + "\x03\x02\x02\x02\u03E3\u03E4\x05e.\x02\u03E4\u03E5\x03\x02\x02\x02\u03E5" + + "\u03E6\bk\x11\x02\u03E6\xE0\x03\x02\x02\x02\u03E7\u03E8\x05g/\x02\u03E8" + + "\u03E9\x03\x02\x02\x02\u03E9\u03EA\bl\x10\x02\u03EA\xE2\x03\x02\x02\x02" + + "\u03EB\u03EC\x05k1\x02\u03EC\u03ED\x03\x02\x02\x02\u03ED\u03EE\bm\x13" + + "\x02\u03EE\xE4\x03\x02\x02\x02\u03EF\u03F0\x05\u0141\x9C\x02\u03F0\u03F1" + + "\x05\u0165\xAE\x02\u03F1\xE6\x03\x02\x02\x02\u03F2\u03F3\x05\xA9P\x02" + + "\u03F3\u03F4\x03\x02\x02\x02\u03F4\u03F5\bo\x12\x02\u03F5\xE8\x03\x02" + + "\x02\x02\u03F6\u03F7\x05\xD1d\x02\u03F7\u03F8\x03\x02\x02\x02\u03F8\u03F9" + + "\bp\x14\x02\u03F9\xEA\x03\x02\x02\x02\u03FA\u03FB\x053\x15\x02\u03FB\u03FC" + + "\x03\x02\x02\x02\u03FC\u03FD\bq\n\x02\u03FD\xEC\x03\x02\x02\x02\u03FE" + + "\u03FF\x055\x16\x02\u03FF\u0400\x03\x02\x02\x02\u0400\u0401\br\n\x02\u0401" + + "\xEE\x03\x02\x02\x02\u0402\u0403\x057\x17\x02\u0403\u0404\x03\x02\x02" + + "\x02\u0404\u0405\bs\n\x02\u0405\xF0\x03\x02\x02\x02\u0406\u0407\x05C\x1D" + + "\x02\u0407\u0408\x03\x02\x02\x02\u0408\u0409\bt\r\x02\u0409\u040A\bt\x0E" + + "\x02\u040A\xF2\x03\x02\x02\x02\u040B\u040C\x05\xA3M\x02\u040C\u040D\x03" + + "\x02\x02\x02\u040D\u040E\bu\v\x02\u040E\u040F\bu\x15\x02\u040F\xF4\x03" + + "\x02\x02\x02\u0410\u0411\x05\u015D\xAA\x02\u0411\u0412\x05\u015B\xA9\x02" + + "\u0412\u0413\x03\x02\x02\x02\u0413\u0414\bv\x16\x02\u0414\xF6\x03\x02" + + "\x02\x02\u0415\u0416\x05\u016D\xB2\x02\u0416\u0417\x05\u0151\xA4\x02\u0417" + + "\u0418\x05\u0167\xAF\x02\u0418\u0419\x05\u014F\xA3\x02\u0419\u041A\x03" + + "\x02\x02\x02\u041A\u041B\bw\x16\x02\u041B\xF8\x03\x02\x02\x02\u041C\u041D" + + "\n\x0E\x02\x02\u041D\xFA\x03\x02\x02\x02\u041E\u0421\x05G\x1F\x02\u041F" + + "\u0421\x05E\x1E\x02\u0420\u041E\x03\x02\x02\x02\u0420\u041F\x03\x02\x02" + + "\x02\u0421\u0425\x03\x02\x02\x02\u0422\u0424\x05\xF9x\x02\u0423\u0422" + + "\x03\x02\x02\x02\u0424\u0427\x03\x02\x02\x02\u0425\u0423\x03\x02\x02\x02" + + "\u0425\u0426\x03\x02\x02\x02\u0426\xFC\x03\x02\x02\x02\u0427\u0425\x03" + + "\x02\x02\x02\u0428\u0429\x05\xA9P\x02\u0429\u042A\x03\x02\x02\x02\u042A" + + "\u042B\bz\x12\x02\u042B\xFE\x03\x02\x02\x02\u042C\u042D\x05\xFBy\x02\u042D" + + "\u042E\x03\x02\x02\x02\u042E\u042F\b{\x17\x02\u042F\u0100\x03\x02\x02" + + "\x02\u0430\u0431\x053\x15\x02\u0431\u0432\x03\x02\x02\x02\u0432\u0433" + + "\b|\n\x02\u0433\u0102\x03\x02\x02\x02\u0434\u0435\x055\x16\x02\u0435\u0436" + + "\x03\x02\x02\x02\u0436\u0437\b}\n\x02\u0437\u0104\x03\x02\x02\x02\u0438" + + "\u0439\x057\x17\x02\u0439\u043A\x03\x02\x02\x02\u043A\u043B\b~\n\x02\u043B" + + "\u0106\x03\x02\x02\x02\u043C\u043D\x05C\x1D\x02\u043D\u043E\x03\x02\x02" + + "\x02\u043E\u043F\b\x7F\r\x02\u043F\u0440\b\x7F\x0E\x02\u0440\u0441\b\x7F" + + "\x0E\x02\u0441\u0108\x03\x02\x02\x02\u0442\u0443\x05e.\x02\u0443\u0444" + + "\x03\x02\x02\x02\u0444\u0445\b\x80\x11\x02\u0445\u010A\x03\x02\x02\x02" + + "\u0446\u0447\x05g/\x02\u0447\u0448\x03\x02\x02\x02\u0448\u0449\b\x81\x10" + + "\x02\u0449\u010C\x03\x02\x02\x02\u044A\u044B\x05k1"; private static readonly _serializedATNSegment2: string = - "\u044D\u044E\x05\xCFc\x02\u044E\u044F\x03\x02\x02\x02\u044F\u0450\b\x83" + - "\x14\x02\u0450\u0110\x03\x02\x02\x02\u0451\u0452\x05\xA7O\x02\u0452\u0453" + - "\x03\x02\x02\x02\u0453\u0454\b\x84\x12\x02\u0454\u0112\x03\x02\x02\x02" + - "\u0455\u0456\x053\x15\x02\u0456\u0457\x03\x02\x02\x02\u0457\u0458\b\x85" + - "\n\x02\u0458\u0114\x03\x02\x02\x02\u0459\u045A\x055\x16\x02\u045A\u045B" + - "\x03\x02\x02\x02\u045B\u045C\b\x86\n\x02\u045C\u0116\x03\x02\x02\x02\u045D" + - "\u045E\x057\x17\x02\u045E\u045F\x03\x02\x02\x02\u045F\u0460\b\x87\n\x02" + - "\u0460\u0118\x03\x02\x02\x02\u0461\u0462\x05C\x1D\x02\u0462\u0463\x03" + - "\x02\x02\x02\u0463\u0464\b\x88\r\x02\u0464\u0465\b\x88\x0E\x02\u0465\u011A" + - "\x03\x02\x02\x02\u0466\u0467\x05k1\x02\u0467\u0468\x03\x02\x02\x02\u0468" + - "\u0469\b\x89\x13\x02\u0469\u011C\x03\x02\x02\x02\u046A\u046B\x05\xA7O" + - "\x02\u046B\u046C\x03\x02\x02\x02\u046C\u046D\b\x8A\x12\x02\u046D\u011E" + - "\x03\x02\x02\x02\u046E\u046F\x05\xA5N\x02\u046F\u0470\x03\x02\x02\x02" + - "\u0470\u0471\b\x8B\x19\x02\u0471\u0120\x03\x02\x02\x02\u0472\u0473\x05" + - "3\x15\x02\u0473\u0474\x03\x02\x02\x02\u0474\u0475\b\x8C\n\x02\u0475\u0122" + - "\x03\x02\x02\x02\u0476\u0477\x055\x16\x02\u0477\u0478\x03\x02\x02\x02" + - "\u0478\u0479\b\x8D\n\x02\u0479\u0124\x03\x02\x02\x02\u047A\u047B\x057" + - "\x17\x02\u047B\u047C\x03\x02\x02\x02\u047C\u047D\b\x8E\n\x02\u047D\u0126" + - "\x03\x02\x02\x02\u047E\u047F\x05C\x1D\x02\u047F\u0480\x03\x02\x02\x02" + - "\u0480\u0481\b\x8F\r\x02\u0481\u0482\b\x8F\x0E\x02\u0482\u0128\x03\x02" + - "\x02\x02\u0483\u0484\x05\u014F\xA3\x02\u0484\u0485\x05\u0159\xA8\x02\u0485" + - "\u0486\x05\u0149\xA0\x02\u0486\u0487\x05\u015B\xA9\x02\u0487\u012A\x03" + - "\x02\x02\x02\u0488\u0489\x05\u0149\xA0\x02\u0489\u048A\x05\u0167\xAF\x02" + - "\u048A\u048B\x05\u0159\xA8\x02\u048B\u048C\x05\u0143\x9D\x02\u048C\u048D" + - "\x05\u0165\xAE\x02\u048D\u048E\x05\u014F\xA3\x02\u048E\u048F\x05\u015B" + - "\xA9\x02\u048F\u0490\x05\u0159\xA8\x02\u0490\u0491\x05\u0163\xAD\x02\u0491" + - "\u012C\x03\x02\x02\x02\u0492\u0493\x053\x15\x02\u0493\u0494\x03\x02\x02" + - "\x02\u0494\u0495\b\x92\n\x02\u0495\u012E\x03\x02\x02\x02\u0496\u0497\x05" + - "5\x16\x02\u0497\u0498\x03\x02\x02\x02\u0498\u0499\b\x93\n\x02\u0499\u0130" + - "\x03\x02\x02\x02\u049A\u049B\x057\x17\x02\u049B\u049C\x03\x02\x02\x02" + - "\u049C\u049D\b\x94\n\x02\u049D\u0132\x03\x02\x02\x02\u049E\u049F\x05\xA3" + - "M\x02\u049F\u04A0\x03\x02\x02\x02\u04A0\u04A1\b\x95\x0F\x02\u04A1\u04A2" + - "\b\x95\x0E\x02\u04A2\u0134\x03\x02\x02\x02\u04A3\u04A4\x07<\x02\x02\u04A4" + - "\u0136\x03\x02\x02\x02\u04A5\u04AB\x05O#\x02\u04A6\u04AB\x05E\x1E\x02" + - "\u04A7\u04AB\x05k1\x02\u04A8\u04AB\x05G\x1F\x02\u04A9\u04AB\x05U&\x02" + - "\u04AA\u04A5\x03\x02\x02\x02\u04AA\u04A6\x03\x02\x02\x02\u04AA\u04A7\x03" + - "\x02\x02\x02\u04AA\u04A8\x03\x02\x02\x02\u04AA\u04A9\x03\x02\x02\x02\u04AB" + - "\u04AC\x03\x02\x02\x02\u04AC\u04AA\x03\x02\x02\x02\u04AC\u04AD\x03\x02" + - "\x02\x02\u04AD\u0138\x03\x02\x02\x02\u04AE\u04AF\x053\x15\x02\u04AF\u04B0" + - "\x03\x02\x02\x02\u04B0\u04B1\b\x98\n\x02\u04B1\u013A\x03\x02\x02\x02\u04B2" + - "\u04B3\x055\x16\x02\u04B3\u04B4\x03\x02\x02\x02\u04B4\u04B5\b\x99\n\x02" + - "\u04B5\u013C\x03\x02\x02\x02\u04B6\u04B7\x057\x17\x02\u04B7\u04B8\x03" + - "\x02\x02\x02\u04B8\u04B9\b\x9A\n\x02\u04B9\u013E\x03\x02\x02\x02\u04BA" + - "\u04BB\t\x0F\x02\x02\u04BB\u0140\x03\x02\x02\x02\u04BC\u04BD\t\x10\x02" + - "\x02\u04BD\u0142\x03\x02\x02\x02\u04BE\u04BF\t\x11\x02\x02\u04BF\u0144" + - "\x03\x02\x02\x02\u04C0\u04C1\t\x12\x02\x02\u04C1\u0146\x03\x02\x02\x02" + - "\u04C2\u04C3\t\t\x02\x02\u04C3\u0148\x03\x02\x02\x02\u04C4\u04C5\t\x13" + - "\x02\x02\u04C5\u014A\x03\x02\x02\x02\u04C6\u04C7\t\x14\x02\x02\u04C7\u014C" + - "\x03\x02\x02\x02\u04C8\u04C9\t\x15\x02\x02\u04C9\u014E\x03\x02\x02\x02" + - "\u04CA\u04CB\t\x16\x02\x02\u04CB\u0150\x03\x02\x02\x02\u04CC\u04CD\t\x17" + - "\x02\x02\u04CD\u0152\x03\x02\x02\x02\u04CE\u04CF\t\x18\x02\x02\u04CF\u0154" + - "\x03\x02\x02\x02\u04D0\u04D1\t\x19\x02\x02\u04D1\u0156\x03\x02\x02\x02" + - "\u04D2\u04D3\t\x1A\x02\x02\u04D3\u0158\x03\x02\x02\x02\u04D4\u04D5\t\x1B" + - "\x02\x02\u04D5\u015A\x03\x02\x02\x02\u04D6\u04D7\t\x1C\x02\x02\u04D7\u015C" + - "\x03\x02\x02\x02\u04D8\u04D9\t\x1D\x02\x02\u04D9\u015E\x03\x02\x02\x02" + - "\u04DA\u04DB\t\x1E\x02\x02\u04DB\u0160\x03\x02\x02\x02\u04DC\u04DD\t\x1F" + - "\x02\x02\u04DD\u0162\x03\x02\x02\x02\u04DE\u04DF\t \x02\x02\u04DF\u0164" + - "\x03\x02\x02\x02\u04E0\u04E1\t!\x02\x02\u04E1\u0166\x03\x02\x02\x02\u04E2" + - "\u04E3\t\"\x02\x02\u04E3\u0168\x03\x02\x02\x02\u04E4\u04E5\t#\x02\x02" + - "\u04E5\u016A\x03\x02\x02\x02\u04E6\u04E7\t$\x02\x02\u04E7\u016C\x03\x02" + - "\x02\x02\u04E8\u04E9\t%\x02\x02\u04E9\u016E\x03\x02\x02\x02\u04EA\u04EB" + - "\t&\x02\x02\u04EB\u0170\x03\x02\x02\x02\u04EC\u04ED\t\'\x02\x02\u04ED" + - "\u0172\x03\x02\x02\x028\x02\x03\x04\x05\x06\x07\b\t\n\v\f\u020F\u0219" + - "\u021D\u0220\u0229\u022B\u0236\u025F\u0264\u026D\u0274\u0279\u027B\u0286" + - "\u028E\u0291\u0293\u0298\u029D\u02A3\u02AA\u02AF\u02B5\u02B8\u02C0\u02C4" + - "\u0343\u0348\u034D\u034F\u0355\u0386\u038B\u03AE\u03B2\u03B7\u03BC\u03C1" + - "\u03C3\u041B\u0420\u04AA\u04AC\x1A\x07\x04\x02\x07\x06\x02\x07\b\x02\x07" + - "\x03\x02\x07\x05\x02\x07\n\x02\x07\x07\x02\x07\v\x02\x02\x03\x02\tA\x02" + - "\x07\x02\x02\t\x1C\x02\x06\x02\x02\tB\x02\t$\x02\t#\x02\tD\x02\t&\x02" + - "\tM\x02\x07\f\x02\x07\t\x02\tW\x02\tV\x02\tC\x02"; + "\x02\u044B\u044C\x03\x02\x02\x02\u044C\u044D\b\x82\x13\x02\u044D\u010E" + + "\x03\x02\x02\x02\u044E\u044F\x05\xF7w\x02\u044F\u0450\x03\x02\x02\x02" + + "\u0450\u0451\b\x83\x18\x02\u0451\u0110\x03\x02\x02\x02\u0452\u0453\x05" + + "\xD1d\x02\u0453\u0454\x03\x02\x02\x02\u0454\u0455\b\x84\x14\x02\u0455" + + "\u0112\x03\x02\x02\x02\u0456\u0457\x05\xA9P\x02\u0457\u0458\x03\x02\x02" + + "\x02\u0458\u0459\b\x85\x12\x02\u0459\u0114\x03\x02\x02\x02\u045A\u045B" + + "\x053\x15\x02\u045B\u045C\x03\x02\x02\x02\u045C\u045D\b\x86\n\x02\u045D" + + "\u0116\x03\x02\x02\x02\u045E\u045F\x055\x16\x02\u045F\u0460\x03\x02\x02" + + "\x02\u0460\u0461\b\x87\n\x02\u0461\u0118\x03\x02\x02\x02\u0462\u0463\x05" + + "7\x17\x02\u0463\u0464\x03\x02\x02\x02\u0464\u0465\b\x88\n\x02\u0465\u011A" + + "\x03\x02\x02\x02\u0466\u0467\x05C\x1D\x02\u0467\u0468\x03\x02\x02\x02" + + "\u0468\u0469\b\x89\r\x02\u0469\u046A\b\x89\x0E\x02\u046A\u011C\x03\x02" + + "\x02\x02\u046B\u046C\x05k1\x02\u046C\u046D\x03\x02\x02\x02\u046D\u046E" + + "\b\x8A\x13\x02\u046E\u011E\x03\x02\x02\x02\u046F\u0470\x05\xA9P\x02\u0470" + + "\u0471\x03\x02\x02\x02\u0471\u0472\b\x8B\x12\x02\u0472\u0120\x03\x02\x02" + + "\x02\u0473\u0474\x05\xA7O\x02\u0474\u0475\x03\x02\x02\x02\u0475\u0476" + + "\b\x8C\x19\x02\u0476\u0122\x03\x02\x02\x02\u0477\u0478\x053\x15\x02\u0478" + + "\u0479\x03\x02\x02\x02\u0479\u047A\b\x8D\n\x02\u047A\u0124\x03\x02\x02" + + "\x02\u047B\u047C\x055\x16\x02\u047C\u047D\x03\x02\x02\x02\u047D\u047E" + + "\b\x8E\n\x02\u047E\u0126\x03\x02\x02\x02\u047F\u0480\x057\x17\x02\u0480" + + "\u0481\x03\x02\x02\x02\u0481\u0482\b\x8F\n\x02\u0482\u0128\x03\x02\x02" + + "\x02\u0483\u0484\x05C\x1D\x02\u0484\u0485\x03\x02\x02\x02\u0485\u0486" + + "\b\x90\r\x02\u0486\u0487\b\x90\x0E\x02\u0487\u012A\x03\x02\x02\x02\u0488" + + "\u0489\x05\u0151\xA4\x02\u0489\u048A\x05\u015B\xA9\x02\u048A\u048B\x05" + + "\u014B\xA1\x02\u048B\u048C\x05\u015D\xAA\x02\u048C\u012C\x03\x02\x02\x02" + + "\u048D\u048E\x05\u014B\xA1\x02\u048E\u048F\x05\u0169\xB0\x02\u048F\u0490" + + "\x05\u015B\xA9\x02\u0490\u0491\x05\u0145\x9E\x02\u0491\u0492\x05\u0167" + + "\xAF\x02\u0492\u0493\x05\u0151\xA4\x02\u0493\u0494\x05\u015D\xAA\x02\u0494" + + "\u0495\x05\u015B\xA9\x02\u0495\u0496\x05\u0165\xAE\x02\u0496\u012E\x03" + + "\x02\x02\x02\u0497\u0498\x053\x15\x02\u0498\u0499\x03\x02\x02\x02\u0499" + + "\u049A\b\x93\n\x02\u049A\u0130\x03\x02\x02\x02\u049B\u049C\x055\x16\x02" + + "\u049C\u049D\x03\x02\x02\x02\u049D\u049E\b\x94\n\x02\u049E\u0132\x03\x02" + + "\x02\x02\u049F\u04A0\x057\x17\x02\u04A0\u04A1\x03\x02\x02\x02\u04A1\u04A2" + + "\b\x95\n\x02\u04A2\u0134\x03\x02\x02\x02\u04A3\u04A4\x05\xA5N\x02\u04A4" + + "\u04A5\x03\x02\x02\x02\u04A5\u04A6\b\x96\x0F\x02\u04A6\u04A7\b\x96\x0E" + + "\x02\u04A7\u0136\x03\x02\x02\x02\u04A8\u04A9\x07<\x02\x02\u04A9\u0138" + + "\x03\x02\x02\x02\u04AA\u04B0\x05O#\x02\u04AB\u04B0\x05E\x1E\x02\u04AC" + + "\u04B0\x05k1\x02\u04AD\u04B0\x05G\x1F\x02\u04AE\u04B0\x05U&\x02\u04AF" + + "\u04AA\x03\x02\x02\x02\u04AF\u04AB\x03\x02\x02\x02\u04AF\u04AC\x03\x02" + + "\x02\x02\u04AF\u04AD\x03\x02\x02\x02\u04AF\u04AE\x03\x02\x02\x02\u04B0" + + "\u04B1\x03\x02\x02\x02\u04B1\u04AF\x03\x02\x02\x02\u04B1\u04B2\x03\x02" + + "\x02\x02\u04B2\u013A\x03\x02\x02\x02\u04B3\u04B4\x053\x15\x02\u04B4\u04B5" + + "\x03\x02\x02\x02\u04B5\u04B6\b\x99\n\x02\u04B6\u013C\x03\x02\x02\x02\u04B7" + + "\u04B8\x055\x16\x02\u04B8\u04B9\x03\x02\x02\x02\u04B9\u04BA\b\x9A\n\x02" + + "\u04BA\u013E\x03\x02\x02\x02\u04BB\u04BC\x057\x17\x02\u04BC\u04BD\x03" + + "\x02\x02\x02\u04BD\u04BE\b\x9B\n\x02\u04BE\u0140\x03\x02\x02\x02\u04BF" + + "\u04C0\t\x0F\x02\x02\u04C0\u0142\x03\x02\x02\x02\u04C1\u04C2\t\x10\x02" + + "\x02\u04C2\u0144\x03\x02\x02\x02\u04C3\u04C4\t\x11\x02\x02\u04C4\u0146" + + "\x03\x02\x02\x02\u04C5\u04C6\t\x12\x02\x02\u04C6\u0148\x03\x02\x02\x02" + + "\u04C7\u04C8\t\t\x02\x02\u04C8\u014A\x03\x02\x02\x02\u04C9\u04CA\t\x13" + + "\x02\x02\u04CA\u014C\x03\x02\x02\x02\u04CB\u04CC\t\x14\x02\x02\u04CC\u014E" + + "\x03\x02\x02\x02\u04CD\u04CE\t\x15\x02\x02\u04CE\u0150\x03\x02\x02\x02" + + "\u04CF\u04D0\t\x16\x02\x02\u04D0\u0152\x03\x02\x02\x02\u04D1\u04D2\t\x17" + + "\x02\x02\u04D2\u0154\x03\x02\x02\x02\u04D3\u04D4\t\x18\x02\x02\u04D4\u0156" + + "\x03\x02\x02\x02\u04D5\u04D6\t\x19\x02\x02\u04D6\u0158\x03\x02\x02\x02" + + "\u04D7\u04D8\t\x1A\x02\x02\u04D8\u015A\x03\x02\x02\x02\u04D9\u04DA\t\x1B" + + "\x02\x02\u04DA\u015C\x03\x02\x02\x02\u04DB\u04DC\t\x1C\x02\x02\u04DC\u015E" + + "\x03\x02\x02\x02\u04DD\u04DE\t\x1D\x02\x02\u04DE\u0160\x03\x02\x02\x02" + + "\u04DF\u04E0\t\x1E\x02\x02\u04E0\u0162\x03\x02\x02\x02\u04E1\u04E2\t\x1F" + + "\x02\x02\u04E2\u0164\x03\x02\x02\x02\u04E3\u04E4\t \x02\x02\u04E4\u0166" + + "\x03\x02\x02\x02\u04E5\u04E6\t!\x02\x02\u04E6\u0168\x03\x02\x02\x02\u04E7" + + "\u04E8\t\"\x02\x02\u04E8\u016A\x03\x02\x02\x02\u04E9\u04EA\t#\x02\x02" + + "\u04EA\u016C\x03\x02\x02\x02\u04EB\u04EC\t$\x02\x02\u04EC\u016E\x03\x02" + + "\x02\x02\u04ED\u04EE\t%\x02\x02\u04EE\u0170\x03\x02\x02\x02\u04EF\u04F0" + + "\t&\x02\x02\u04F0\u0172\x03\x02\x02\x02\u04F1\u04F2\t\'\x02\x02\u04F2" + + "\u0174\x03\x02\x02\x028\x02\x03\x04\x05\x06\x07\b\t\n\v\f\u0211\u021B" + + "\u021F\u0222\u022B\u022D\u0238\u0261\u0266\u026F\u0276\u027B\u027D\u0288" + + "\u0290\u0293\u0295\u029A\u029F\u02A5\u02AC\u02B1\u02B7\u02BA\u02C2\u02C6" + + "\u0348\u034D\u0352\u0354\u035A\u038B\u0390\u03B3\u03B7\u03BC\u03C1\u03C6" + + "\u03C8\u0420\u0425\u04AF\u04B1\x1A\x07\x04\x02\x07\x06\x02\x07\b\x02\x07" + + "\x03\x02\x07\x05\x02\x07\n\x02\x07\x07\x02\x07\v\x02\x02\x03\x02\tB\x02" + + "\x07\x02\x02\t\x1C\x02\x06\x02\x02\tC\x02\t$\x02\t#\x02\tE\x02\t&\x02" + + "\tN\x02\x07\f\x02\x07\t\x02\tX\x02\tW\x02\tD\x02"; public static readonly _serializedATN: string = Utils.join( [ esql_lexer._serializedATNSegment0, diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 b/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 index 9c637d1917a11..57e7097eb03f8 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 @@ -225,7 +225,7 @@ string ; comparisonOperator - : EQ | NEQ | LT | LTE | GT | GTE + : EQ | CIEQ | NEQ | LT | LTE | GT | GTE ; explainCommand diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.interp b/packages/kbn-monaco/src/esql/antlr/esql_parser.interp index a9cf5f8472a52..ed3cd7a8d9227 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.interp +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser.interp @@ -52,6 +52,7 @@ null ')' null '==' +'=~' '!=' '<' '<=' @@ -159,6 +160,7 @@ RLIKE RP TRUE EQ +CIEQ NEQ LT LTE @@ -265,4 +267,4 @@ setting atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 106, 525, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 110, 10, 3, 12, 3, 14, 3, 113, 11, 3, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 119, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 134, 10, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 146, 10, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 7, 7, 153, 10, 7, 12, 7, 14, 7, 156, 11, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 163, 10, 7, 3, 7, 3, 7, 5, 7, 167, 10, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 7, 7, 175, 10, 7, 12, 7, 14, 7, 178, 11, 7, 3, 8, 3, 8, 5, 8, 182, 10, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 189, 10, 8, 3, 8, 3, 8, 3, 8, 5, 8, 194, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 201, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 207, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 215, 10, 10, 12, 10, 14, 10, 218, 11, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 227, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 7, 12, 235, 10, 12, 12, 12, 14, 12, 238, 11, 12, 5, 12, 240, 10, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 7, 14, 250, 10, 14, 12, 14, 14, 14, 253, 11, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 260, 10, 15, 3, 16, 3, 16, 3, 16, 3, 16, 7, 16, 266, 10, 16, 12, 16, 14, 16, 269, 11, 16, 3, 16, 5, 16, 272, 10, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 7, 17, 279, 10, 17, 12, 17, 14, 17, 282, 11, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 5, 19, 291, 10, 19, 3, 19, 3, 19, 5, 19, 295, 10, 19, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 301, 10, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 7, 22, 308, 10, 22, 12, 22, 14, 22, 311, 11, 22, 3, 23, 3, 23, 3, 23, 7, 23, 316, 10, 23, 12, 23, 14, 23, 319, 11, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 338, 10, 26, 12, 26, 14, 26, 341, 11, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 349, 10, 26, 12, 26, 14, 26, 352, 11, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 360, 10, 26, 12, 26, 14, 26, 363, 11, 26, 3, 26, 3, 26, 5, 26, 367, 10, 26, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 376, 10, 28, 12, 28, 14, 28, 379, 11, 28, 3, 29, 3, 29, 5, 29, 383, 10, 29, 3, 29, 3, 29, 5, 29, 387, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 393, 10, 30, 12, 30, 14, 30, 396, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 402, 10, 30, 12, 30, 14, 30, 405, 11, 30, 5, 30, 407, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 413, 10, 31, 12, 31, 14, 31, 416, 11, 31, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 422, 10, 32, 12, 32, 14, 32, 425, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 5, 34, 435, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 7, 37, 447, 10, 37, 12, 37, 14, 37, 450, 11, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 40, 3, 40, 5, 40, 460, 10, 40, 3, 41, 5, 41, 463, 10, 41, 3, 41, 3, 41, 3, 42, 5, 42, 468, 10, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 487, 10, 47, 3, 48, 3, 48, 7, 48, 491, 10, 48, 12, 48, 14, 48, 494, 11, 48, 3, 48, 3, 48, 3, 48, 5, 48, 499, 10, 48, 3, 48, 3, 48, 3, 48, 3, 48, 7, 48, 505, 10, 48, 12, 48, 14, 48, 508, 11, 48, 5, 48, 510, 10, 48, 3, 49, 3, 49, 3, 49, 5, 49, 515, 10, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 2, 2, 5, 4, 12, 18, 51, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 88, 2, 90, 2, 92, 2, 94, 2, 96, 2, 98, 2, 2, 11, 3, 2, 60, 61, 3, 2, 62, 64, 4, 2, 68, 68, 73, 73, 3, 2, 67, 68, 4, 2, 68, 68, 77, 77, 4, 2, 34, 34, 37, 37, 3, 2, 40, 41, 4, 2, 39, 39, 53, 53, 3, 2, 54, 59, 2, 554, 2, 100, 3, 2, 2, 2, 4, 103, 3, 2, 2, 2, 6, 118, 3, 2, 2, 2, 8, 133, 3, 2, 2, 2, 10, 135, 3, 2, 2, 2, 12, 166, 3, 2, 2, 2, 14, 193, 3, 2, 2, 2, 16, 200, 3, 2, 2, 2, 18, 206, 3, 2, 2, 2, 20, 226, 3, 2, 2, 2, 22, 228, 3, 2, 2, 2, 24, 243, 3, 2, 2, 2, 26, 246, 3, 2, 2, 2, 28, 259, 3, 2, 2, 2, 30, 261, 3, 2, 2, 2, 32, 273, 3, 2, 2, 2, 34, 285, 3, 2, 2, 2, 36, 288, 3, 2, 2, 2, 38, 296, 3, 2, 2, 2, 40, 302, 3, 2, 2, 2, 42, 304, 3, 2, 2, 2, 44, 312, 3, 2, 2, 2, 46, 320, 3, 2, 2, 2, 48, 322, 3, 2, 2, 2, 50, 366, 3, 2, 2, 2, 52, 368, 3, 2, 2, 2, 54, 371, 3, 2, 2, 2, 56, 380, 3, 2, 2, 2, 58, 406, 3, 2, 2, 2, 60, 408, 3, 2, 2, 2, 62, 417, 3, 2, 2, 2, 64, 426, 3, 2, 2, 2, 66, 430, 3, 2, 2, 2, 68, 436, 3, 2, 2, 2, 70, 440, 3, 2, 2, 2, 72, 443, 3, 2, 2, 2, 74, 451, 3, 2, 2, 2, 76, 455, 3, 2, 2, 2, 78, 459, 3, 2, 2, 2, 80, 462, 3, 2, 2, 2, 82, 467, 3, 2, 2, 2, 84, 471, 3, 2, 2, 2, 86, 473, 3, 2, 2, 2, 88, 475, 3, 2, 2, 2, 90, 478, 3, 2, 2, 2, 92, 486, 3, 2, 2, 2, 94, 488, 3, 2, 2, 2, 96, 514, 3, 2, 2, 2, 98, 518, 3, 2, 2, 2, 100, 101, 5, 4, 3, 2, 101, 102, 7, 2, 2, 3, 102, 3, 3, 2, 2, 2, 103, 104, 8, 3, 1, 2, 104, 105, 5, 6, 4, 2, 105, 111, 3, 2, 2, 2, 106, 107, 12, 3, 2, 2, 107, 108, 7, 28, 2, 2, 108, 110, 5, 8, 5, 2, 109, 106, 3, 2, 2, 2, 110, 113, 3, 2, 2, 2, 111, 109, 3, 2, 2, 2, 111, 112, 3, 2, 2, 2, 112, 5, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 114, 119, 5, 88, 45, 2, 115, 119, 5, 30, 16, 2, 116, 119, 5, 24, 13, 2, 117, 119, 5, 92, 47, 2, 118, 114, 3, 2, 2, 2, 118, 115, 3, 2, 2, 2, 118, 116, 3, 2, 2, 2, 118, 117, 3, 2, 2, 2, 119, 7, 3, 2, 2, 2, 120, 134, 5, 34, 18, 2, 121, 134, 5, 38, 20, 2, 122, 134, 5, 52, 27, 2, 123, 134, 5, 58, 30, 2, 124, 134, 5, 54, 28, 2, 125, 134, 5, 36, 19, 2, 126, 134, 5, 10, 6, 2, 127, 134, 5, 60, 31, 2, 128, 134, 5, 62, 32, 2, 129, 134, 5, 66, 34, 2, 130, 134, 5, 68, 35, 2, 131, 134, 5, 94, 48, 2, 132, 134, 5, 70, 36, 2, 133, 120, 3, 2, 2, 2, 133, 121, 3, 2, 2, 2, 133, 122, 3, 2, 2, 2, 133, 123, 3, 2, 2, 2, 133, 124, 3, 2, 2, 2, 133, 125, 3, 2, 2, 2, 133, 126, 3, 2, 2, 2, 133, 127, 3, 2, 2, 2, 133, 128, 3, 2, 2, 2, 133, 129, 3, 2, 2, 2, 133, 130, 3, 2, 2, 2, 133, 131, 3, 2, 2, 2, 133, 132, 3, 2, 2, 2, 134, 9, 3, 2, 2, 2, 135, 136, 7, 20, 2, 2, 136, 137, 5, 12, 7, 2, 137, 11, 3, 2, 2, 2, 138, 139, 8, 7, 1, 2, 139, 140, 7, 46, 2, 2, 140, 167, 5, 12, 7, 9, 141, 167, 5, 16, 9, 2, 142, 167, 5, 14, 8, 2, 143, 145, 5, 16, 9, 2, 144, 146, 7, 46, 2, 2, 145, 144, 3, 2, 2, 2, 145, 146, 3, 2, 2, 2, 146, 147, 3, 2, 2, 2, 147, 148, 7, 43, 2, 2, 148, 149, 7, 42, 2, 2, 149, 154, 5, 16, 9, 2, 150, 151, 7, 36, 2, 2, 151, 153, 5, 16, 9, 2, 152, 150, 3, 2, 2, 2, 153, 156, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 154, 155, 3, 2, 2, 2, 155, 157, 3, 2, 2, 2, 156, 154, 3, 2, 2, 2, 157, 158, 7, 52, 2, 2, 158, 167, 3, 2, 2, 2, 159, 160, 5, 16, 9, 2, 160, 162, 7, 44, 2, 2, 161, 163, 7, 46, 2, 2, 162, 161, 3, 2, 2, 2, 162, 163, 3, 2, 2, 2, 163, 164, 3, 2, 2, 2, 164, 165, 7, 47, 2, 2, 165, 167, 3, 2, 2, 2, 166, 138, 3, 2, 2, 2, 166, 141, 3, 2, 2, 2, 166, 142, 3, 2, 2, 2, 166, 143, 3, 2, 2, 2, 166, 159, 3, 2, 2, 2, 167, 176, 3, 2, 2, 2, 168, 169, 12, 6, 2, 2, 169, 170, 7, 33, 2, 2, 170, 175, 5, 12, 7, 7, 171, 172, 12, 5, 2, 2, 172, 173, 7, 49, 2, 2, 173, 175, 5, 12, 7, 6, 174, 168, 3, 2, 2, 2, 174, 171, 3, 2, 2, 2, 175, 178, 3, 2, 2, 2, 176, 174, 3, 2, 2, 2, 176, 177, 3, 2, 2, 2, 177, 13, 3, 2, 2, 2, 178, 176, 3, 2, 2, 2, 179, 181, 5, 16, 9, 2, 180, 182, 7, 46, 2, 2, 181, 180, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 183, 3, 2, 2, 2, 183, 184, 7, 45, 2, 2, 184, 185, 5, 84, 43, 2, 185, 194, 3, 2, 2, 2, 186, 188, 5, 16, 9, 2, 187, 189, 7, 46, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 190, 3, 2, 2, 2, 190, 191, 7, 51, 2, 2, 191, 192, 5, 84, 43, 2, 192, 194, 3, 2, 2, 2, 193, 179, 3, 2, 2, 2, 193, 186, 3, 2, 2, 2, 194, 15, 3, 2, 2, 2, 195, 201, 5, 18, 10, 2, 196, 197, 5, 18, 10, 2, 197, 198, 5, 86, 44, 2, 198, 199, 5, 18, 10, 2, 199, 201, 3, 2, 2, 2, 200, 195, 3, 2, 2, 2, 200, 196, 3, 2, 2, 2, 201, 17, 3, 2, 2, 2, 202, 203, 8, 10, 1, 2, 203, 207, 5, 20, 11, 2, 204, 205, 9, 2, 2, 2, 205, 207, 5, 18, 10, 5, 206, 202, 3, 2, 2, 2, 206, 204, 3, 2, 2, 2, 207, 216, 3, 2, 2, 2, 208, 209, 12, 4, 2, 2, 209, 210, 9, 3, 2, 2, 210, 215, 5, 18, 10, 5, 211, 212, 12, 3, 2, 2, 212, 213, 9, 2, 2, 2, 213, 215, 5, 18, 10, 4, 214, 208, 3, 2, 2, 2, 214, 211, 3, 2, 2, 2, 215, 218, 3, 2, 2, 2, 216, 214, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 19, 3, 2, 2, 2, 218, 216, 3, 2, 2, 2, 219, 227, 5, 50, 26, 2, 220, 227, 5, 42, 22, 2, 221, 227, 5, 22, 12, 2, 222, 223, 7, 42, 2, 2, 223, 224, 5, 12, 7, 2, 224, 225, 7, 52, 2, 2, 225, 227, 3, 2, 2, 2, 226, 219, 3, 2, 2, 2, 226, 220, 3, 2, 2, 2, 226, 221, 3, 2, 2, 2, 226, 222, 3, 2, 2, 2, 227, 21, 3, 2, 2, 2, 228, 229, 5, 46, 24, 2, 229, 239, 7, 42, 2, 2, 230, 240, 7, 62, 2, 2, 231, 236, 5, 12, 7, 2, 232, 233, 7, 36, 2, 2, 233, 235, 5, 12, 7, 2, 234, 232, 3, 2, 2, 2, 235, 238, 3, 2, 2, 2, 236, 234, 3, 2, 2, 2, 236, 237, 3, 2, 2, 2, 237, 240, 3, 2, 2, 2, 238, 236, 3, 2, 2, 2, 239, 230, 3, 2, 2, 2, 239, 231, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 241, 3, 2, 2, 2, 241, 242, 7, 52, 2, 2, 242, 23, 3, 2, 2, 2, 243, 244, 7, 16, 2, 2, 244, 245, 5, 26, 14, 2, 245, 25, 3, 2, 2, 2, 246, 251, 5, 28, 15, 2, 247, 248, 7, 36, 2, 2, 248, 250, 5, 28, 15, 2, 249, 247, 3, 2, 2, 2, 250, 253, 3, 2, 2, 2, 251, 249, 3, 2, 2, 2, 251, 252, 3, 2, 2, 2, 252, 27, 3, 2, 2, 2, 253, 251, 3, 2, 2, 2, 254, 260, 5, 12, 7, 2, 255, 256, 5, 42, 22, 2, 256, 257, 7, 35, 2, 2, 257, 258, 5, 12, 7, 2, 258, 260, 3, 2, 2, 2, 259, 254, 3, 2, 2, 2, 259, 255, 3, 2, 2, 2, 260, 29, 3, 2, 2, 2, 261, 262, 7, 8, 2, 2, 262, 267, 5, 40, 21, 2, 263, 264, 7, 36, 2, 2, 264, 266, 5, 40, 21, 2, 265, 263, 3, 2, 2, 2, 266, 269, 3, 2, 2, 2, 267, 265, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 271, 3, 2, 2, 2, 269, 267, 3, 2, 2, 2, 270, 272, 5, 32, 17, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 31, 3, 2, 2, 2, 273, 274, 7, 65, 2, 2, 274, 275, 7, 72, 2, 2, 275, 280, 5, 40, 21, 2, 276, 277, 7, 36, 2, 2, 277, 279, 5, 40, 21, 2, 278, 276, 3, 2, 2, 2, 279, 282, 3, 2, 2, 2, 280, 278, 3, 2, 2, 2, 280, 281, 3, 2, 2, 2, 281, 283, 3, 2, 2, 2, 282, 280, 3, 2, 2, 2, 283, 284, 7, 66, 2, 2, 284, 33, 3, 2, 2, 2, 285, 286, 7, 6, 2, 2, 286, 287, 5, 26, 14, 2, 287, 35, 3, 2, 2, 2, 288, 290, 7, 19, 2, 2, 289, 291, 5, 26, 14, 2, 290, 289, 3, 2, 2, 2, 290, 291, 3, 2, 2, 2, 291, 294, 3, 2, 2, 2, 292, 293, 7, 32, 2, 2, 293, 295, 5, 26, 14, 2, 294, 292, 3, 2, 2, 2, 294, 295, 3, 2, 2, 2, 295, 37, 3, 2, 2, 2, 296, 297, 7, 10, 2, 2, 297, 300, 5, 26, 14, 2, 298, 299, 7, 32, 2, 2, 299, 301, 5, 26, 14, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 39, 3, 2, 2, 2, 302, 303, 9, 4, 2, 2, 303, 41, 3, 2, 2, 2, 304, 309, 5, 46, 24, 2, 305, 306, 7, 38, 2, 2, 306, 308, 5, 46, 24, 2, 307, 305, 3, 2, 2, 2, 308, 311, 3, 2, 2, 2, 309, 307, 3, 2, 2, 2, 309, 310, 3, 2, 2, 2, 310, 43, 3, 2, 2, 2, 311, 309, 3, 2, 2, 2, 312, 317, 5, 48, 25, 2, 313, 314, 7, 38, 2, 2, 314, 316, 5, 48, 25, 2, 315, 313, 3, 2, 2, 2, 316, 319, 3, 2, 2, 2, 317, 315, 3, 2, 2, 2, 317, 318, 3, 2, 2, 2, 318, 45, 3, 2, 2, 2, 319, 317, 3, 2, 2, 2, 320, 321, 9, 5, 2, 2, 321, 47, 3, 2, 2, 2, 322, 323, 9, 6, 2, 2, 323, 49, 3, 2, 2, 2, 324, 367, 7, 47, 2, 2, 325, 326, 5, 82, 42, 2, 326, 327, 7, 67, 2, 2, 327, 367, 3, 2, 2, 2, 328, 367, 5, 80, 41, 2, 329, 367, 5, 82, 42, 2, 330, 367, 5, 76, 39, 2, 331, 367, 7, 50, 2, 2, 332, 367, 5, 84, 43, 2, 333, 334, 7, 65, 2, 2, 334, 339, 5, 78, 40, 2, 335, 336, 7, 36, 2, 2, 336, 338, 5, 78, 40, 2, 337, 335, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 342, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 342, 343, 7, 66, 2, 2, 343, 367, 3, 2, 2, 2, 344, 345, 7, 65, 2, 2, 345, 350, 5, 76, 39, 2, 346, 347, 7, 36, 2, 2, 347, 349, 5, 76, 39, 2, 348, 346, 3, 2, 2, 2, 349, 352, 3, 2, 2, 2, 350, 348, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 353, 3, 2, 2, 2, 352, 350, 3, 2, 2, 2, 353, 354, 7, 66, 2, 2, 354, 367, 3, 2, 2, 2, 355, 356, 7, 65, 2, 2, 356, 361, 5, 84, 43, 2, 357, 358, 7, 36, 2, 2, 358, 360, 5, 84, 43, 2, 359, 357, 3, 2, 2, 2, 360, 363, 3, 2, 2, 2, 361, 359, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 364, 3, 2, 2, 2, 363, 361, 3, 2, 2, 2, 364, 365, 7, 66, 2, 2, 365, 367, 3, 2, 2, 2, 366, 324, 3, 2, 2, 2, 366, 325, 3, 2, 2, 2, 366, 328, 3, 2, 2, 2, 366, 329, 3, 2, 2, 2, 366, 330, 3, 2, 2, 2, 366, 331, 3, 2, 2, 2, 366, 332, 3, 2, 2, 2, 366, 333, 3, 2, 2, 2, 366, 344, 3, 2, 2, 2, 366, 355, 3, 2, 2, 2, 367, 51, 3, 2, 2, 2, 368, 369, 7, 12, 2, 2, 369, 370, 7, 30, 2, 2, 370, 53, 3, 2, 2, 2, 371, 372, 7, 18, 2, 2, 372, 377, 5, 56, 29, 2, 373, 374, 7, 36, 2, 2, 374, 376, 5, 56, 29, 2, 375, 373, 3, 2, 2, 2, 376, 379, 3, 2, 2, 2, 377, 375, 3, 2, 2, 2, 377, 378, 3, 2, 2, 2, 378, 55, 3, 2, 2, 2, 379, 377, 3, 2, 2, 2, 380, 382, 5, 12, 7, 2, 381, 383, 9, 7, 2, 2, 382, 381, 3, 2, 2, 2, 382, 383, 3, 2, 2, 2, 383, 386, 3, 2, 2, 2, 384, 385, 7, 48, 2, 2, 385, 387, 9, 8, 2, 2, 386, 384, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 57, 3, 2, 2, 2, 388, 389, 7, 11, 2, 2, 389, 394, 5, 44, 23, 2, 390, 391, 7, 36, 2, 2, 391, 393, 5, 44, 23, 2, 392, 390, 3, 2, 2, 2, 393, 396, 3, 2, 2, 2, 394, 392, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 407, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 397, 398, 7, 14, 2, 2, 398, 403, 5, 44, 23, 2, 399, 400, 7, 36, 2, 2, 400, 402, 5, 44, 23, 2, 401, 399, 3, 2, 2, 2, 402, 405, 3, 2, 2, 2, 403, 401, 3, 2, 2, 2, 403, 404, 3, 2, 2, 2, 404, 407, 3, 2, 2, 2, 405, 403, 3, 2, 2, 2, 406, 388, 3, 2, 2, 2, 406, 397, 3, 2, 2, 2, 407, 59, 3, 2, 2, 2, 408, 409, 7, 4, 2, 2, 409, 414, 5, 44, 23, 2, 410, 411, 7, 36, 2, 2, 411, 413, 5, 44, 23, 2, 412, 410, 3, 2, 2, 2, 413, 416, 3, 2, 2, 2, 414, 412, 3, 2, 2, 2, 414, 415, 3, 2, 2, 2, 415, 61, 3, 2, 2, 2, 416, 414, 3, 2, 2, 2, 417, 418, 7, 15, 2, 2, 418, 423, 5, 64, 33, 2, 419, 420, 7, 36, 2, 2, 420, 422, 5, 64, 33, 2, 421, 419, 3, 2, 2, 2, 422, 425, 3, 2, 2, 2, 423, 421, 3, 2, 2, 2, 423, 424, 3, 2, 2, 2, 424, 63, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 426, 427, 5, 44, 23, 2, 427, 428, 7, 81, 2, 2, 428, 429, 5, 44, 23, 2, 429, 65, 3, 2, 2, 2, 430, 431, 7, 3, 2, 2, 431, 432, 5, 20, 11, 2, 432, 434, 5, 84, 43, 2, 433, 435, 5, 72, 37, 2, 434, 433, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 435, 67, 3, 2, 2, 2, 436, 437, 7, 9, 2, 2, 437, 438, 5, 20, 11, 2, 438, 439, 5, 84, 43, 2, 439, 69, 3, 2, 2, 2, 440, 441, 7, 13, 2, 2, 441, 442, 5, 42, 22, 2, 442, 71, 3, 2, 2, 2, 443, 448, 5, 74, 38, 2, 444, 445, 7, 36, 2, 2, 445, 447, 5, 74, 38, 2, 446, 444, 3, 2, 2, 2, 447, 450, 3, 2, 2, 2, 448, 446, 3, 2, 2, 2, 448, 449, 3, 2, 2, 2, 449, 73, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 451, 452, 5, 46, 24, 2, 452, 453, 7, 35, 2, 2, 453, 454, 5, 50, 26, 2, 454, 75, 3, 2, 2, 2, 455, 456, 9, 9, 2, 2, 456, 77, 3, 2, 2, 2, 457, 460, 5, 80, 41, 2, 458, 460, 5, 82, 42, 2, 459, 457, 3, 2, 2, 2, 459, 458, 3, 2, 2, 2, 460, 79, 3, 2, 2, 2, 461, 463, 9, 2, 2, 2, 462, 461, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 7, 31, 2, 2, 465, 81, 3, 2, 2, 2, 466, 468, 9, 2, 2, 2, 467, 466, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 469, 3, 2, 2, 2, 469, 470, 7, 30, 2, 2, 470, 83, 3, 2, 2, 2, 471, 472, 7, 29, 2, 2, 472, 85, 3, 2, 2, 2, 473, 474, 9, 10, 2, 2, 474, 87, 3, 2, 2, 2, 475, 476, 7, 7, 2, 2, 476, 477, 5, 90, 46, 2, 477, 89, 3, 2, 2, 2, 478, 479, 7, 65, 2, 2, 479, 480, 5, 4, 3, 2, 480, 481, 7, 66, 2, 2, 481, 91, 3, 2, 2, 2, 482, 483, 7, 17, 2, 2, 483, 487, 7, 97, 2, 2, 484, 485, 7, 17, 2, 2, 485, 487, 7, 98, 2, 2, 486, 482, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 487, 93, 3, 2, 2, 2, 488, 492, 7, 5, 2, 2, 489, 491, 5, 98, 50, 2, 490, 489, 3, 2, 2, 2, 491, 494, 3, 2, 2, 2, 492, 490, 3, 2, 2, 2, 492, 493, 3, 2, 2, 2, 493, 495, 3, 2, 2, 2, 494, 492, 3, 2, 2, 2, 495, 498, 7, 87, 2, 2, 496, 497, 7, 85, 2, 2, 497, 499, 5, 44, 23, 2, 498, 496, 3, 2, 2, 2, 498, 499, 3, 2, 2, 2, 499, 509, 3, 2, 2, 2, 500, 501, 7, 86, 2, 2, 501, 506, 5, 96, 49, 2, 502, 503, 7, 36, 2, 2, 503, 505, 5, 96, 49, 2, 504, 502, 3, 2, 2, 2, 505, 508, 3, 2, 2, 2, 506, 504, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 510, 3, 2, 2, 2, 508, 506, 3, 2, 2, 2, 509, 500, 3, 2, 2, 2, 509, 510, 3, 2, 2, 2, 510, 95, 3, 2, 2, 2, 511, 512, 5, 44, 23, 2, 512, 513, 7, 35, 2, 2, 513, 515, 3, 2, 2, 2, 514, 511, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 516, 3, 2, 2, 2, 516, 517, 5, 44, 23, 2, 517, 97, 3, 2, 2, 2, 518, 519, 7, 65, 2, 2, 519, 520, 7, 103, 2, 2, 520, 521, 7, 102, 2, 2, 521, 522, 7, 103, 2, 2, 522, 523, 7, 66, 2, 2, 523, 99, 3, 2, 2, 2, 54, 111, 118, 133, 145, 154, 162, 166, 174, 176, 181, 188, 193, 200, 206, 214, 216, 226, 236, 239, 251, 259, 267, 271, 280, 290, 294, 300, 309, 317, 339, 350, 361, 366, 377, 382, 386, 394, 403, 406, 414, 423, 434, 448, 459, 462, 467, 486, 492, 498, 506, 509, 514] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 107, 525, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 110, 10, 3, 12, 3, 14, 3, 113, 11, 3, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 119, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 134, 10, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 146, 10, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 7, 7, 153, 10, 7, 12, 7, 14, 7, 156, 11, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 163, 10, 7, 3, 7, 3, 7, 5, 7, 167, 10, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 7, 7, 175, 10, 7, 12, 7, 14, 7, 178, 11, 7, 3, 8, 3, 8, 5, 8, 182, 10, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 189, 10, 8, 3, 8, 3, 8, 3, 8, 5, 8, 194, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 201, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 207, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 215, 10, 10, 12, 10, 14, 10, 218, 11, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 227, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 7, 12, 235, 10, 12, 12, 12, 14, 12, 238, 11, 12, 5, 12, 240, 10, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 7, 14, 250, 10, 14, 12, 14, 14, 14, 253, 11, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 260, 10, 15, 3, 16, 3, 16, 3, 16, 3, 16, 7, 16, 266, 10, 16, 12, 16, 14, 16, 269, 11, 16, 3, 16, 5, 16, 272, 10, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 7, 17, 279, 10, 17, 12, 17, 14, 17, 282, 11, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 5, 19, 291, 10, 19, 3, 19, 3, 19, 5, 19, 295, 10, 19, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 301, 10, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 7, 22, 308, 10, 22, 12, 22, 14, 22, 311, 11, 22, 3, 23, 3, 23, 3, 23, 7, 23, 316, 10, 23, 12, 23, 14, 23, 319, 11, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 338, 10, 26, 12, 26, 14, 26, 341, 11, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 349, 10, 26, 12, 26, 14, 26, 352, 11, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 360, 10, 26, 12, 26, 14, 26, 363, 11, 26, 3, 26, 3, 26, 5, 26, 367, 10, 26, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 376, 10, 28, 12, 28, 14, 28, 379, 11, 28, 3, 29, 3, 29, 5, 29, 383, 10, 29, 3, 29, 3, 29, 5, 29, 387, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 393, 10, 30, 12, 30, 14, 30, 396, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 402, 10, 30, 12, 30, 14, 30, 405, 11, 30, 5, 30, 407, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 413, 10, 31, 12, 31, 14, 31, 416, 11, 31, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 422, 10, 32, 12, 32, 14, 32, 425, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 5, 34, 435, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 7, 37, 447, 10, 37, 12, 37, 14, 37, 450, 11, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 40, 3, 40, 5, 40, 460, 10, 40, 3, 41, 5, 41, 463, 10, 41, 3, 41, 3, 41, 3, 42, 5, 42, 468, 10, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 487, 10, 47, 3, 48, 3, 48, 7, 48, 491, 10, 48, 12, 48, 14, 48, 494, 11, 48, 3, 48, 3, 48, 3, 48, 5, 48, 499, 10, 48, 3, 48, 3, 48, 3, 48, 3, 48, 7, 48, 505, 10, 48, 12, 48, 14, 48, 508, 11, 48, 5, 48, 510, 10, 48, 3, 49, 3, 49, 3, 49, 5, 49, 515, 10, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 2, 2, 5, 4, 12, 18, 51, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 88, 2, 90, 2, 92, 2, 94, 2, 96, 2, 98, 2, 2, 11, 3, 2, 61, 62, 3, 2, 63, 65, 4, 2, 69, 69, 74, 74, 3, 2, 68, 69, 4, 2, 69, 69, 78, 78, 4, 2, 34, 34, 37, 37, 3, 2, 40, 41, 4, 2, 39, 39, 53, 53, 3, 2, 54, 60, 2, 554, 2, 100, 3, 2, 2, 2, 4, 103, 3, 2, 2, 2, 6, 118, 3, 2, 2, 2, 8, 133, 3, 2, 2, 2, 10, 135, 3, 2, 2, 2, 12, 166, 3, 2, 2, 2, 14, 193, 3, 2, 2, 2, 16, 200, 3, 2, 2, 2, 18, 206, 3, 2, 2, 2, 20, 226, 3, 2, 2, 2, 22, 228, 3, 2, 2, 2, 24, 243, 3, 2, 2, 2, 26, 246, 3, 2, 2, 2, 28, 259, 3, 2, 2, 2, 30, 261, 3, 2, 2, 2, 32, 273, 3, 2, 2, 2, 34, 285, 3, 2, 2, 2, 36, 288, 3, 2, 2, 2, 38, 296, 3, 2, 2, 2, 40, 302, 3, 2, 2, 2, 42, 304, 3, 2, 2, 2, 44, 312, 3, 2, 2, 2, 46, 320, 3, 2, 2, 2, 48, 322, 3, 2, 2, 2, 50, 366, 3, 2, 2, 2, 52, 368, 3, 2, 2, 2, 54, 371, 3, 2, 2, 2, 56, 380, 3, 2, 2, 2, 58, 406, 3, 2, 2, 2, 60, 408, 3, 2, 2, 2, 62, 417, 3, 2, 2, 2, 64, 426, 3, 2, 2, 2, 66, 430, 3, 2, 2, 2, 68, 436, 3, 2, 2, 2, 70, 440, 3, 2, 2, 2, 72, 443, 3, 2, 2, 2, 74, 451, 3, 2, 2, 2, 76, 455, 3, 2, 2, 2, 78, 459, 3, 2, 2, 2, 80, 462, 3, 2, 2, 2, 82, 467, 3, 2, 2, 2, 84, 471, 3, 2, 2, 2, 86, 473, 3, 2, 2, 2, 88, 475, 3, 2, 2, 2, 90, 478, 3, 2, 2, 2, 92, 486, 3, 2, 2, 2, 94, 488, 3, 2, 2, 2, 96, 514, 3, 2, 2, 2, 98, 518, 3, 2, 2, 2, 100, 101, 5, 4, 3, 2, 101, 102, 7, 2, 2, 3, 102, 3, 3, 2, 2, 2, 103, 104, 8, 3, 1, 2, 104, 105, 5, 6, 4, 2, 105, 111, 3, 2, 2, 2, 106, 107, 12, 3, 2, 2, 107, 108, 7, 28, 2, 2, 108, 110, 5, 8, 5, 2, 109, 106, 3, 2, 2, 2, 110, 113, 3, 2, 2, 2, 111, 109, 3, 2, 2, 2, 111, 112, 3, 2, 2, 2, 112, 5, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 114, 119, 5, 88, 45, 2, 115, 119, 5, 30, 16, 2, 116, 119, 5, 24, 13, 2, 117, 119, 5, 92, 47, 2, 118, 114, 3, 2, 2, 2, 118, 115, 3, 2, 2, 2, 118, 116, 3, 2, 2, 2, 118, 117, 3, 2, 2, 2, 119, 7, 3, 2, 2, 2, 120, 134, 5, 34, 18, 2, 121, 134, 5, 38, 20, 2, 122, 134, 5, 52, 27, 2, 123, 134, 5, 58, 30, 2, 124, 134, 5, 54, 28, 2, 125, 134, 5, 36, 19, 2, 126, 134, 5, 10, 6, 2, 127, 134, 5, 60, 31, 2, 128, 134, 5, 62, 32, 2, 129, 134, 5, 66, 34, 2, 130, 134, 5, 68, 35, 2, 131, 134, 5, 94, 48, 2, 132, 134, 5, 70, 36, 2, 133, 120, 3, 2, 2, 2, 133, 121, 3, 2, 2, 2, 133, 122, 3, 2, 2, 2, 133, 123, 3, 2, 2, 2, 133, 124, 3, 2, 2, 2, 133, 125, 3, 2, 2, 2, 133, 126, 3, 2, 2, 2, 133, 127, 3, 2, 2, 2, 133, 128, 3, 2, 2, 2, 133, 129, 3, 2, 2, 2, 133, 130, 3, 2, 2, 2, 133, 131, 3, 2, 2, 2, 133, 132, 3, 2, 2, 2, 134, 9, 3, 2, 2, 2, 135, 136, 7, 20, 2, 2, 136, 137, 5, 12, 7, 2, 137, 11, 3, 2, 2, 2, 138, 139, 8, 7, 1, 2, 139, 140, 7, 46, 2, 2, 140, 167, 5, 12, 7, 9, 141, 167, 5, 16, 9, 2, 142, 167, 5, 14, 8, 2, 143, 145, 5, 16, 9, 2, 144, 146, 7, 46, 2, 2, 145, 144, 3, 2, 2, 2, 145, 146, 3, 2, 2, 2, 146, 147, 3, 2, 2, 2, 147, 148, 7, 43, 2, 2, 148, 149, 7, 42, 2, 2, 149, 154, 5, 16, 9, 2, 150, 151, 7, 36, 2, 2, 151, 153, 5, 16, 9, 2, 152, 150, 3, 2, 2, 2, 153, 156, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 154, 155, 3, 2, 2, 2, 155, 157, 3, 2, 2, 2, 156, 154, 3, 2, 2, 2, 157, 158, 7, 52, 2, 2, 158, 167, 3, 2, 2, 2, 159, 160, 5, 16, 9, 2, 160, 162, 7, 44, 2, 2, 161, 163, 7, 46, 2, 2, 162, 161, 3, 2, 2, 2, 162, 163, 3, 2, 2, 2, 163, 164, 3, 2, 2, 2, 164, 165, 7, 47, 2, 2, 165, 167, 3, 2, 2, 2, 166, 138, 3, 2, 2, 2, 166, 141, 3, 2, 2, 2, 166, 142, 3, 2, 2, 2, 166, 143, 3, 2, 2, 2, 166, 159, 3, 2, 2, 2, 167, 176, 3, 2, 2, 2, 168, 169, 12, 6, 2, 2, 169, 170, 7, 33, 2, 2, 170, 175, 5, 12, 7, 7, 171, 172, 12, 5, 2, 2, 172, 173, 7, 49, 2, 2, 173, 175, 5, 12, 7, 6, 174, 168, 3, 2, 2, 2, 174, 171, 3, 2, 2, 2, 175, 178, 3, 2, 2, 2, 176, 174, 3, 2, 2, 2, 176, 177, 3, 2, 2, 2, 177, 13, 3, 2, 2, 2, 178, 176, 3, 2, 2, 2, 179, 181, 5, 16, 9, 2, 180, 182, 7, 46, 2, 2, 181, 180, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 183, 3, 2, 2, 2, 183, 184, 7, 45, 2, 2, 184, 185, 5, 84, 43, 2, 185, 194, 3, 2, 2, 2, 186, 188, 5, 16, 9, 2, 187, 189, 7, 46, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 190, 3, 2, 2, 2, 190, 191, 7, 51, 2, 2, 191, 192, 5, 84, 43, 2, 192, 194, 3, 2, 2, 2, 193, 179, 3, 2, 2, 2, 193, 186, 3, 2, 2, 2, 194, 15, 3, 2, 2, 2, 195, 201, 5, 18, 10, 2, 196, 197, 5, 18, 10, 2, 197, 198, 5, 86, 44, 2, 198, 199, 5, 18, 10, 2, 199, 201, 3, 2, 2, 2, 200, 195, 3, 2, 2, 2, 200, 196, 3, 2, 2, 2, 201, 17, 3, 2, 2, 2, 202, 203, 8, 10, 1, 2, 203, 207, 5, 20, 11, 2, 204, 205, 9, 2, 2, 2, 205, 207, 5, 18, 10, 5, 206, 202, 3, 2, 2, 2, 206, 204, 3, 2, 2, 2, 207, 216, 3, 2, 2, 2, 208, 209, 12, 4, 2, 2, 209, 210, 9, 3, 2, 2, 210, 215, 5, 18, 10, 5, 211, 212, 12, 3, 2, 2, 212, 213, 9, 2, 2, 2, 213, 215, 5, 18, 10, 4, 214, 208, 3, 2, 2, 2, 214, 211, 3, 2, 2, 2, 215, 218, 3, 2, 2, 2, 216, 214, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 19, 3, 2, 2, 2, 218, 216, 3, 2, 2, 2, 219, 227, 5, 50, 26, 2, 220, 227, 5, 42, 22, 2, 221, 227, 5, 22, 12, 2, 222, 223, 7, 42, 2, 2, 223, 224, 5, 12, 7, 2, 224, 225, 7, 52, 2, 2, 225, 227, 3, 2, 2, 2, 226, 219, 3, 2, 2, 2, 226, 220, 3, 2, 2, 2, 226, 221, 3, 2, 2, 2, 226, 222, 3, 2, 2, 2, 227, 21, 3, 2, 2, 2, 228, 229, 5, 46, 24, 2, 229, 239, 7, 42, 2, 2, 230, 240, 7, 63, 2, 2, 231, 236, 5, 12, 7, 2, 232, 233, 7, 36, 2, 2, 233, 235, 5, 12, 7, 2, 234, 232, 3, 2, 2, 2, 235, 238, 3, 2, 2, 2, 236, 234, 3, 2, 2, 2, 236, 237, 3, 2, 2, 2, 237, 240, 3, 2, 2, 2, 238, 236, 3, 2, 2, 2, 239, 230, 3, 2, 2, 2, 239, 231, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 241, 3, 2, 2, 2, 241, 242, 7, 52, 2, 2, 242, 23, 3, 2, 2, 2, 243, 244, 7, 16, 2, 2, 244, 245, 5, 26, 14, 2, 245, 25, 3, 2, 2, 2, 246, 251, 5, 28, 15, 2, 247, 248, 7, 36, 2, 2, 248, 250, 5, 28, 15, 2, 249, 247, 3, 2, 2, 2, 250, 253, 3, 2, 2, 2, 251, 249, 3, 2, 2, 2, 251, 252, 3, 2, 2, 2, 252, 27, 3, 2, 2, 2, 253, 251, 3, 2, 2, 2, 254, 260, 5, 12, 7, 2, 255, 256, 5, 42, 22, 2, 256, 257, 7, 35, 2, 2, 257, 258, 5, 12, 7, 2, 258, 260, 3, 2, 2, 2, 259, 254, 3, 2, 2, 2, 259, 255, 3, 2, 2, 2, 260, 29, 3, 2, 2, 2, 261, 262, 7, 8, 2, 2, 262, 267, 5, 40, 21, 2, 263, 264, 7, 36, 2, 2, 264, 266, 5, 40, 21, 2, 265, 263, 3, 2, 2, 2, 266, 269, 3, 2, 2, 2, 267, 265, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 271, 3, 2, 2, 2, 269, 267, 3, 2, 2, 2, 270, 272, 5, 32, 17, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 31, 3, 2, 2, 2, 273, 274, 7, 66, 2, 2, 274, 275, 7, 73, 2, 2, 275, 280, 5, 40, 21, 2, 276, 277, 7, 36, 2, 2, 277, 279, 5, 40, 21, 2, 278, 276, 3, 2, 2, 2, 279, 282, 3, 2, 2, 2, 280, 278, 3, 2, 2, 2, 280, 281, 3, 2, 2, 2, 281, 283, 3, 2, 2, 2, 282, 280, 3, 2, 2, 2, 283, 284, 7, 67, 2, 2, 284, 33, 3, 2, 2, 2, 285, 286, 7, 6, 2, 2, 286, 287, 5, 26, 14, 2, 287, 35, 3, 2, 2, 2, 288, 290, 7, 19, 2, 2, 289, 291, 5, 26, 14, 2, 290, 289, 3, 2, 2, 2, 290, 291, 3, 2, 2, 2, 291, 294, 3, 2, 2, 2, 292, 293, 7, 32, 2, 2, 293, 295, 5, 26, 14, 2, 294, 292, 3, 2, 2, 2, 294, 295, 3, 2, 2, 2, 295, 37, 3, 2, 2, 2, 296, 297, 7, 10, 2, 2, 297, 300, 5, 26, 14, 2, 298, 299, 7, 32, 2, 2, 299, 301, 5, 26, 14, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 39, 3, 2, 2, 2, 302, 303, 9, 4, 2, 2, 303, 41, 3, 2, 2, 2, 304, 309, 5, 46, 24, 2, 305, 306, 7, 38, 2, 2, 306, 308, 5, 46, 24, 2, 307, 305, 3, 2, 2, 2, 308, 311, 3, 2, 2, 2, 309, 307, 3, 2, 2, 2, 309, 310, 3, 2, 2, 2, 310, 43, 3, 2, 2, 2, 311, 309, 3, 2, 2, 2, 312, 317, 5, 48, 25, 2, 313, 314, 7, 38, 2, 2, 314, 316, 5, 48, 25, 2, 315, 313, 3, 2, 2, 2, 316, 319, 3, 2, 2, 2, 317, 315, 3, 2, 2, 2, 317, 318, 3, 2, 2, 2, 318, 45, 3, 2, 2, 2, 319, 317, 3, 2, 2, 2, 320, 321, 9, 5, 2, 2, 321, 47, 3, 2, 2, 2, 322, 323, 9, 6, 2, 2, 323, 49, 3, 2, 2, 2, 324, 367, 7, 47, 2, 2, 325, 326, 5, 82, 42, 2, 326, 327, 7, 68, 2, 2, 327, 367, 3, 2, 2, 2, 328, 367, 5, 80, 41, 2, 329, 367, 5, 82, 42, 2, 330, 367, 5, 76, 39, 2, 331, 367, 7, 50, 2, 2, 332, 367, 5, 84, 43, 2, 333, 334, 7, 66, 2, 2, 334, 339, 5, 78, 40, 2, 335, 336, 7, 36, 2, 2, 336, 338, 5, 78, 40, 2, 337, 335, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 342, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 342, 343, 7, 67, 2, 2, 343, 367, 3, 2, 2, 2, 344, 345, 7, 66, 2, 2, 345, 350, 5, 76, 39, 2, 346, 347, 7, 36, 2, 2, 347, 349, 5, 76, 39, 2, 348, 346, 3, 2, 2, 2, 349, 352, 3, 2, 2, 2, 350, 348, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 353, 3, 2, 2, 2, 352, 350, 3, 2, 2, 2, 353, 354, 7, 67, 2, 2, 354, 367, 3, 2, 2, 2, 355, 356, 7, 66, 2, 2, 356, 361, 5, 84, 43, 2, 357, 358, 7, 36, 2, 2, 358, 360, 5, 84, 43, 2, 359, 357, 3, 2, 2, 2, 360, 363, 3, 2, 2, 2, 361, 359, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 364, 3, 2, 2, 2, 363, 361, 3, 2, 2, 2, 364, 365, 7, 67, 2, 2, 365, 367, 3, 2, 2, 2, 366, 324, 3, 2, 2, 2, 366, 325, 3, 2, 2, 2, 366, 328, 3, 2, 2, 2, 366, 329, 3, 2, 2, 2, 366, 330, 3, 2, 2, 2, 366, 331, 3, 2, 2, 2, 366, 332, 3, 2, 2, 2, 366, 333, 3, 2, 2, 2, 366, 344, 3, 2, 2, 2, 366, 355, 3, 2, 2, 2, 367, 51, 3, 2, 2, 2, 368, 369, 7, 12, 2, 2, 369, 370, 7, 30, 2, 2, 370, 53, 3, 2, 2, 2, 371, 372, 7, 18, 2, 2, 372, 377, 5, 56, 29, 2, 373, 374, 7, 36, 2, 2, 374, 376, 5, 56, 29, 2, 375, 373, 3, 2, 2, 2, 376, 379, 3, 2, 2, 2, 377, 375, 3, 2, 2, 2, 377, 378, 3, 2, 2, 2, 378, 55, 3, 2, 2, 2, 379, 377, 3, 2, 2, 2, 380, 382, 5, 12, 7, 2, 381, 383, 9, 7, 2, 2, 382, 381, 3, 2, 2, 2, 382, 383, 3, 2, 2, 2, 383, 386, 3, 2, 2, 2, 384, 385, 7, 48, 2, 2, 385, 387, 9, 8, 2, 2, 386, 384, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 57, 3, 2, 2, 2, 388, 389, 7, 11, 2, 2, 389, 394, 5, 44, 23, 2, 390, 391, 7, 36, 2, 2, 391, 393, 5, 44, 23, 2, 392, 390, 3, 2, 2, 2, 393, 396, 3, 2, 2, 2, 394, 392, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 407, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 397, 398, 7, 14, 2, 2, 398, 403, 5, 44, 23, 2, 399, 400, 7, 36, 2, 2, 400, 402, 5, 44, 23, 2, 401, 399, 3, 2, 2, 2, 402, 405, 3, 2, 2, 2, 403, 401, 3, 2, 2, 2, 403, 404, 3, 2, 2, 2, 404, 407, 3, 2, 2, 2, 405, 403, 3, 2, 2, 2, 406, 388, 3, 2, 2, 2, 406, 397, 3, 2, 2, 2, 407, 59, 3, 2, 2, 2, 408, 409, 7, 4, 2, 2, 409, 414, 5, 44, 23, 2, 410, 411, 7, 36, 2, 2, 411, 413, 5, 44, 23, 2, 412, 410, 3, 2, 2, 2, 413, 416, 3, 2, 2, 2, 414, 412, 3, 2, 2, 2, 414, 415, 3, 2, 2, 2, 415, 61, 3, 2, 2, 2, 416, 414, 3, 2, 2, 2, 417, 418, 7, 15, 2, 2, 418, 423, 5, 64, 33, 2, 419, 420, 7, 36, 2, 2, 420, 422, 5, 64, 33, 2, 421, 419, 3, 2, 2, 2, 422, 425, 3, 2, 2, 2, 423, 421, 3, 2, 2, 2, 423, 424, 3, 2, 2, 2, 424, 63, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 426, 427, 5, 44, 23, 2, 427, 428, 7, 82, 2, 2, 428, 429, 5, 44, 23, 2, 429, 65, 3, 2, 2, 2, 430, 431, 7, 3, 2, 2, 431, 432, 5, 20, 11, 2, 432, 434, 5, 84, 43, 2, 433, 435, 5, 72, 37, 2, 434, 433, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 435, 67, 3, 2, 2, 2, 436, 437, 7, 9, 2, 2, 437, 438, 5, 20, 11, 2, 438, 439, 5, 84, 43, 2, 439, 69, 3, 2, 2, 2, 440, 441, 7, 13, 2, 2, 441, 442, 5, 42, 22, 2, 442, 71, 3, 2, 2, 2, 443, 448, 5, 74, 38, 2, 444, 445, 7, 36, 2, 2, 445, 447, 5, 74, 38, 2, 446, 444, 3, 2, 2, 2, 447, 450, 3, 2, 2, 2, 448, 446, 3, 2, 2, 2, 448, 449, 3, 2, 2, 2, 449, 73, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 451, 452, 5, 46, 24, 2, 452, 453, 7, 35, 2, 2, 453, 454, 5, 50, 26, 2, 454, 75, 3, 2, 2, 2, 455, 456, 9, 9, 2, 2, 456, 77, 3, 2, 2, 2, 457, 460, 5, 80, 41, 2, 458, 460, 5, 82, 42, 2, 459, 457, 3, 2, 2, 2, 459, 458, 3, 2, 2, 2, 460, 79, 3, 2, 2, 2, 461, 463, 9, 2, 2, 2, 462, 461, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 7, 31, 2, 2, 465, 81, 3, 2, 2, 2, 466, 468, 9, 2, 2, 2, 467, 466, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 469, 3, 2, 2, 2, 469, 470, 7, 30, 2, 2, 470, 83, 3, 2, 2, 2, 471, 472, 7, 29, 2, 2, 472, 85, 3, 2, 2, 2, 473, 474, 9, 10, 2, 2, 474, 87, 3, 2, 2, 2, 475, 476, 7, 7, 2, 2, 476, 477, 5, 90, 46, 2, 477, 89, 3, 2, 2, 2, 478, 479, 7, 66, 2, 2, 479, 480, 5, 4, 3, 2, 480, 481, 7, 67, 2, 2, 481, 91, 3, 2, 2, 2, 482, 483, 7, 17, 2, 2, 483, 487, 7, 98, 2, 2, 484, 485, 7, 17, 2, 2, 485, 487, 7, 99, 2, 2, 486, 482, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 487, 93, 3, 2, 2, 2, 488, 492, 7, 5, 2, 2, 489, 491, 5, 98, 50, 2, 490, 489, 3, 2, 2, 2, 491, 494, 3, 2, 2, 2, 492, 490, 3, 2, 2, 2, 492, 493, 3, 2, 2, 2, 493, 495, 3, 2, 2, 2, 494, 492, 3, 2, 2, 2, 495, 498, 7, 88, 2, 2, 496, 497, 7, 86, 2, 2, 497, 499, 5, 44, 23, 2, 498, 496, 3, 2, 2, 2, 498, 499, 3, 2, 2, 2, 499, 509, 3, 2, 2, 2, 500, 501, 7, 87, 2, 2, 501, 506, 5, 96, 49, 2, 502, 503, 7, 36, 2, 2, 503, 505, 5, 96, 49, 2, 504, 502, 3, 2, 2, 2, 505, 508, 3, 2, 2, 2, 506, 504, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 510, 3, 2, 2, 2, 508, 506, 3, 2, 2, 2, 509, 500, 3, 2, 2, 2, 509, 510, 3, 2, 2, 2, 510, 95, 3, 2, 2, 2, 511, 512, 5, 44, 23, 2, 512, 513, 7, 35, 2, 2, 513, 515, 3, 2, 2, 2, 514, 511, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 516, 3, 2, 2, 2, 516, 517, 5, 44, 23, 2, 517, 97, 3, 2, 2, 2, 518, 519, 7, 66, 2, 2, 519, 520, 7, 104, 2, 2, 520, 521, 7, 103, 2, 2, 521, 522, 7, 104, 2, 2, 522, 523, 7, 67, 2, 2, 523, 99, 3, 2, 2, 2, 54, 111, 118, 133, 145, 154, 162, 166, 174, 176, 181, 188, 193, 200, 206, 214, 216, 226, 236, 239, 251, 259, 267, 271, 280, 290, 294, 300, 309, 317, 339, 350, 361, 366, 377, 382, 386, 394, 403, 406, 414, 423, 434, 448, 459, 462, 467, 486, 492, 498, 506, 509, 514] \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens b/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens index 073febb9e1783..4bdf0572a3b8a 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens @@ -50,58 +50,59 @@ RLIKE=49 RP=50 TRUE=51 EQ=52 -NEQ=53 -LT=54 -LTE=55 -GT=56 -GTE=57 -PLUS=58 -MINUS=59 -ASTERISK=60 -SLASH=61 -PERCENT=62 -OPENING_BRACKET=63 -CLOSING_BRACKET=64 -UNQUOTED_IDENTIFIER=65 -QUOTED_IDENTIFIER=66 -EXPR_LINE_COMMENT=67 -EXPR_MULTILINE_COMMENT=68 -EXPR_WS=69 -METADATA=70 -FROM_UNQUOTED_IDENTIFIER=71 -FROM_LINE_COMMENT=72 -FROM_MULTILINE_COMMENT=73 -FROM_WS=74 -UNQUOTED_ID_PATTERN=75 -PROJECT_LINE_COMMENT=76 -PROJECT_MULTILINE_COMMENT=77 -PROJECT_WS=78 -AS=79 -RENAME_LINE_COMMENT=80 -RENAME_MULTILINE_COMMENT=81 -RENAME_WS=82 -ON=83 -WITH=84 -ENRICH_POLICY_NAME=85 -ENRICH_LINE_COMMENT=86 -ENRICH_MULTILINE_COMMENT=87 -ENRICH_WS=88 -ENRICH_FIELD_LINE_COMMENT=89 -ENRICH_FIELD_MULTILINE_COMMENT=90 -ENRICH_FIELD_WS=91 -MVEXPAND_LINE_COMMENT=92 -MVEXPAND_MULTILINE_COMMENT=93 -MVEXPAND_WS=94 -INFO=95 -FUNCTIONS=96 -SHOW_LINE_COMMENT=97 -SHOW_MULTILINE_COMMENT=98 -SHOW_WS=99 -COLON=100 -SETTING=101 -SETTING_LINE_COMMENT=102 -SETTTING_MULTILINE_COMMENT=103 -SETTING_WS=104 +CIEQ=53 +NEQ=54 +LT=55 +LTE=56 +GT=57 +GTE=58 +PLUS=59 +MINUS=60 +ASTERISK=61 +SLASH=62 +PERCENT=63 +OPENING_BRACKET=64 +CLOSING_BRACKET=65 +UNQUOTED_IDENTIFIER=66 +QUOTED_IDENTIFIER=67 +EXPR_LINE_COMMENT=68 +EXPR_MULTILINE_COMMENT=69 +EXPR_WS=70 +METADATA=71 +FROM_UNQUOTED_IDENTIFIER=72 +FROM_LINE_COMMENT=73 +FROM_MULTILINE_COMMENT=74 +FROM_WS=75 +UNQUOTED_ID_PATTERN=76 +PROJECT_LINE_COMMENT=77 +PROJECT_MULTILINE_COMMENT=78 +PROJECT_WS=79 +AS=80 +RENAME_LINE_COMMENT=81 +RENAME_MULTILINE_COMMENT=82 +RENAME_WS=83 +ON=84 +WITH=85 +ENRICH_POLICY_NAME=86 +ENRICH_LINE_COMMENT=87 +ENRICH_MULTILINE_COMMENT=88 +ENRICH_WS=89 +ENRICH_FIELD_LINE_COMMENT=90 +ENRICH_FIELD_MULTILINE_COMMENT=91 +ENRICH_FIELD_WS=92 +MVEXPAND_LINE_COMMENT=93 +MVEXPAND_MULTILINE_COMMENT=94 +MVEXPAND_WS=95 +INFO=96 +FUNCTIONS=97 +SHOW_LINE_COMMENT=98 +SHOW_MULTILINE_COMMENT=99 +SHOW_WS=100 +COLON=101 +SETTING=102 +SETTING_LINE_COMMENT=103 +SETTTING_MULTILINE_COMMENT=104 +SETTING_WS=105 '|'=26 '='=33 ','=34 @@ -110,15 +111,16 @@ SETTING_WS=104 '?'=48 ')'=50 '=='=52 -'!='=53 -'<'=54 -'<='=55 -'>'=56 -'>='=57 -'+'=58 -'-'=59 -'*'=60 -'/'=61 -'%'=62 -']'=64 -':'=100 +'=~'=53 +'!='=54 +'<'=55 +'<='=56 +'>'=57 +'>='=58 +'+'=59 +'-'=60 +'*'=61 +'/'=62 +'%'=63 +']'=65 +':'=101 diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.ts b/packages/kbn-monaco/src/esql/antlr/esql_parser.ts index d4d52d328b189..696d67ba90f00 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.ts +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser.ts @@ -79,58 +79,59 @@ export class esql_parser extends Parser { public static readonly RP = 50; public static readonly TRUE = 51; public static readonly EQ = 52; - public static readonly NEQ = 53; - public static readonly LT = 54; - public static readonly LTE = 55; - public static readonly GT = 56; - public static readonly GTE = 57; - public static readonly PLUS = 58; - public static readonly MINUS = 59; - public static readonly ASTERISK = 60; - public static readonly SLASH = 61; - public static readonly PERCENT = 62; - public static readonly OPENING_BRACKET = 63; - public static readonly CLOSING_BRACKET = 64; - public static readonly UNQUOTED_IDENTIFIER = 65; - public static readonly QUOTED_IDENTIFIER = 66; - public static readonly EXPR_LINE_COMMENT = 67; - public static readonly EXPR_MULTILINE_COMMENT = 68; - public static readonly EXPR_WS = 69; - public static readonly METADATA = 70; - public static readonly FROM_UNQUOTED_IDENTIFIER = 71; - public static readonly FROM_LINE_COMMENT = 72; - public static readonly FROM_MULTILINE_COMMENT = 73; - public static readonly FROM_WS = 74; - public static readonly UNQUOTED_ID_PATTERN = 75; - public static readonly PROJECT_LINE_COMMENT = 76; - public static readonly PROJECT_MULTILINE_COMMENT = 77; - public static readonly PROJECT_WS = 78; - public static readonly AS = 79; - public static readonly RENAME_LINE_COMMENT = 80; - public static readonly RENAME_MULTILINE_COMMENT = 81; - public static readonly RENAME_WS = 82; - public static readonly ON = 83; - public static readonly WITH = 84; - public static readonly ENRICH_POLICY_NAME = 85; - public static readonly ENRICH_LINE_COMMENT = 86; - public static readonly ENRICH_MULTILINE_COMMENT = 87; - public static readonly ENRICH_WS = 88; - public static readonly ENRICH_FIELD_LINE_COMMENT = 89; - public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 90; - public static readonly ENRICH_FIELD_WS = 91; - public static readonly MVEXPAND_LINE_COMMENT = 92; - public static readonly MVEXPAND_MULTILINE_COMMENT = 93; - public static readonly MVEXPAND_WS = 94; - public static readonly INFO = 95; - public static readonly FUNCTIONS = 96; - public static readonly SHOW_LINE_COMMENT = 97; - public static readonly SHOW_MULTILINE_COMMENT = 98; - public static readonly SHOW_WS = 99; - public static readonly COLON = 100; - public static readonly SETTING = 101; - public static readonly SETTING_LINE_COMMENT = 102; - public static readonly SETTTING_MULTILINE_COMMENT = 103; - public static readonly SETTING_WS = 104; + public static readonly CIEQ = 53; + public static readonly NEQ = 54; + public static readonly LT = 55; + public static readonly LTE = 56; + public static readonly GT = 57; + public static readonly GTE = 58; + public static readonly PLUS = 59; + public static readonly MINUS = 60; + public static readonly ASTERISK = 61; + public static readonly SLASH = 62; + public static readonly PERCENT = 63; + public static readonly OPENING_BRACKET = 64; + public static readonly CLOSING_BRACKET = 65; + public static readonly UNQUOTED_IDENTIFIER = 66; + public static readonly QUOTED_IDENTIFIER = 67; + public static readonly EXPR_LINE_COMMENT = 68; + public static readonly EXPR_MULTILINE_COMMENT = 69; + public static readonly EXPR_WS = 70; + public static readonly METADATA = 71; + public static readonly FROM_UNQUOTED_IDENTIFIER = 72; + public static readonly FROM_LINE_COMMENT = 73; + public static readonly FROM_MULTILINE_COMMENT = 74; + public static readonly FROM_WS = 75; + public static readonly UNQUOTED_ID_PATTERN = 76; + public static readonly PROJECT_LINE_COMMENT = 77; + public static readonly PROJECT_MULTILINE_COMMENT = 78; + public static readonly PROJECT_WS = 79; + public static readonly AS = 80; + public static readonly RENAME_LINE_COMMENT = 81; + public static readonly RENAME_MULTILINE_COMMENT = 82; + public static readonly RENAME_WS = 83; + public static readonly ON = 84; + public static readonly WITH = 85; + public static readonly ENRICH_POLICY_NAME = 86; + public static readonly ENRICH_LINE_COMMENT = 87; + public static readonly ENRICH_MULTILINE_COMMENT = 88; + public static readonly ENRICH_WS = 89; + public static readonly ENRICH_FIELD_LINE_COMMENT = 90; + public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 91; + public static readonly ENRICH_FIELD_WS = 92; + public static readonly MVEXPAND_LINE_COMMENT = 93; + public static readonly MVEXPAND_MULTILINE_COMMENT = 94; + public static readonly MVEXPAND_WS = 95; + public static readonly INFO = 96; + public static readonly FUNCTIONS = 97; + public static readonly SHOW_LINE_COMMENT = 98; + public static readonly SHOW_MULTILINE_COMMENT = 99; + public static readonly SHOW_WS = 100; + public static readonly COLON = 101; + public static readonly SETTING = 102; + public static readonly SETTING_LINE_COMMENT = 103; + public static readonly SETTTING_MULTILINE_COMMENT = 104; + public static readonly SETTING_WS = 105; public static readonly RULE_singleStatement = 0; public static readonly RULE_query = 1; public static readonly RULE_sourceCommand = 2; @@ -203,13 +204,13 @@ export class esql_parser extends Parser { undefined, undefined, undefined, undefined, undefined, "'='", "','", undefined, "'.'", undefined, undefined, undefined, "'('", undefined, undefined, undefined, undefined, undefined, undefined, undefined, "'?'", undefined, "')'", undefined, - "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", - "'%'", undefined, "']'", undefined, undefined, undefined, undefined, undefined, + "'=='", "'=~'", "'!='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", + "'/'", "'%'", undefined, "']'", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, "':'", + undefined, undefined, undefined, "':'", ]; private static readonly _SYMBOLIC_NAMES: Array = [ undefined, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", @@ -219,8 +220,8 @@ export class esql_parser extends Parser { "PIPE", "STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "COMMA", "DESC", "DOT", "FALSE", "FIRST", "LAST", "LP", "IN", "IS", "LIKE", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", - "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", - "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", + "EQ", "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", + "SLASH", "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "METADATA", "FROM_UNQUOTED_IDENTIFIER", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", "FROM_WS", "UNQUOTED_ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", @@ -940,7 +941,7 @@ export class esql_parser extends Parser { this.state = 207; (_localctx as ArithmeticBinaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); - if (!(((((_la - 60)) & ~0x1F) === 0 && ((1 << (_la - 60)) & ((1 << (esql_parser.ASTERISK - 60)) | (1 << (esql_parser.SLASH - 60)) | (1 << (esql_parser.PERCENT - 60)))) !== 0))) { + if (!(((((_la - 61)) & ~0x1F) === 0 && ((1 << (_la - 61)) & ((1 << (esql_parser.ASTERISK - 61)) | (1 << (esql_parser.SLASH - 61)) | (1 << (esql_parser.PERCENT - 61)))) !== 0))) { (_localctx as ArithmeticBinaryContext)._operator = this._errHandler.recoverInline(this); } else { if (this._input.LA(1) === Token.EOF) { @@ -2566,7 +2567,7 @@ export class esql_parser extends Parser { { this.state = 471; _la = this._input.LA(1); - if (!(((((_la - 52)) & ~0x1F) === 0 && ((1 << (_la - 52)) & ((1 << (esql_parser.EQ - 52)) | (1 << (esql_parser.NEQ - 52)) | (1 << (esql_parser.LT - 52)) | (1 << (esql_parser.LTE - 52)) | (1 << (esql_parser.GT - 52)) | (1 << (esql_parser.GTE - 52)))) !== 0))) { + if (!(((((_la - 52)) & ~0x1F) === 0 && ((1 << (_la - 52)) & ((1 << (esql_parser.EQ - 52)) | (1 << (esql_parser.CIEQ - 52)) | (1 << (esql_parser.NEQ - 52)) | (1 << (esql_parser.LT - 52)) | (1 << (esql_parser.LTE - 52)) | (1 << (esql_parser.GT - 52)) | (1 << (esql_parser.GTE - 52)))) !== 0))) { this._errHandler.recoverInline(this); } else { if (this._input.LA(1) === Token.EOF) { @@ -2891,7 +2892,7 @@ export class esql_parser extends Parser { } public static readonly _serializedATN: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03j\u020D\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03k\u020D\x04\x02" + "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" + "\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04" + "\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t\x12\x04" + @@ -2948,9 +2949,9 @@ export class esql_parser extends Parser { "\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02\x1E\x02" + " \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x028\x02:\x02" + "<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02R\x02T\x02V\x02" + - "X\x02Z\x02\\\x02^\x02`\x02b\x02\x02\v\x03\x02<=\x03\x02>@\x04\x02DDII" + - "\x03\x02CD\x04\x02DDMM\x04\x02\"\"%%\x03\x02()\x04\x02\'\'55\x03\x026" + - ";\x02\u022A\x02d\x03\x02\x02\x02\x04g\x03\x02\x02\x02\x06v\x03\x02\x02" + + "X\x02Z\x02\\\x02^\x02`\x02b\x02\x02\v\x03\x02=>\x03\x02?A\x04\x02EEJJ" + + "\x03\x02DE\x04\x02EENN\x04\x02\"\"%%\x03\x02()\x04\x02\'\'55\x03\x026" + + "<\x02\u022A\x02d\x03\x02\x02\x02\x04g\x03\x02\x02\x02\x06v\x03\x02\x02" + "\x02\b\x85\x03\x02\x02\x02\n\x87\x03\x02\x02\x02\f\xA6\x03\x02\x02\x02" + "\x0E\xC1\x03\x02\x02\x02\x10\xC8\x03\x02\x02\x02\x12\xCE\x03\x02\x02\x02" + "\x14\xE2\x03\x02\x02\x02\x16\xE4\x03\x02\x02\x02\x18\xF3\x03\x02\x02\x02" + @@ -3016,7 +3017,7 @@ export class esql_parser extends Parser { "\x16\f\x02\xDE\xDF\x07*\x02\x02\xDF\xE0\x05\f\x07\x02\xE0\xE1\x074\x02" + "\x02\xE1\xE3\x03\x02\x02\x02\xE2\xDB\x03\x02\x02\x02\xE2\xDC\x03\x02\x02" + "\x02\xE2\xDD\x03\x02\x02\x02\xE2\xDE\x03\x02\x02\x02\xE3\x15\x03\x02\x02" + - "\x02\xE4\xE5\x05.\x18\x02\xE5\xEF\x07*\x02\x02\xE6\xF0\x07>\x02\x02\xE7" + + "\x02\xE4\xE5\x05.\x18\x02\xE5\xEF\x07*\x02\x02\xE6\xF0\x07?\x02\x02\xE7" + "\xEC\x05\f\x07\x02\xE8\xE9\x07$\x02\x02\xE9\xEB\x05\f\x07\x02\xEA\xE8" + "\x03\x02\x02\x02\xEB\xEE\x03\x02\x02\x02\xEC\xEA\x03\x02\x02\x02\xEC\xED" + "\x03\x02\x02\x02\xED\xF0\x03\x02\x02\x02\xEE\xEC\x03\x02\x02\x02\xEF\xE6" + @@ -3034,11 +3035,11 @@ export class esql_parser extends Parser { "\x03\x02\x02\x02\u010B\u010C\x03\x02\x02\x02\u010C\u010F\x03\x02\x02\x02" + "\u010D\u010B\x03\x02\x02\x02\u010E\u0110\x05 \x11\x02\u010F\u010E\x03" + "\x02\x02\x02\u010F\u0110\x03\x02\x02\x02\u0110\x1F\x03\x02\x02\x02\u0111" + - "\u0112\x07A\x02\x02\u0112\u0113\x07H\x02\x02\u0113\u0118\x05(\x15\x02" + + "\u0112\x07B\x02\x02\u0112\u0113\x07I\x02\x02\u0113\u0118\x05(\x15\x02" + "\u0114\u0115\x07$\x02\x02\u0115\u0117\x05(\x15\x02\u0116\u0114\x03\x02" + "\x02\x02\u0117\u011A\x03\x02\x02\x02\u0118\u0116\x03\x02\x02\x02\u0118" + "\u0119\x03\x02\x02\x02\u0119\u011B\x03\x02\x02\x02\u011A\u0118\x03\x02" + - "\x02\x02\u011B\u011C\x07B\x02\x02\u011C!\x03\x02\x02\x02\u011D\u011E\x07" + + "\x02\x02\u011B\u011C\x07C\x02\x02\u011C!\x03\x02\x02\x02\u011D\u011E\x07" + "\x06\x02\x02\u011E\u011F\x05\x1A\x0E\x02\u011F#\x03\x02\x02\x02\u0120" + "\u0122\x07\x13\x02\x02\u0121\u0123\x05\x1A\x0E\x02\u0122\u0121\x03\x02" + "\x02\x02\u0122\u0123\x03\x02\x02\x02\u0123\u0126\x03\x02\x02\x02\u0124" + @@ -3056,22 +3057,22 @@ export class esql_parser extends Parser { "\x02\x02\u013E-\x03\x02\x02\x02\u013F\u013D\x03\x02\x02\x02\u0140\u0141" + "\t\x05\x02\x02\u0141/\x03\x02\x02\x02\u0142\u0143\t\x06\x02\x02\u0143" + "1\x03\x02\x02\x02\u0144\u016F\x07/\x02\x02\u0145\u0146\x05R*\x02\u0146" + - "\u0147\x07C\x02\x02\u0147\u016F\x03\x02\x02\x02\u0148\u016F\x05P)\x02" + + "\u0147\x07D\x02\x02\u0147\u016F\x03\x02\x02\x02\u0148\u016F\x05P)\x02" + "\u0149\u016F\x05R*\x02\u014A\u016F\x05L\'\x02\u014B\u016F\x072\x02\x02" + - "\u014C\u016F\x05T+\x02\u014D\u014E\x07A\x02\x02\u014E\u0153\x05N(\x02" + + "\u014C\u016F\x05T+\x02\u014D\u014E\x07B\x02\x02\u014E\u0153\x05N(\x02" + "\u014F\u0150\x07$\x02\x02\u0150\u0152\x05N(\x02\u0151\u014F\x03\x02\x02" + "\x02\u0152\u0155\x03\x02\x02\x02\u0153\u0151\x03\x02\x02\x02\u0153\u0154" + "\x03\x02\x02\x02\u0154\u0156\x03\x02\x02\x02\u0155\u0153\x03\x02\x02\x02" + - "\u0156\u0157\x07B\x02\x02\u0157\u016F\x03\x02\x02\x02\u0158\u0159\x07" + - "A\x02\x02\u0159\u015E\x05L\'\x02\u015A\u015B\x07$\x02\x02\u015B\u015D" + + "\u0156\u0157\x07C\x02\x02\u0157\u016F\x03\x02\x02\x02\u0158\u0159\x07" + + "B\x02\x02\u0159\u015E\x05L\'\x02\u015A\u015B\x07$\x02\x02\u015B\u015D" + "\x05L\'\x02\u015C\u015A\x03\x02\x02\x02\u015D\u0160\x03\x02\x02\x02\u015E" + "\u015C\x03\x02\x02\x02\u015E\u015F\x03\x02\x02\x02\u015F\u0161\x03\x02" + - "\x02\x02\u0160\u015E\x03\x02\x02\x02\u0161\u0162\x07B\x02\x02\u0162\u016F" + - "\x03\x02\x02\x02\u0163\u0164\x07A\x02\x02\u0164\u0169\x05T+\x02\u0165" + + "\x02\x02\u0160\u015E\x03\x02\x02\x02\u0161\u0162\x07C\x02\x02\u0162\u016F" + + "\x03\x02\x02\x02\u0163\u0164\x07B\x02\x02\u0164\u0169\x05T+\x02\u0165" + "\u0166\x07$\x02\x02\u0166\u0168\x05T+\x02\u0167\u0165\x03\x02\x02\x02" + "\u0168\u016B\x03\x02\x02\x02\u0169\u0167\x03\x02\x02\x02\u0169\u016A\x03" + "\x02\x02\x02\u016A\u016C\x03\x02\x02\x02\u016B\u0169\x03\x02\x02\x02\u016C" + - "\u016D\x07B\x02\x02\u016D\u016F\x03\x02\x02\x02\u016E\u0144\x03\x02\x02" + + "\u016D\x07C\x02\x02\u016D\u016F\x03\x02\x02\x02\u016E\u0144\x03\x02\x02" + "\x02\u016E\u0145\x03\x02\x02\x02\u016E\u0148\x03\x02\x02\x02\u016E\u0149" + "\x03\x02\x02\x02\u016E\u014A\x03\x02\x02\x02\u016E\u014B\x03\x02\x02\x02" + "\u016E\u014C\x03\x02\x02\x02\u016E\u014D\x03\x02\x02\x02\u016E\u0158\x03" + @@ -3101,7 +3102,7 @@ export class esql_parser extends Parser { "$\x02\x02\u01A4\u01A6\x05@!\x02\u01A5\u01A3\x03\x02\x02\x02\u01A6\u01A9" + "\x03\x02\x02\x02\u01A7\u01A5\x03\x02\x02\x02\u01A7\u01A8\x03\x02\x02\x02" + "\u01A8?\x03\x02\x02\x02\u01A9\u01A7\x03\x02\x02\x02\u01AA\u01AB\x05,\x17" + - "\x02\u01AB\u01AC\x07Q\x02\x02\u01AC\u01AD\x05,\x17\x02\u01ADA\x03\x02" + + "\x02\u01AB\u01AC\x07R\x02\x02\u01AC\u01AD\x05,\x17\x02\u01ADA\x03\x02" + "\x02\x02\u01AE\u01AF\x07\x03\x02\x02\u01AF\u01B0\x05\x14\v\x02\u01B0\u01B2" + "\x05T+\x02\u01B1\u01B3\x05H%\x02\u01B2\u01B1\x03\x02\x02\x02\u01B2\u01B3" + "\x03\x02\x02\x02\u01B3C\x03\x02\x02\x02\u01B4\u01B5\x07\t\x02\x02\u01B5" + @@ -3121,16 +3122,16 @@ export class esql_parser extends Parser { "\x02\x02\u01D6S\x03\x02\x02\x02\u01D7\u01D8\x07\x1D\x02\x02\u01D8U\x03" + "\x02\x02\x02\u01D9\u01DA\t\n\x02\x02\u01DAW\x03\x02\x02\x02\u01DB\u01DC" + "\x07\x07\x02\x02\u01DC\u01DD\x05Z.\x02\u01DDY\x03\x02\x02\x02\u01DE\u01DF" + - "\x07A\x02\x02\u01DF\u01E0\x05\x04\x03\x02\u01E0\u01E1\x07B\x02\x02\u01E1" + - "[\x03\x02\x02\x02\u01E2\u01E3\x07\x11\x02\x02\u01E3\u01E7\x07a\x02\x02" + - "\u01E4\u01E5\x07\x11\x02\x02\u01E5\u01E7\x07b\x02\x02\u01E6\u01E2\x03" + + "\x07B\x02\x02\u01DF\u01E0\x05\x04\x03\x02\u01E0\u01E1\x07C\x02\x02\u01E1" + + "[\x03\x02\x02\x02\u01E2\u01E3\x07\x11\x02\x02\u01E3\u01E7\x07b\x02\x02" + + "\u01E4\u01E5\x07\x11\x02\x02\u01E5\u01E7\x07c\x02\x02\u01E6\u01E2\x03" + "\x02\x02\x02\u01E6\u01E4\x03\x02\x02\x02\u01E7]\x03\x02\x02\x02\u01E8" + "\u01EC\x07\x05\x02\x02\u01E9\u01EB\x05b2\x02\u01EA\u01E9\x03\x02\x02\x02" + "\u01EB\u01EE\x03\x02\x02\x02\u01EC\u01EA\x03\x02\x02\x02\u01EC\u01ED\x03" + "\x02\x02\x02\u01ED\u01EF\x03\x02\x02\x02\u01EE\u01EC\x03\x02\x02\x02\u01EF" + - "\u01F2\x07W\x02\x02\u01F0\u01F1\x07U\x02\x02\u01F1\u01F3\x05,\x17\x02" + + "\u01F2\x07X\x02\x02\u01F0\u01F1\x07V\x02\x02\u01F1\u01F3\x05,\x17\x02" + "\u01F2\u01F0\x03\x02\x02\x02\u01F2\u01F3\x03\x02\x02\x02\u01F3\u01FD\x03" + - "\x02\x02\x02\u01F4\u01F5\x07V\x02\x02\u01F5\u01FA\x05`1\x02\u01F6\u01F7" + + "\x02\x02\x02\u01F4\u01F5\x07W\x02\x02\u01F5\u01FA\x05`1\x02\u01F6\u01F7" + "\x07$\x02\x02\u01F7\u01F9\x05`1\x02\u01F8\u01F6\x03\x02\x02\x02\u01F9" + "\u01FC\x03\x02\x02\x02\u01FA\u01F8\x03\x02\x02\x02\u01FA\u01FB\x03\x02" + "\x02\x02\u01FB\u01FE\x03\x02\x02\x02\u01FC\u01FA\x03\x02\x02\x02\u01FD" + @@ -3138,8 +3139,8 @@ export class esql_parser extends Parser { "\x02\u01FF\u0200\x05,\x17\x02\u0200\u0201\x07#\x02\x02\u0201\u0203\x03" + "\x02\x02\x02\u0202\u01FF\x03\x02\x02\x02\u0202\u0203\x03\x02\x02\x02\u0203" + "\u0204\x03\x02\x02\x02\u0204\u0205\x05,\x17\x02\u0205a\x03\x02\x02\x02" + - "\u0206\u0207\x07A\x02\x02\u0207\u0208\x07g\x02\x02\u0208\u0209\x07f\x02" + - "\x02\u0209\u020A\x07g\x02\x02\u020A\u020B\x07B\x02\x02\u020Bc\x03\x02" + + "\u0206\u0207\x07B\x02\x02\u0207\u0208\x07h\x02\x02\u0208\u0209\x07g\x02" + + "\x02\u0209\u020A\x07h\x02\x02\u020A\u020B\x07C\x02\x02\u020Bc\x03\x02" + "\x02\x026ov\x85\x91\x9A\xA2\xA6\xAE\xB0\xB5\xBC\xC1\xC8\xCE\xD6\xD8\xE2" + "\xEC\xEF\xFB\u0103\u010B\u010F\u0118\u0122\u0126\u012C\u0135\u013D\u0153" + "\u015E\u0169\u016E\u0179\u017E\u0182\u018A\u0193\u0196\u019E\u01A7\u01B2" + @@ -5068,6 +5069,7 @@ export class StringContext extends ParserRuleContext { export class ComparisonOperatorContext extends ParserRuleContext { public EQ(): TerminalNode | undefined { return this.tryGetToken(esql_parser.EQ, 0); } + public CIEQ(): TerminalNode | undefined { return this.tryGetToken(esql_parser.CIEQ, 0); } public NEQ(): TerminalNode | undefined { return this.tryGetToken(esql_parser.NEQ, 0); } public LT(): TerminalNode | undefined { return this.tryGetToken(esql_parser.LT, 0); } public LTE(): TerminalNode | undefined { return this.tryGetToken(esql_parser.LTE, 0); } diff --git a/packages/kbn-monaco/src/esql/lib/ast/ast_helpers.ts b/packages/kbn-monaco/src/esql/lib/ast/ast_helpers.ts index d972b76b1c207..8c9682a24f202 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/ast_helpers.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/ast_helpers.ts @@ -191,15 +191,15 @@ export function computeLocationExtends(fn: ESQLFunction) { /* SCRIPT_MARKER_START */ function getQuotedText(ctx: ParserRuleContext) { - return [66 /* esql_parser.QUOTED_IDENTIFIER */] + return [67 /* esql_parser.QUOTED_IDENTIFIER */] .map((keyCode) => ctx.tryGetToken(keyCode, 0)) .filter(nonNullable)[0]; } function getUnquotedText(ctx: ParserRuleContext) { return [ - 65 /* esql_parser.UNQUOTED_IDENTIFIER */, 71 /* esql_parser.FROM_UNQUOTED_IDENTIFIER */, - 75 /* esql_parser.UNQUOTED_ID_PATTERN */, + 66 /* esql_parser.UNQUOTED_IDENTIFIER */, 72 /* esql_parser.FROM_UNQUOTED_IDENTIFIER */, + 76 /* esql_parser.UNQUOTED_ID_PATTERN */, ] .map((keyCode) => ctx.tryGetToken(keyCode, 0)) .filter(nonNullable)[0]; diff --git a/packages/kbn-monaco/src/esql/lib/ast/ast_walker.ts b/packages/kbn-monaco/src/esql/lib/ast/ast_walker.ts index 7e63d8d0bc9f0..0a5bffa5a3067 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/ast_walker.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/ast_walker.ts @@ -233,6 +233,7 @@ function getMathOperation(ctx: ArithmeticBinaryContext) { function getComparisonName(ctx: ComparisonOperatorContext) { return ( ctx.EQ()?.text || + ctx.CIEQ()?.text || ctx.NEQ()?.text || ctx.LT()?.text || ctx.LTE()?.text || diff --git a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.test.ts b/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.test.ts index 9967b213cffdb..12a1db12392d5 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.test.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.test.ts @@ -349,6 +349,10 @@ describe('autocomplete', () => { ...getFieldNamesByType('string'), ...getFunctionSignaturesByReturnType('where', 'string', { evalMath: true }), ]); + testSuggestions('from a | where stringField =~ ', [ + ...getFieldNamesByType('string'), + ...getFunctionSignaturesByReturnType('where', 'string', { evalMath: true }), + ]); testSuggestions('from a | where stringField >= stringField ', [ ...getFunctionSignaturesByReturnType( 'where', @@ -360,6 +364,17 @@ describe('autocomplete', () => { ), '|', ]); + testSuggestions('from a | where stringField =~ stringField ', [ + ...getFunctionSignaturesByReturnType( + 'where', + 'boolean', + { + builtin: true, + }, + ['boolean'] + ), + '|', + ]); for (const op of ['and', 'or']) { testSuggestions(`from a | where stringField >= stringField ${op} `, [ ...getFieldNamesByType('any'), @@ -615,6 +630,10 @@ describe('autocomplete', () => { ...getFunctionSignaturesByReturnType('eval', 'any', { evalMath: true }), 'a', ]); + testSuggestions('from a | eval a=stringField =~ ', [ + ...getFieldNamesByType('string'), + ...getFunctionSignaturesByReturnType('eval', 'string', { evalMath: true }), + ]); testSuggestions( 'from a | eval a=round()', [ diff --git a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.ts b/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.ts index b4c8d5b72d388..80fdb22ee207a 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.ts @@ -21,11 +21,14 @@ import { isAssignment, isAssignmentComplete, isColumnItem, + isComma, isFunctionItem, isIncompleteItem, isLiteralItem, + isMathFunction, isOptionItem, isRestartingExpression, + isSourceCommand, isSettingItem, isSourceItem, isTimeIntervalItem, @@ -116,17 +119,6 @@ function getFinalSuggestions({ comma }: { comma?: boolean } = { comma: true }) { return finalSuggestions; } -function isMathFunction(char: string) { - return ['+', '-', '*', '/', '%', '='].some((op) => char === op); -} - -function isComma(char: string) { - return char === ','; -} - -function isSourceCommand({ label }: AutocompleteCommandDefinition) { - return ['from', 'row', 'show'].includes(String(label)); -} /** * This function count the number of unclosed brackets in order to * locally fix the queryString to generate a valid AST diff --git a/packages/kbn-monaco/src/esql/lib/ast/definitions/builtin.ts b/packages/kbn-monaco/src/esql/lib/ast/definitions/builtin.ts index e54753c55ec06..8894e221143dd 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/definitions/builtin.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/definitions/builtin.ts @@ -186,6 +186,13 @@ export const builtinFunctions: FunctionDefinition[] = [ }, ].map((op) => createComparisonDefinition(op)), ...[ + // new special comparison operator for strings only + { + name: '=~', + description: i18n.translate('monaco.esql.definition.equalToCaseInsensitiveDoc', { + defaultMessage: 'Case insensitive equality', + }), + }, { name: 'like', description: i18n.translate('monaco.esql.definition.likeDoc', { diff --git a/packages/kbn-monaco/src/esql/lib/ast/shared/helpers.ts b/packages/kbn-monaco/src/esql/lib/ast/shared/helpers.ts index f7dcb9fdb5f1e..0056689b524e9 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/shared/helpers.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/shared/helpers.ts @@ -7,6 +7,7 @@ */ import type { monaco } from '../../../../monaco_imports'; +import { AutocompleteCommandDefinition } from '../autocomplete/types'; import { statsAggregationFunctionDefinitions } from '../definitions/aggs'; import { builtinFunctions } from '../definitions/builtin'; import { commandDefinitions } from '../definitions/commands'; @@ -91,6 +92,23 @@ export function isIncompleteItem(arg: ESQLAstItem): boolean { return !arg || (!Array.isArray(arg) && arg.incomplete); } +export function isMathFunction(char: string) { + // compare last char for all math functions + // limit only to 2 chars operators + return builtinFunctions + .filter(({ name }) => name.length < 3) + .map(({ name }) => name[name.length - 1]) + .some((op) => char === op); +} + +export function isComma(char: string) { + return char === ','; +} + +export function isSourceCommand({ label }: AutocompleteCommandDefinition) { + return ['from', 'row', 'show'].includes(String(label)); +} + // From Monaco position to linear offset export function monacoPositionToOffset(expression: string, position: monaco.Position): number { const lines = expression.split(/\n/); diff --git a/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts b/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts index ce822de4cd186..1f7ea3750b3bd 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts @@ -779,6 +779,30 @@ describe('validation logic', () => { `Argument of [${op}] must be [number], found value [stringField] type [string]`, ]); } + testErrorsAndWarnings(`from a | where numberField =~ 0`, [ + 'Argument of [=~] must be [string], found value [numberField] type [number]', + 'Argument of [=~] must be [string], found value [0] type [number]', + ]); + testErrorsAndWarnings(`from a | where NOT numberField =~ 0`, [ + 'Argument of [=~] must be [string], found value [numberField] type [number]', + 'Argument of [=~] must be [string], found value [0] type [number]', + ]); + testErrorsAndWarnings(`from a | where (numberField =~ 0)`, [ + 'Argument of [=~] must be [string], found value [numberField] type [number]', + 'Argument of [=~] must be [string], found value [0] type [number]', + ]); + testErrorsAndWarnings(`from a | where (NOT (numberField =~ 0))`, [ + 'Argument of [=~] must be [string], found value [numberField] type [number]', + 'Argument of [=~] must be [string], found value [0] type [number]', + ]); + testErrorsAndWarnings(`from a | where 1 =~ 0`, [ + 'Argument of [=~] must be [string], found value [1] type [number]', + 'Argument of [=~] must be [string], found value [0] type [number]', + ]); + testErrorsAndWarnings(`from a | eval stringField =~ 0`, [ + `Argument of [=~] must be [string], found value [0] type [number]`, + ]); + for (const op of ['like', 'rlike']) { testErrorsAndWarnings(`from a | where stringField ${op} "?a"`, []); testErrorsAndWarnings(`from a | where stringField NOT ${op} "?a"`, []); diff --git a/packages/kbn-reporting/common/types.ts b/packages/kbn-reporting/common/types.ts index f977dc49a29c6..92eb444880543 100644 --- a/packages/kbn-reporting/common/types.ts +++ b/packages/kbn-reporting/common/types.ts @@ -55,6 +55,11 @@ export interface ReportOutput extends TaskRunResult { size: number; } +/** + * @see also {@link packages/kbn-reporting/common/types.ts} + */ +export type CsvPagingStrategy = 'pit' | 'scroll'; + /** * @deprecated */ @@ -64,7 +69,7 @@ export interface BaseParams { title: string; version: string; // to handle any state migrations layout?: LayoutParams; // png & pdf only - pagingStrategy?: 'pit' | 'scroll'; // csv only + pagingStrategy?: CsvPagingStrategy; // csv only } /** diff --git a/packages/kbn-reporting/export_types/csv/csv_searchsource.ts b/packages/kbn-reporting/export_types/csv/csv_searchsource.ts index 1fef42332c555..194da9121d804 100644 --- a/packages/kbn-reporting/export_types/csv/csv_searchsource.ts +++ b/packages/kbn-reporting/export_types/csv/csv_searchsource.ts @@ -10,7 +10,7 @@ import { Writable } from 'stream'; import type { DataPluginStart } from '@kbn/data-plugin/server/plugin'; import type { DiscoverServerPluginStart } from '@kbn/discover-plugin/server'; -import { CsvGenerator, type CsvPagingStrategy } from '@kbn/generate-csv'; +import { CsvGenerator } from '@kbn/generate-csv'; import { CancellationToken, LICENSE_TYPE_BASIC, @@ -20,7 +20,7 @@ import { LICENSE_TYPE_PLATINUM, LICENSE_TYPE_TRIAL, } from '@kbn/reporting-common'; -import { TaskInstanceFields } from '@kbn/reporting-common/types'; +import { CsvPagingStrategy, TaskInstanceFields } from '@kbn/reporting-common/types'; import { CSV_JOB_TYPE, CSV_REPORT_TYPE, diff --git a/packages/kbn-reporting/export_types/csv/csv_v2.ts b/packages/kbn-reporting/export_types/csv/csv_v2.ts index b8001f2145405..3bea7f03375bb 100644 --- a/packages/kbn-reporting/export_types/csv/csv_v2.ts +++ b/packages/kbn-reporting/export_types/csv/csv_v2.ts @@ -93,7 +93,10 @@ export class CsvV2ExportType extends ExportType< const locatorClient = await discoverPluginStart.locator.asScopedClient(req); const title = jobParams.title || (await locatorClient.titleFromLocator(params)); - return { ...jobParams, title, objectType: 'search', isDeprecated: false }; + const objectType = 'search' as const; + const pagingStrategy = this.config.csv.scroll.strategy; + + return { ...jobParams, title, objectType, pagingStrategy }; }; public runTask = async ( diff --git a/packages/kbn-reporting/export_types/csv_common/index.ts b/packages/kbn-reporting/export_types/csv_common/index.ts index ec46c66ea3c25..8fc44c476dc0f 100644 --- a/packages/kbn-reporting/export_types/csv_common/index.ts +++ b/packages/kbn-reporting/export_types/csv_common/index.ts @@ -12,6 +12,7 @@ import type { BaseParamsV2, BasePayload, BasePayloadV2, + CsvPagingStrategy, } from '@kbn/reporting-common/types'; export * from './constants'; @@ -41,7 +42,10 @@ interface CsvFromSavedObjectBase { export type JobParamsCsvFromSavedObject = CsvFromSavedObjectBase & Omit & { title?: string }; -export type TaskPayloadCsvFromSavedObject = CsvFromSavedObjectBase & BasePayloadV2; +export interface TaskPayloadCsvFromSavedObject extends CsvFromSavedObjectBase, BasePayloadV2 { + objectType: 'search'; + pagingStrategy: CsvPagingStrategy; +} export const CSV_REPORTING_ACTION = 'downloadCsvReport'; diff --git a/packages/kbn-reporting/server/export_type.ts b/packages/kbn-reporting/server/export_type.ts index 7765fe6dd7e26..fcb5c98053fa6 100644 --- a/packages/kbn-reporting/server/export_type.ts +++ b/packages/kbn-reporting/server/export_type.ts @@ -55,7 +55,7 @@ export abstract class ExportType< abstract jobContentEncoding?: 'base64' | 'csv'; abstract jobContentExtension: 'pdf' | 'png' | 'csv'; - abstract createJob: CreateJobFn; + abstract createJob: CreateJobFn; abstract runTask: RunTaskFn; abstract validLicenses: LicenseType[]; diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/common/list_operator/index.ts b/packages/kbn-securitysolution-io-ts-list-types/src/common/list_operator/index.ts index 396577d46cd72..6190c36c7396d 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/src/common/list_operator/index.ts +++ b/packages/kbn-securitysolution-io-ts-list-types/src/common/list_operator/index.ts @@ -15,6 +15,15 @@ export enum ListOperatorEnum { EXCLUDED = 'excluded', } +export const listOperatorType = t.keyof({ + nested: null, + match: null, + match_any: null, + wildcard: null, + exists: null, + list: null, +}); +export type ListOperatorType = t.TypeOf; export enum ListOperatorTypeEnum { NESTED = 'nested', MATCH = 'match', diff --git a/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.tsx b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.tsx index 60479eeb6e647..2147df7af05ac 100644 --- a/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.tsx +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.tsx @@ -339,7 +339,7 @@ export const UnifiedFieldListSidebarComponent: React.FC = { + const buttonAddFieldCommonProps: Partial> = { size: 's', iconType: 'indexOpen', 'data-test-subj': diff --git a/packages/presentation/presentation_publishing/interfaces/has_type.ts b/packages/presentation/presentation_publishing/interfaces/has_type.ts index b608dd4ed2ba6..4957ce520a0f5 100644 --- a/packages/presentation/presentation_publishing/interfaces/has_type.ts +++ b/packages/presentation/presentation_publishing/interfaces/has_type.ts @@ -21,7 +21,7 @@ export const apiHasType = (api: unknown | null): api is HasType => { export const apiIsOfType = ( api: unknown | null, - typeToCheck: string + typeToCheck: T ): api is HasType => { return Boolean(api && (api as HasType).type) && (api as HasType).type === typeToCheck; }; diff --git a/renovate.json b/renovate.json index 7fb5b9020388c..10289de37facd 100644 --- a/renovate.json +++ b/renovate.json @@ -544,7 +544,6 @@ "team:kibana-presentation", "team:kibana-data-discovery", "team:platform-deployment-management", - "team:infra-monitoring-ui", "team:kibana-gis", "team:security-solution" ], @@ -644,13 +643,13 @@ "@xstate/" ], "reviewers": [ - "team:infra-monitoring-ui" + "team:obs-ux-logs" ], "matchBaseBranches": [ "main" ], "labels": [ - "Team:Infra Monitoring UI", + "Team:Obs UX Logs", "release_note:skip" ], "enabled": true, @@ -662,13 +661,13 @@ "@opentelemetry/" ], "reviewers": [ - "team:infra-monitoring-ui" + "team:monitoring" ], "matchBaseBranches": [ "main" ], "labels": [ - "Team:Infra Monitoring UI" + "Team:Monitoring" ], "enabled": true } diff --git a/src/dev/build/tasks/os_packages/package_scripts/post_install.sh b/src/dev/build/tasks/os_packages/package_scripts/post_install.sh index bdc51d09a2aa5..1a8e27704c53c 100644 --- a/src/dev/build/tasks/os_packages/package_scripts/post_install.sh +++ b/src/dev/build/tasks/os_packages/package_scripts/post_install.sh @@ -84,7 +84,7 @@ case $1 in if [ "$1" = "2" ]; then IS_UPGRADE=true fi - + PACKAGE=rpm setup ;; @@ -115,6 +115,5 @@ if [ "$PACKAGE" = "deb" ]; then /usr/share/kibana/bin/kibana-keystore create chown root:<%= group %> "${KBN_PATH_CONF}"/kibana.keystore chmod 660 "${KBN_PATH_CONF}"/kibana.keystore - md5sum "${KBN_PATH_CONF}"/kibana.keystore > "${KBN_PATH_CONF}"/.kibana.keystore.initial_md5sum fi fi diff --git a/src/dev/build/tasks/os_packages/package_scripts/post_remove.sh b/src/dev/build/tasks/os_packages/package_scripts/post_remove.sh index 7e587e26ffa9e..65ebdf0174452 100644 --- a/src/dev/build/tasks/os_packages/package_scripts/post_remove.sh +++ b/src/dev/build/tasks/os_packages/package_scripts/post_remove.sh @@ -3,6 +3,7 @@ set -e REMOVE_DIRS=false REMOVE_USER_AND_GROUP=false +REMOVE_KEYSTORE=false case $1 in # Includes cases for all valid arguments, exit 1 otherwise @@ -10,6 +11,7 @@ case $1 in purge) REMOVE_DIRS=true REMOVE_USER_AND_GROUP=true + REMOVE_KEYSTORE=true ;; remove) REMOVE_DIRS=true @@ -21,6 +23,7 @@ case $1 in # Red Hat 0) REMOVE_USER_AND_GROUP=true + REMOVE_KEYSTORE=true REMOVE_DIRS=true ;; @@ -53,6 +56,14 @@ if [ "$REMOVE_DIRS" = "true" ]; then echo " OK" fi + if [ "$REMOVE_KEYSTORE" = "true" ]; then + if [ -e "<%= configDir %>/kibana.keystore" ]; then + echo -n "Deleting kibana.keystore..." + rm -f "<%= configDir %>/kibana.keystore" + echo "OK" + fi + fi + if [ -d "<%= configDir %>" ]; then rmdir --ignore-fail-on-non-empty "<%= configDir %>" fi diff --git a/src/dev/build/tasks/os_packages/package_scripts/post_trans.sh b/src/dev/build/tasks/os_packages/package_scripts/post_trans.sh index 3c1bd3ccf88b4..ea9289983543f 100644 --- a/src/dev/build/tasks/os_packages/package_scripts/post_trans.sh +++ b/src/dev/build/tasks/os_packages/package_scripts/post_trans.sh @@ -4,5 +4,4 @@ if [ ! -f "${KBN_PATH_CONF}"/kibana.keystore ]; then /usr/share/kibana/bin/kibana-keystore create chown root:<%= group %> "${KBN_PATH_CONF}"/kibana.keystore chmod 660 "${KBN_PATH_CONF}"/kibana.keystore - md5sum "${KBN_PATH_CONF}"/kibana.keystore > "${KBN_PATH_CONF}"/.kibana.keystore.initial_md5sum fi diff --git a/src/dev/license_checker/config.ts b/src/dev/license_checker/config.ts index e171747874c2e..436fc25abf955 100644 --- a/src/dev/license_checker/config.ts +++ b/src/dev/license_checker/config.ts @@ -85,7 +85,7 @@ export const LICENSE_OVERRIDES = { 'jsts@1.6.2': ['Eclipse Distribution License - v 1.0'], // cf. https://github.com/bjornharrtell/jsts '@mapbox/jsonlint-lines-primitives@2.0.2': ['MIT'], // license in readme https://github.com/tmcw/jsonlint '@elastic/ems-client@8.5.1': ['Elastic License 2.0'], - '@elastic/eui@92.1.1': ['SSPL-1.0 OR Elastic License 2.0'], + '@elastic/eui@92.2.1': ['SSPL-1.0 OR Elastic License 2.0'], 'language-subtag-registry@0.3.21': ['CC-BY-4.0'], // retired ODC‑By license https://github.com/mattcg/language-subtag-registry 'buffers@0.1.1': ['MIT'], // license in importing module https://www.npmjs.com/package/binary '@bufbuild/protobuf@1.2.1': ['Apache-2.0'], // license (Apache-2.0 AND BSD-3-Clause) diff --git a/src/dev/prs/kibana_qa_pr_list.json b/src/dev/prs/kibana_qa_pr_list.json index 7e040aaeb61fd..a6e5b9a4f933f 100644 --- a/src/dev/prs/kibana_qa_pr_list.json +++ b/src/dev/prs/kibana_qa_pr_list.json @@ -40,7 +40,6 @@ "Team:Endpoint Response", "Team:EnterpriseSearch", "Team:Fleet", -"Team:Infra Monitoring UI", "Team:Ingest Management", "Team:Observability", "Team:Unified observability", diff --git a/src/plugins/advanced_settings/README.md b/src/plugins/advanced_settings/README.md index a364348a8e99a..5403974bfe686 100644 --- a/src/plugins/advanced_settings/README.md +++ b/src/plugins/advanced_settings/README.md @@ -1,5 +1,5 @@ # Advanced Settings -This plugin contains the advanced settings management section +This plugin registers the [management settings application](packages/kbn-management/settings/application/application.tsx) allowing users to configure their advanced settings, also known as uiSettings within the code. \ No newline at end of file diff --git a/src/plugins/advanced_settings/jest.config.js b/src/plugins/advanced_settings/jest.config.js deleted file mode 100644 index 7900d7f39b6c6..0000000000000 --- a/src/plugins/advanced_settings/jest.config.js +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -module.exports = { - preset: '@kbn/test', - rootDir: '../../..', - roots: ['/src/plugins/advanced_settings'], - coverageDirectory: '/target/kibana-coverage/jest/src/plugins/advanced_settings', - coverageReporters: ['text', 'html'], - collectCoverageFrom: ['/src/plugins/advanced_settings/{public,server}/**/*.{ts,tsx}'], -}; diff --git a/src/plugins/advanced_settings/kibana.jsonc b/src/plugins/advanced_settings/kibana.jsonc index c0106e24c50f4..1997baa90d97a 100644 --- a/src/plugins/advanced_settings/kibana.jsonc +++ b/src/plugins/advanced_settings/kibana.jsonc @@ -14,8 +14,6 @@ "usageCollection" ], "requiredBundles": [ - "kibanaReact", - "kibanaUtils" ] } -} \ No newline at end of file +} diff --git a/src/plugins/advanced_settings/public/index.ts b/src/plugins/advanced_settings/public/index.ts index e07c1aa1d72d1..46608b9d94509 100644 --- a/src/plugins/advanced_settings/public/index.ts +++ b/src/plugins/advanced_settings/public/index.ts @@ -6,23 +6,10 @@ * Side Public License, v 1. */ -import React from 'react'; import { PluginInitializerContext } from '@kbn/core/public'; import { AdvancedSettingsPlugin } from './plugin'; export type { AdvancedSettingsSetup, AdvancedSettingsStart } from './types'; -/** - * Exports the field component as a React.lazy component. We're explicitly naming it lazy here - * so any plugin that would import that can clearly see it's lazy loaded and can only be used - * inside a suspense context. - */ -const LazyField = React.lazy(() => import('./management_app/components/field')); -export { LazyField }; - -export { toEditableConfig } from './management_app/lib/to_editable_config'; - export function plugin(initializerContext: PluginInitializerContext) { return new AdvancedSettingsPlugin(); } - -export type { FieldState } from './management_app/types'; diff --git a/src/plugins/advanced_settings/public/management_app/_advanced_settings.scss b/src/plugins/advanced_settings/public/management_app/_advanced_settings.scss deleted file mode 100644 index a5f7e774f9abe..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/_advanced_settings.scss +++ /dev/null @@ -1,43 +0,0 @@ -.mgtAdvancedSettings__field { - + * { - margin-top: $euiSize; - } - - .mgtAdvancedSettings__fieldTitle { - padding-left: $euiSizeS; - margin-left: -$euiSizeS; - } - - &--unsaved .mgtAdvancedSettings__fieldTitle { - // Simulates a left side border without shifting content - box-shadow: -$euiSizeXS 0 $euiColorWarning; - } - &--invalid .mgtAdvancedSettings__fieldTitle { - // Simulates a left side border without shifting content - box-shadow: -$euiSizeXS 0 $euiColorDanger; - } -} - -.mgtAdvancedSettings__fieldTitleUnsavedIcon { - margin-left: $euiSizeS; -} - -.mgtAdvancedSettingsForm__unsavedCount { - @include euiBreakpoint('xs') { - display: none; - } -} - -.mgtAdvancedSettingsForm__unsavedCountMessage { - // Simulates a left side border without shifting content - box-shadow: -$euiSizeXS 0 $euiColorWarning; - padding-left: $euiSizeS; -} - -.mgtAdvancedSettingsForm__button { - width: 100%; -} - -.kbnBody--mgtAdvancedSettingsHasBottomBar .mgtPage__body { - padding-bottom: $euiSizeXL * 2; -} diff --git a/src/plugins/advanced_settings/public/management_app/advanced_settings.tsx b/src/plugins/advanced_settings/public/management_app/advanced_settings.tsx deleted file mode 100644 index 347a04b2df81a..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/advanced_settings.tsx +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React, { Component } from 'react'; - -import { UiCounterMetricType } from '@kbn/analytics'; - -import { DocLinksStart, ToastsStart, ThemeServiceStart } from '@kbn/core/public'; - -import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; -import { EuiCallOut, EuiSpacer } from '@elastic/eui'; -import { IUiSettingsClient, SettingsStart } from '@kbn/core-ui-settings-browser'; -import { AdvancedSettingsVoiceAnnouncement } from './components/advanced_settings_voice_announcement'; -import { Form } from './components/form'; - -import { FieldSetting, SettingsChanges } from './types'; - -export const QUERY = 'query'; - -interface AdvancedSettingsProps { - enableSaving: boolean; - settingsService: SettingsStart; - /** TODO: remove once use_ui_setting is changed to use the settings service - * https://github.com/elastic/kibana/issues/149347 */ - uiSettingsClient: IUiSettingsClient; - docLinks: DocLinksStart['links']; - toasts: ToastsStart; - theme: ThemeServiceStart['theme$']; - trackUiMetric?: (metricType: UiCounterMetricType, eventName: string | string[]) => void; - groupedSettings: GroupedSettings; - categoryCounts: Record; - categories: string[]; - visibleSettings: Record; - noResults: boolean; - clearQuery: () => void; - queryText: string; - callOutTitle: string; - callOutSubtitle: string; -} - -type GroupedSettings = Record; - -export class AdvancedSettings extends Component { - constructor(props: AdvancedSettingsProps) { - super(props); - } - - saveConfig = async (changes: SettingsChanges) => { - const arr = Object.entries(changes).map(([key, value]) => - this.props.uiSettingsClient.set(key, value) - ); - return Promise.all(arr); - }; - - render() { - return ( -
- - -

{this.props.callOutSubtitle}

-
- - - - - - -
- ); - } -} diff --git a/src/plugins/advanced_settings/public/management_app/components/advanced_settings_voice_announcement/__snapshots__/advanced_settings_voice_announcement.test.tsx.snap b/src/plugins/advanced_settings/public/management_app/components/advanced_settings_voice_announcement/__snapshots__/advanced_settings_voice_announcement.test.tsx.snap deleted file mode 100644 index 82c8dcd7f7ea1..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/components/advanced_settings_voice_announcement/__snapshots__/advanced_settings_voice_announcement.test.tsx.snap +++ /dev/null @@ -1,52 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Advanced Settings: Voice Announcement should render announcement 1`] = ` - -
- - - -
-
-`; - -exports[`Advanced Settings: Voice Announcement should render nothing 1`] = ` - -
- - - -
-
-`; diff --git a/src/plugins/advanced_settings/public/management_app/components/advanced_settings_voice_announcement/advanced_settings_voice_announcement.test.tsx b/src/plugins/advanced_settings/public/management_app/components/advanced_settings_voice_announcement/advanced_settings_voice_announcement.test.tsx deleted file mode 100644 index cb206b0f6dc55..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/components/advanced_settings_voice_announcement/advanced_settings_voice_announcement.test.tsx +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React from 'react'; -import { shallow } from 'enzyme'; -import { UiSettingsType } from '@kbn/core/public'; - -import { AdvancedSettingsVoiceAnnouncement } from './advanced_settings_voice_announcement'; - -const settingPartial = { - name: 'name', - isOverridden: false, - type: 'string' as UiSettingsType, - value: 'value', - defVal: 'defVal', - optionLabels: { label: 'label' }, - description: 'description', - displayName: 'displayName', - isCustom: false, - requiresPageReload: false, - options: [], - validation: { regex: /a/, message: 'message' }, - category: ['category'], - readOnly: false, -}; - -const testProps = { - nothing: { - query: '', - filteredSettings: [ - { - ariaName: 'General', - ...settingPartial, - }, - ], - }, - searchResult: { - query: 'dark theme', - filteredSettings: [ - { - ariaName: 'General', - ...settingPartial, - }, - ], - }, -}; - -describe('Advanced Settings: Voice Announcement', () => { - it('should render nothing', async () => { - const { query, filteredSettings } = testProps.nothing; - - const component = shallow( - - ); - - expect(component).toMatchSnapshot(); - }); - - it('should render announcement', async () => { - const { query, filteredSettings } = testProps.searchResult; - - const component = shallow( - - ); - - expect(component).toMatchSnapshot(); - }); -}); diff --git a/src/plugins/advanced_settings/public/management_app/components/advanced_settings_voice_announcement/advanced_settings_voice_announcement.tsx b/src/plugins/advanced_settings/public/management_app/components/advanced_settings_voice_announcement/advanced_settings_voice_announcement.tsx deleted file mode 100644 index 4f8165f527f9c..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/components/advanced_settings_voice_announcement/advanced_settings_voice_announcement.tsx +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -/* - This component aims to insert assertive live region on the page, - to make sure that a screen reader announces layout changes. - - Due to the fact that it has a specific way of detecting what-and-when announce - as well as delay of announcement (which depends on what a user is doing at the moment) - I place a 500ms delay of re-render the text of anouncement. - That time period is best fits the time of screen reader reaction. - That anouncement depends on what user is typying into search box as well as - the speed of ordinary screen reader pronouns what user is typing before start reading this anouncement. - - The order of triggering functions: - 1: React trigs the component to be updated - 2: It places a timer and block render - 3: The time is over - 4: Component renders - - 5: If there is another component call, the timer is dropped (cleared). - */ - -import React, { Component } from 'react'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { EuiScreenReaderOnly, EuiDelayRender } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import { FieldSetting } from '../../types'; - -interface Props { - queryText: string; - settings: Record; -} - -export class AdvancedSettingsVoiceAnnouncement extends Component { - shouldComponentUpdate = (nextProps: Props) => { - /* - If a user typed smth new, we should clear the previous timer - and start another one + block component rendering. - - When it is reset and delaying is over as well as no new string came, - it's ready to be rendered. - */ - return nextProps.queryText !== this.props.queryText; - }; - - render() { - const filteredSections = Object.values(this.props.settings).map((setting) => - setting.map((option) => option.ariaName) - ); - const filteredOptions = [...filteredSections]; - return ( - -
- - {this.props.queryText ? ( - - ) : ( - - )} - -
-
- ); - } -} diff --git a/src/plugins/advanced_settings/public/management_app/components/advanced_settings_voice_announcement/index.ts b/src/plugins/advanced_settings/public/management_app/components/advanced_settings_voice_announcement/index.ts deleted file mode 100644 index c5cefbc271188..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/components/advanced_settings_voice_announcement/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -export { AdvancedSettingsVoiceAnnouncement } from './advanced_settings_voice_announcement'; diff --git a/src/plugins/advanced_settings/public/management_app/components/call_outs/__snapshots__/call_outs.test.tsx.snap b/src/plugins/advanced_settings/public/management_app/components/call_outs/__snapshots__/call_outs.test.tsx.snap deleted file mode 100644 index 7da96ad98f1bf..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/components/call_outs/__snapshots__/call_outs.test.tsx.snap +++ /dev/null @@ -1,25 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`CallOuts should render normally 1`] = ` -
- - } - > -

- -

-
-
-`; diff --git a/src/plugins/advanced_settings/public/management_app/components/call_outs/call_outs.tsx b/src/plugins/advanced_settings/public/management_app/components/call_outs/call_outs.tsx deleted file mode 100644 index dabf44e2ba948..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/components/call_outs/call_outs.tsx +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React from 'react'; - -import { EuiCallOut } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n-react'; - -export const CallOuts = () => { - return ( -
- - } - color="warning" - iconType="bolt" - > -

- -

-
-
- ); -}; diff --git a/src/plugins/advanced_settings/public/management_app/components/call_outs/index.ts b/src/plugins/advanced_settings/public/management_app/components/call_outs/index.ts deleted file mode 100644 index 7e04d5d370530..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/components/call_outs/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -export { CallOuts } from './call_outs'; diff --git a/src/plugins/advanced_settings/public/management_app/components/field/__snapshots__/field.test.tsx.snap b/src/plugins/advanced_settings/public/management_app/components/field/__snapshots__/field.test.tsx.snap deleted file mode 100644 index dc5c969c42749..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/components/field/__snapshots__/field.test.tsx.snap +++ /dev/null @@ -1,4480 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Field for array setting should render as read only if saving is disabled 1`] = ` - -
- - } - fullWidth={true} - id="array:test:setting-group" - title={ -

- - Array test setting - - - -

- } -> - - - - -`; - -exports[`Field for array setting should render as read only with help text if overridden 1`] = ` - -
- - - - - - default_value - , - } - } - /> - - - - - } - fullWidth={true} - id="array:test:setting-group" - title={ -

- - Array test setting - - - -

- } -> - - - - } - label="array:test:setting" - labelType="label" - > - - - -`; - -exports[`Field for array setting should render custom setting icon if it is custom 1`] = ` - -
- - } - fullWidth={true} - id="array:test:setting-group" - title={ -

- - Array test setting - - - } - type="asterisk" - /> - -

- } -> - - - - -`; - -exports[`Field for array setting should render default value if there is no user value set 1`] = ` - -
- - } - fullWidth={true} - id="array:test:setting-group" - title={ -

- - Array test setting - - - -

- } -> - - - - -`; - -exports[`Field for array setting should render unsaved value if there are unsaved changes 1`] = ` - -
- - } - fullWidth={true} - id="array:test:setting-group" - title={ -

- - Array test setting - - - } - type="asterisk" - /> - -

- } -> - - - -

- Setting is currently not saved. -

-
-
- -`; - -exports[`Field for array setting should render user value if there is user value is set 1`] = ` - -
- - - - - - default_value - , - } - } - /> - - - - - } - fullWidth={true} - id="array:test:setting-group" - title={ -

- - Array test setting - - - -

- } -> - - - - - -     - - - } - label="array:test:setting" - labelType="label" - > - - - -`; - -exports[`Field for boolean setting should render as read only if saving is disabled 1`] = ` - -
- - } - fullWidth={true} - id="boolean:test:setting-group" - title={ -

- - Boolean test setting - - - -

- } -> - - - } - onChange={[Function]} - /> - - -`; - -exports[`Field for boolean setting should render as read only with help text if overridden 1`] = ` - -
- - - - - - true - , - } - } - /> - - - - - } - fullWidth={true} - id="boolean:test:setting-group" - title={ -

- - Boolean test setting - - - -

- } -> - - - - } - label="boolean:test:setting" - labelType="label" - > - - } - onChange={[Function]} - /> - - -`; - -exports[`Field for boolean setting should render custom setting icon if it is custom 1`] = ` - -
- - } - fullWidth={true} - id="boolean:test:setting-group" - title={ -

- - Boolean test setting - - - } - type="asterisk" - /> - -

- } -> - - - } - onChange={[Function]} - /> - - -`; - -exports[`Field for boolean setting should render default value if there is no user value set 1`] = ` - -
- - } - fullWidth={true} - id="boolean:test:setting-group" - title={ -

- - Boolean test setting - - - -

- } -> - - - } - onChange={[Function]} - /> - - -`; - -exports[`Field for boolean setting should render unsaved value if there are unsaved changes 1`] = ` - -
- - } - fullWidth={true} - id="boolean:test:setting-group" - title={ -

- - Boolean test setting - - - } - type="asterisk" - /> - -

- } -> - - - } - onChange={[Function]} - /> - -

- Setting is currently not saved. -

-
-
- -`; - -exports[`Field for boolean setting should render user value if there is user value is set 1`] = ` - -
- - - - - - true - , - } - } - /> - - - - - } - fullWidth={true} - id="boolean:test:setting-group" - title={ -

- - Boolean test setting - - - -

- } -> - - - - - -     - - - } - label="boolean:test:setting" - labelType="label" - > - - } - onChange={[Function]} - /> - - -`; - -exports[`Field for color setting should render as read only if saving is disabled 1`] = ` - -
- - } - fullWidth={true} - id="color:test:setting-group" - title={ -

- - Color test setting - - - -

- } -> - - - - -`; - -exports[`Field for color setting should render as read only with help text if overridden 1`] = ` - -
- - - - - - null - , - } - } - /> - - - - - } - fullWidth={true} - id="color:test:setting-group" - title={ -

- - Color test setting - - - -

- } -> - - - - } - label="color:test:setting" - labelType="label" - > - - - -`; - -exports[`Field for color setting should render custom setting icon if it is custom 1`] = ` - -
- - } - fullWidth={true} - id="color:test:setting-group" - title={ -

- - Color test setting - - - } - type="asterisk" - /> - -

- } -> - - - - -`; - -exports[`Field for color setting should render default value if there is no user value set 1`] = ` - -
- - } - fullWidth={true} - id="color:test:setting-group" - title={ -

- - Color test setting - - - -

- } -> - - - - -`; - -exports[`Field for color setting should render unsaved value if there are unsaved changes 1`] = ` - -
- - } - fullWidth={true} - id="color:test:setting-group" - title={ -

- - Color test setting - - - } - type="asterisk" - /> - -

- } -> - - - -

- Setting is currently not saved. -

-
-
- -`; - -exports[`Field for color setting should render user value if there is user value is set 1`] = ` - -
- - - - - - null - , - } - } - /> - - - - - } - fullWidth={true} - id="color:test:setting-group" - title={ -

- - Color test setting - - - -

- } -> - - - - - -     - - - } - label="color:test:setting" - labelType="label" - > - - - -`; - -exports[`Field for image setting should render as read only if saving is disabled 1`] = ` - -
- - } - fullWidth={true} - id="image:test:setting-group" - title={ -

- - Image test setting - - - -

- } -> - - - } - onChange={[Function]} - /> - - -`; - -exports[`Field for image setting should render as read only with help text if overridden 1`] = ` - -
- - - - - - null - , - } - } - /> - - - - - } - fullWidth={true} - id="image:test:setting-group" - title={ -

- - Image test setting - - - -

- } -> - - - - } - label="image:test:setting" - labelType="label" - > - - - -`; - -exports[`Field for image setting should render custom setting icon if it is custom 1`] = ` - -
- - } - fullWidth={true} - id="image:test:setting-group" - title={ -

- - Image test setting - - - } - type="asterisk" - /> - -

- } -> - - - } - onChange={[Function]} - /> - - -`; - -exports[`Field for image setting should render default value if there is no user value set 1`] = ` - -
- - } - fullWidth={true} - id="image:test:setting-group" - title={ -

- - Image test setting - - - -

- } -> - - - } - onChange={[Function]} - /> - - -`; - -exports[`Field for image setting should render unsaved value if there are unsaved changes 1`] = ` - -
- - } - fullWidth={true} - id="image:test:setting-group" - title={ -

- - Image test setting - - - } - type="asterisk" - /> - -

- } -> - - - } - onChange={[Function]} - /> - -

- Setting is currently not saved. -

-
-
- -`; - -exports[`Field for image setting should render user value if there is user value is set 1`] = ` - -
- - - - - - null - , - } - } - /> - - - - - } - fullWidth={true} - id="image:test:setting-group" - title={ -

- - Image test setting - - - -

- } -> - - - - - -     - - - - - - - - } - label="image:test:setting" - labelType="label" - > - - - -`; - -exports[`Field for json setting should render as read only if saving is disabled 1`] = ` - -
- - - - - - {} - , - } - } - /> - - - - - } - fullWidth={true} - id="json:test:setting-group" - title={ -

- - Json test setting - - - -

- } -> - -
- -
-
- -`; - -exports[`Field for json setting should render as read only with help text if overridden 1`] = ` - -
- - - - - - {} - , - } - } - /> - - - - - } - fullWidth={true} - id="json:test:setting-group" - title={ -

- - Json test setting - - - -

- } -> - - - - } - label="json:test:setting" - labelType="label" - > -
- -
-
- -`; - -exports[`Field for json setting should render custom setting icon if it is custom 1`] = ` - -
- - } - fullWidth={true} - id="json:test:setting-group" - title={ -

- - Json test setting - - - } - type="asterisk" - /> - -

- } -> - -
- -
-
- -`; - -exports[`Field for json setting should render default value if there is no user value set 1`] = ` - -
- - - - - - {} - , - } - } - /> - - - - - } - fullWidth={true} - id="json:test:setting-group" - title={ -

- - Json test setting - - - -

- } -> - - - - - -     - - - } - label="json:test:setting" - labelType="label" - > -
- -
-
- -`; - -exports[`Field for json setting should render unsaved value if there are unsaved changes 1`] = ` - -
- - } - fullWidth={true} - id="json:test:setting-group" - title={ -

- - Json test setting - - - } - type="asterisk" - /> - -

- } -> - -
- -
- -

- Setting is currently not saved. -

-
-
- -`; - -exports[`Field for json setting should render user value if there is user value is set 1`] = ` - -
- - - - - - {} - , - } - } - /> - - - - - } - fullWidth={true} - id="json:test:setting-group" - title={ -

- - Json test setting - - - -

- } -> - - - - - -     - - - } - label="json:test:setting" - labelType="label" - > -
- -
-
- -`; - -exports[`Field for markdown setting should render as read only if saving is disabled 1`] = ` - -
- - } - fullWidth={true} - id="markdown:test:setting-group" - title={ -

- - Markdown test setting - - - -

- } -> - -
- -
-
- -`; - -exports[`Field for markdown setting should render as read only with help text if overridden 1`] = ` - -
- - - - - - null - , - } - } - /> - - - - - } - fullWidth={true} - id="markdown:test:setting-group" - title={ -

- - Markdown test setting - - - -

- } -> - - - - } - label="markdown:test:setting" - labelType="label" - > -
- -
-
- -`; - -exports[`Field for markdown setting should render custom setting icon if it is custom 1`] = ` - -
- - } - fullWidth={true} - id="markdown:test:setting-group" - title={ -

- - Markdown test setting - - - } - type="asterisk" - /> - -

- } -> - -
- -
-
- -`; - -exports[`Field for markdown setting should render default value if there is no user value set 1`] = ` - -
- - } - fullWidth={true} - id="markdown:test:setting-group" - title={ -

- - Markdown test setting - - - -

- } -> - -
- -
-
- -`; - -exports[`Field for markdown setting should render unsaved value if there are unsaved changes 1`] = ` - -
- - } - fullWidth={true} - id="markdown:test:setting-group" - title={ -

- - Markdown test setting - - - } - type="asterisk" - /> - -

- } -> - -
- -
- -

- Setting is currently not saved. -

-
-
- -`; - -exports[`Field for markdown setting should render user value if there is user value is set 1`] = ` - -
- - - - - - null - , - } - } - /> - - - - - } - fullWidth={true} - id="markdown:test:setting-group" - title={ -

- - Markdown test setting - - - -

- } -> - - - - - -     - - - } - label="markdown:test:setting" - labelType="label" - > -
- -
-
- -`; - -exports[`Field for number setting should render as read only if saving is disabled 1`] = ` - -
- - } - fullWidth={true} - id="number:test:setting-group" - title={ -

- - Number test setting - - - -

- } -> - - - - -`; - -exports[`Field for number setting should render as read only with help text if overridden 1`] = ` - -
- - - - - - 5 - , - } - } - /> - - - - - } - fullWidth={true} - id="number:test:setting-group" - title={ -

- - Number test setting - - - -

- } -> - - - - } - label="number:test:setting" - labelType="label" - > - - - -`; - -exports[`Field for number setting should render custom setting icon if it is custom 1`] = ` - -
- - } - fullWidth={true} - id="number:test:setting-group" - title={ -

- - Number test setting - - - } - type="asterisk" - /> - -

- } -> - - - - -`; - -exports[`Field for number setting should render default value if there is no user value set 1`] = ` - -
- - } - fullWidth={true} - id="number:test:setting-group" - title={ -

- - Number test setting - - - -

- } -> - - - - -`; - -exports[`Field for number setting should render unsaved value if there are unsaved changes 1`] = ` - -
- - } - fullWidth={true} - id="number:test:setting-group" - title={ -

- - Number test setting - - - } - type="asterisk" - /> - -

- } -> - - - -

- Setting is currently not saved. -

-
-
- -`; - -exports[`Field for number setting should render user value if there is user value is set 1`] = ` - -
- - - - - - 5 - , - } - } - /> - - - - - } - fullWidth={true} - id="number:test:setting-group" - title={ -

- - Number test setting - - - -

- } -> - - - - - -     - - - } - label="number:test:setting" - labelType="label" - > - - - -`; - -exports[`Field for select setting should render as read only if saving is disabled 1`] = ` - -
- - } - fullWidth={true} - id="select:test:setting-group" - title={ -

- - Select test setting - - - -

- } -> - - - - -`; - -exports[`Field for select setting should render as read only with help text if overridden 1`] = ` - -
- - - - - - Orange - , - } - } - /> - - - - - } - fullWidth={true} - id="select:test:setting-group" - title={ -

- - Select test setting - - - -

- } -> - - - - } - label="select:test:setting" - labelType="label" - > - - - -`; - -exports[`Field for select setting should render custom setting icon if it is custom 1`] = ` - -
- - } - fullWidth={true} - id="select:test:setting-group" - title={ -

- - Select test setting - - - } - type="asterisk" - /> - -

- } -> - - - - -`; - -exports[`Field for select setting should render default value if there is no user value set 1`] = ` - -
- - } - fullWidth={true} - id="select:test:setting-group" - title={ -

- - Select test setting - - - -

- } -> - - - - -`; - -exports[`Field for select setting should render unsaved value if there are unsaved changes 1`] = ` - -
- - } - fullWidth={true} - id="select:test:setting-group" - title={ -

- - Select test setting - - - } - type="asterisk" - /> - -

- } -> - - - -

- Setting is currently not saved. -

-
-
- -`; - -exports[`Field for select setting should render user value if there is user value is set 1`] = ` - -
- - - - - - Orange - , - } - } - /> - - - - - } - fullWidth={true} - id="select:test:setting-group" - title={ -

- - Select test setting - - - -

- } -> - - - - - -     - - - } - label="select:test:setting" - labelType="label" - > - - - -`; - -exports[`Field for string setting should render as read only if saving is disabled 1`] = ` - -
- - } - fullWidth={true} - id="string:test:setting-group" - title={ -

- - String test setting - - - -

- } -> - - - - -`; - -exports[`Field for string setting should render as read only with help text if overridden 1`] = ` - -
- - - - - - null - , - } - } - /> - - - - - } - fullWidth={true} - id="string:test:setting-group" - title={ -

- - String test setting - - - -

- } -> - - - - } - label="string:test:setting" - labelType="label" - > - - - -`; - -exports[`Field for string setting should render custom setting icon if it is custom 1`] = ` - -
- - } - fullWidth={true} - id="string:test:setting-group" - title={ -

- - String test setting - - - } - type="asterisk" - /> - -

- } -> - - - - -`; - -exports[`Field for string setting should render default value if there is no user value set 1`] = ` - -
- - } - fullWidth={true} - id="string:test:setting-group" - title={ -

- - String test setting - - - -

- } -> - - - - -`; - -exports[`Field for string setting should render unsaved value if there are unsaved changes 1`] = ` - -
- - } - fullWidth={true} - id="string:test:setting-group" - title={ -

- - String test setting - - - } - type="asterisk" - /> - -

- } -> - - - -

- Setting is currently not saved. -

-
-
- -`; - -exports[`Field for string setting should render user value if there is user value is set 1`] = ` - -
- - - - - - null - , - } - } - /> - - - - - } - fullWidth={true} - id="string:test:setting-group" - title={ -

- - String test setting - - - -

- } -> - - - - - -     - - - } - label="string:test:setting" - labelType="label" - > - - - -`; - -exports[`Field for stringWithValidation setting should render as read only if saving is disabled 1`] = ` - -
- - } - fullWidth={true} - id="string:test-validation:setting-group" - title={ -

- - String test validation setting - - - -

- } -> - - - - -`; - -exports[`Field for stringWithValidation setting should render as read only with help text if overridden 1`] = ` - -
- - - - - - foo-default - , - } - } - /> - - - - - } - fullWidth={true} - id="string:test-validation:setting-group" - title={ -

- - String test validation setting - - - -

- } -> - - - - } - label="string:test-validation:setting" - labelType="label" - > - - - -`; - -exports[`Field for stringWithValidation setting should render custom setting icon if it is custom 1`] = ` - -
- - } - fullWidth={true} - id="string:test-validation:setting-group" - title={ -

- - String test validation setting - - - } - type="asterisk" - /> - -

- } -> - - - - -`; - -exports[`Field for stringWithValidation setting should render default value if there is no user value set 1`] = ` - -
- - } - fullWidth={true} - id="string:test-validation:setting-group" - title={ -

- - String test validation setting - - - -

- } -> - - - - -`; - -exports[`Field for stringWithValidation setting should render unsaved value if there are unsaved changes 1`] = ` - -
- - } - fullWidth={true} - id="string:test-validation:setting-group" - title={ -

- - String test validation setting - - - } - type="asterisk" - /> - -

- } -> - - - -

- Setting is currently not saved. -

-
-
- -`; - -exports[`Field for stringWithValidation setting should render user value if there is user value is set 1`] = ` - -
- - - - - - foo-default - , - } - } - /> - - - - - } - fullWidth={true} - id="string:test-validation:setting-group" - title={ -

- - String test validation setting - - - -

- } -> - - - - - -     - - - } - label="string:test-validation:setting" - labelType="label" - > - - - -`; diff --git a/src/plugins/advanced_settings/public/management_app/components/field/field.test.tsx b/src/plugins/advanced_settings/public/management_app/components/field/field.test.tsx deleted file mode 100644 index 2d8d010aad2f3..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/components/field/field.test.tsx +++ /dev/null @@ -1,494 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React from 'react'; -import { I18nProvider } from '@kbn/i18n-react'; -import { shallowWithI18nProvider, mountWithI18nProvider } from '@kbn/test-jest-helpers'; -import '@kbn/code-editor-mock/jest_helper'; -import { mount, ReactWrapper } from 'enzyme'; -import { FieldSetting } from '../../types'; -import { UiSettingsType } from '@kbn/core/public'; -import { notificationServiceMock, docLinksServiceMock } from '@kbn/core/public/mocks'; - -import { findTestSubject } from '@elastic/eui/lib/test'; -import { Field, getEditableValue } from './field'; - -jest.mock('@kbn/kibana-react-plugin/public/ui_settings/use_ui_setting', () => ({ - useUiSetting: jest.fn(), -})); - -const defaults = { - requiresPageReload: false, - readOnly: false, - category: ['category'], -}; - -const exampleValues = { - array: ['example_value'], - boolean: false, - color: '#FF00CC', - image: 'data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=', - json: { foo: 'bar2' }, - markdown: 'Hello World', - number: 1, - select: 'banana', - string: 'hello world', - stringWithValidation: 'foo', -}; - -const settings: Record = { - array: { - name: 'array:test:setting', - ariaName: 'array test setting', - displayName: 'Array test setting', - description: 'Description for Array test setting', - type: 'array', - value: undefined, - defVal: ['default_value'], - isCustom: false, - isOverridden: false, - ...defaults, - }, - boolean: { - name: 'boolean:test:setting', - ariaName: 'boolean test setting', - displayName: 'Boolean test setting', - description: 'Description for Boolean test setting', - type: 'boolean', - value: undefined, - defVal: true, - isCustom: false, - isOverridden: false, - ...defaults, - }, - image: { - name: 'image:test:setting', - ariaName: 'image test setting', - displayName: 'Image test setting', - description: 'Description for Image test setting', - type: 'image', - value: undefined, - defVal: null, - isCustom: false, - isOverridden: false, - ...defaults, - }, - json: { - name: 'json:test:setting', - ariaName: 'json test setting', - displayName: 'Json test setting', - description: 'Description for Json test setting', - type: 'json', - value: '{"foo": "bar"}', - defVal: '{}', - isCustom: false, - isOverridden: false, - ...defaults, - }, - markdown: { - name: 'markdown:test:setting', - ariaName: 'markdown test setting', - displayName: 'Markdown test setting', - description: 'Description for Markdown test setting', - type: 'markdown', - value: undefined, - defVal: '', - isCustom: false, - isOverridden: false, - ...defaults, - }, - number: { - name: 'number:test:setting', - ariaName: 'number test setting', - displayName: 'Number test setting', - description: 'Description for Number test setting', - type: 'number', - value: undefined, - defVal: 5, - isCustom: false, - isOverridden: false, - ...defaults, - }, - select: { - name: 'select:test:setting', - ariaName: 'select test setting', - displayName: 'Select test setting', - description: 'Description for Select test setting', - type: 'select', - value: undefined, - defVal: 'orange', - isCustom: false, - isOverridden: false, - options: ['apple', 'orange', 'banana'], - optionLabels: { - apple: 'Apple', - orange: 'Orange', - // Deliberately left out `banana` to test if it also works with missing labels - }, - ...defaults, - }, - string: { - name: 'string:test:setting', - ariaName: 'string test setting', - displayName: 'String test setting', - description: 'Description for String test setting', - type: 'string', - value: undefined, - defVal: null, - isCustom: false, - isOverridden: false, - ...defaults, - }, - stringWithValidation: { - name: 'string:test-validation:setting', - ariaName: 'string test validation setting', - displayName: 'String test validation setting', - description: 'Description for String test validation setting', - type: 'string', - value: undefined, - defVal: 'foo-default', - isCustom: false, - isOverridden: false, - ...defaults, - }, - color: { - name: 'color:test:setting', - ariaName: 'color test setting', - displayName: 'Color test setting', - description: 'Description for Color test setting', - type: 'color', - value: undefined, - defVal: null, - isCustom: false, - isOverridden: false, - ...defaults, - }, -}; -const userValues = { - array: ['user', 'value'], - boolean: false, - image: 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', - json: '{"hello": "world"}', - markdown: '**bold**', - number: 10, - select: 'banana', - string: 'foo', - stringWithValidation: 'fooUserValue', - color: '#FACF0C', -}; - -const handleChange = jest.fn(); -const clearChange = jest.fn(); - -const getFieldSettingValue = (wrapper: ReactWrapper, name: string, type: string) => { - const field = findTestSubject(wrapper, `advancedSetting-editField-${name}`); - if (type === 'boolean') { - return field.props()['aria-checked']; - } else if (type === 'color') { - return field.props().color; - } else { - return field.props().value; - } -}; - -describe('Field', () => { - Object.keys(settings).forEach((type) => { - const setting = settings[type]; - - describe(`for ${type} setting`, () => { - it('should render default value if there is no user value set', async () => { - const component = shallowWithI18nProvider( - - ); - - expect(component).toMatchSnapshot(); - }); - - it('should render as read only with help text if overridden', async () => { - const component = shallowWithI18nProvider( - - ); - - expect(component).toMatchSnapshot(); - }); - - it('should render as read only if saving is disabled', async () => { - const component = shallowWithI18nProvider( - - ); - expect(component).toMatchSnapshot(); - }); - - it('should render user value if there is user value is set', async () => { - const component = shallowWithI18nProvider( - - ); - - expect(component).toMatchSnapshot(); - }); - - it('should render custom setting icon if it is custom', async () => { - const component = shallowWithI18nProvider( - - ); - expect(component).toMatchSnapshot(); - }); - it('should render unsaved value if there are unsaved changes', async () => { - const component = shallowWithI18nProvider( - - ); - expect(component).toMatchSnapshot(); - }); - }); - - if (type === 'select') { - it('should use options for rendering values and optionsLabels for rendering labels', () => { - const component = mountWithI18nProvider( - - ); - const select = findTestSubject(component, `advancedSetting-editField-${setting.name}`); - // @ts-ignore - const values = select.find('option').map((option) => option.prop('value')); - expect(values).toEqual(['apple', 'orange', 'banana']); - // @ts-ignore - const labels = select.find('option').map((option) => option.text()); - expect(labels).toEqual(['Apple', 'Orange', 'banana']); - }); - } - - const setup = () => { - const Wrapper = (props: Record) => ( - - - - ); - const wrapper = mount(); - const component = wrapper.find(I18nProvider).find(Field); - - return { - wrapper, - component, - }; - }; - - if (type === 'image') { - describe(`for changing ${type} setting`, () => { - const { wrapper, component } = setup(); - const userValue = userValues[type]; - (component.instance() as Field).getImageAsBase64 = ({}: Blob) => Promise.resolve(''); - - it('should be able to change value and cancel', async () => { - (component.instance() as Field).onImageChange([userValue] as unknown as FileList); - expect(handleChange).toBeCalled(); - await wrapper.setProps({ - unsavedChanges: { - value: userValue, - changeImage: true, - }, - setting: { - ...(component.instance() as Field).props.setting, - value: userValue, - }, - }); - await (component.instance() as Field).cancelChangeImage(); - expect(clearChange).toBeCalledWith(setting.name); - wrapper.update(); - }); - - it('should be able to change value from existing value', async () => { - await wrapper.setProps({ - unsavedChanges: {}, - }); - const updated = wrapper.update(); - findTestSubject(updated, `advancedSetting-changeImage-${setting.name}`).simulate('click'); - const newUserValue = `${userValue}=`; - await (component.instance() as Field).onImageChange([ - newUserValue, - ] as unknown as FileList); - expect(handleChange).toBeCalled(); - }); - - it('should be able to reset to default value', async () => { - const updated = wrapper.update(); - findTestSubject(updated, `advancedSetting-resetField-${setting.name}`).simulate('click'); - expect(handleChange).toBeCalledWith(setting.name, { - value: getEditableValue(setting.type, setting.defVal, setting.defVal), - changeImage: true, - }); - }); - }); - } else if (type === 'markdown' || type === 'json') { - describe(`for changing ${type} setting`, () => { - const { wrapper, component } = setup(); - const userValue = userValues[type]; - - it('should be able to change value', async () => { - (component.instance() as Field).onCodeEditorChange(userValue as UiSettingsType); - expect(handleChange).toBeCalledWith(setting.name, { value: userValue }); - await wrapper.setProps({ - setting: { - ...(component.instance() as Field).props.setting, - value: userValue, - }, - }); - wrapper.update(); - }); - - it('should be able to reset to default value', async () => { - const updated = wrapper.update(); - findTestSubject(updated, `advancedSetting-resetField-${setting.name}`).simulate('click'); - expect(handleChange).toBeCalledWith(setting.name, { - value: getEditableValue(setting.type, setting.defVal), - }); - }); - - if (type === 'json') { - it('should be able to clear value and have empty object populate', async () => { - await (component.instance() as Field).onCodeEditorChange('' as UiSettingsType); - wrapper.update(); - expect(handleChange).toBeCalledWith(setting.name, { value: setting.defVal }); - }); - } - }); - } else if (type === 'color') { - describe(`for changing ${type} setting`, () => { - const { wrapper, component } = setup(); - const userValue = userValues[type]; - - it('should be able to change value', async () => { - await (component.instance() as Field).onFieldChange(userValue); - const updated = wrapper.update(); - expect(handleChange).toBeCalledWith(setting.name, { value: userValue }); - updated.setProps({ unsavedChanges: { value: userValue } }); - const currentValue = wrapper.find('EuiColorPicker').prop('color'); - expect(currentValue).toEqual(userValue); - }); - - it('should be able to reset to default value', async () => { - await wrapper.setProps({ - unsavedChanges: {}, - setting: { ...setting, value: userValue }, - }); - const updated = wrapper.update(); - findTestSubject(updated, `advancedSetting-resetField-${setting.name}`).simulate('click'); - const expectedEditableValue = getEditableValue(setting.type, setting.defVal); - expect(handleChange).toBeCalledWith(setting.name, { - value: expectedEditableValue, - }); - updated.setProps({ unsavedChanges: { value: expectedEditableValue } }); - const currentValue = wrapper.find('EuiColorPicker').prop('color'); - expect(currentValue).toEqual(expectedEditableValue); - }); - }); - } else { - describe(`for changing ${type} setting`, () => { - const { wrapper, component } = setup(); - // @ts-ignore - const userValue = userValues[type]; - const fieldUserValue = type === 'array' ? userValue.join(', ') : userValue; - - it('should be able to change value', async () => { - await (component.instance() as Field).onFieldChange(fieldUserValue); - const updated = wrapper.update(); - expect(handleChange).toBeCalledWith(setting.name, { value: fieldUserValue }); - updated.setProps({ unsavedChanges: { value: fieldUserValue } }); - const currentValue = getFieldSettingValue(updated, setting.name, type); - expect(currentValue).toEqual(fieldUserValue); - }); - - it('should be able to reset to default value', async () => { - await wrapper.setProps({ - unsavedChanges: {}, - setting: { ...setting, value: fieldUserValue }, - }); - const updated = wrapper.update(); - findTestSubject(updated, `advancedSetting-resetField-${setting.name}`).simulate('click'); - const expectedEditableValue = getEditableValue(setting.type, setting.defVal); - expect(handleChange).toBeCalledWith(setting.name, { - value: expectedEditableValue, - }); - updated.setProps({ unsavedChanges: { value: expectedEditableValue } }); - const currentValue = getFieldSettingValue(updated, setting.name, type); - expect(currentValue).toEqual(expectedEditableValue); - }); - }); - } - }); -}); diff --git a/src/plugins/advanced_settings/public/management_app/components/field/field.tsx b/src/plugins/advanced_settings/public/management_app/components/field/field.tsx deleted file mode 100644 index 21d31b53600a0..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/components/field/field.tsx +++ /dev/null @@ -1,667 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React, { PureComponent, Fragment } from 'react'; -import classNames from 'classnames'; - -import { - EuiBadge, - EuiCode, - EuiCodeBlock, - EuiColorPicker, - EuiScreenReaderOnly, - EuiDescribedFormGroup, - EuiFieldNumber, - EuiFieldText, - EuiFilePicker, - EuiFormRow, - EuiIconTip, - EuiImage, - EuiLink, - EuiSpacer, - EuiText, - EuiSelect, - EuiSwitch, - EuiSwitchEvent, - EuiToolTip, -} from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { UiSettingsType, DocLinksStart, ToastsStart } from '@kbn/core/public'; -import { FieldCodeEditor } from './field_code_editor'; -import { FieldSetting, FieldState } from '../../types'; -import { isDefaultValue } from '../../lib'; - -interface FieldProps { - setting: FieldSetting; - handleChange: (name: string, value: FieldState) => void; - enableSaving: boolean; - docLinks: DocLinksStart['links']; - toasts: ToastsStart; - clearChange?: (name: string) => void; - unsavedChanges?: FieldState; - loading?: boolean; -} - -export const getEditableValue = ( - type: UiSettingsType, - value: FieldSetting['value'], - defVal?: FieldSetting['defVal'] -) => { - const val = value === null || value === undefined ? defVal : value; - switch (type) { - case 'array': - return (val as string[]).join(', '); - case 'boolean': - return !!val; - case 'number': - return Number(val); - case 'image': - return val; - default: - return val || ''; - } -}; - -export class Field extends PureComponent { - private changeImageForm = React.createRef(); - - getDisplayedDefaultValue( - type: UiSettingsType, - defVal: FieldSetting['defVal'], - optionLabels: Record = {} - ) { - if (defVal === undefined || defVal === null || defVal === '') { - return 'null'; - } - switch (type) { - case 'array': - return (defVal as string[]).join(', '); - case 'select': - return optionLabels.hasOwnProperty(String(defVal)) - ? optionLabels[String(defVal)] - : String(defVal); - default: - return String(defVal); - } - } - - handleChange = (unsavedChanges: FieldState) => { - this.props.handleChange(this.props.setting.name, unsavedChanges); - }; - - resetField = () => { - const { type, defVal } = this.props.setting; - if (type === 'image') { - this.cancelChangeImage(); - return this.handleChange({ - value: getEditableValue(type, defVal, defVal), - changeImage: true, - }); - } - return this.handleChange({ value: getEditableValue(type, defVal) }); - }; - - componentDidUpdate(prevProps: FieldProps) { - if ( - prevProps.setting.type === 'image' && - prevProps.unsavedChanges?.value && - !this.props.unsavedChanges?.value - ) { - this.cancelChangeImage(); - } - } - - onCodeEditorChange = (value: string) => { - const { defVal, type } = this.props.setting; - - let newUnsavedValue; - let errorParams = {}; - - switch (type) { - case 'json': - const isJsonArray = Array.isArray(JSON.parse((defVal as string) || '{}')); - newUnsavedValue = value || (isJsonArray ? '[]' : '{}'); - try { - JSON.parse(newUnsavedValue); - } catch (e) { - errorParams = { - error: i18n.translate('advancedSettings.field.codeEditorSyntaxErrorMessage', { - defaultMessage: 'Invalid JSON syntax', - }), - isInvalid: true, - }; - } - break; - default: - newUnsavedValue = value; - } - - this.handleChange({ - value: newUnsavedValue, - ...errorParams, - }); - }; - - onFieldChangeSwitch = (e: EuiSwitchEvent) => { - return this.onFieldChange(e.target.checked); - }; - - onFieldChangeEvent = (e: React.ChangeEvent) => - this.onFieldChange(e.target.value); - - onFieldChange = (targetValue: any) => { - const { type, value, defVal, options } = this.props.setting; - let newUnsavedValue; - - switch (type) { - case 'boolean': - const { unsavedChanges } = this.props; - const currentValue = unsavedChanges - ? unsavedChanges.value - : getEditableValue(type, value, defVal); - newUnsavedValue = !currentValue; - break; - case 'number': - newUnsavedValue = Number(targetValue); - break; - case 'select': - if (typeof options?.[0] === 'number') { - newUnsavedValue = Number(targetValue); - } else { - newUnsavedValue = targetValue; - } - break; - default: - newUnsavedValue = targetValue; - } - - this.handleChange({ - value: newUnsavedValue, - }); - }; - - onImageChange = async (files: FileList | null) => { - if (files == null) return; - - if (!files.length) { - this.setState({ - unsavedValue: null, - }); - return; - } - - const file = files[0]; - try { - let base64Image = ''; - if (file instanceof File) { - base64Image = (await this.getImageAsBase64(file)) as string; - } - - this.handleChange({ - changeImage: true, - value: base64Image, - }); - } catch (err) { - this.props.toasts.addDanger( - i18n.translate('advancedSettings.field.imageChangeErrorMessage', { - defaultMessage: 'Image could not be saved', - }) - ); - this.cancelChangeImage(); - } - }; - - async getImageAsBase64(file: Blob): Promise { - const reader = new FileReader(); - reader.readAsDataURL(file); - - return new Promise((resolve, reject) => { - reader.onload = () => { - resolve(reader.result!); - }; - reader.onerror = (err) => { - reject(err); - }; - }); - } - - changeImage = () => { - this.handleChange({ - value: null, - changeImage: true, - }); - }; - - cancelChangeImage = () => { - if (this.changeImageForm.current?.fileInput) { - this.changeImageForm.current.fileInput.value = ''; - this.changeImageForm.current.handleChange(); - } - if (this.props.clearChange) { - this.props.clearChange(this.props.setting.name); - } - }; - - renderField(setting: FieldSetting, ariaDescribedBy?: string) { - const { enableSaving, unsavedChanges, loading } = this.props; - const { - name, - value, - type, - options, - optionLabels = {}, - isOverridden, - defVal, - ariaName, - } = setting; - const a11yProps: { [key: string]: string } = ariaDescribedBy - ? { - 'aria-label': ariaName, - 'aria-describedby': ariaDescribedBy, - } - : { - 'aria-label': ariaName, - }; - const currentValue = unsavedChanges - ? unsavedChanges.value - : getEditableValue(type, value, defVal); - - switch (type) { - case 'boolean': - return ( - - ) : ( - - ) - } - checked={!!currentValue} - onChange={this.onFieldChangeSwitch} - disabled={loading || isOverridden || !enableSaving} - data-test-subj={`advancedSetting-editField-${name}`} - {...a11yProps} - /> - ); - case 'markdown': - case 'json': - return ( -
- -
- ); - case 'image': - const changeImage = unsavedChanges?.changeImage; - if (!isDefaultValue(setting) && !changeImage) { - return ; - } else { - return ( - - ); - } - case 'select': - return ( - { - return { - text: optionLabels.hasOwnProperty(option) ? optionLabels[option] : option, - value: option, - }; - })} - onChange={this.onFieldChangeEvent} - isLoading={loading} - disabled={loading || isOverridden || !enableSaving} - fullWidth - data-test-subj={`advancedSetting-editField-${name}`} - /> - ); - case 'number': - return ( - - ); - case 'color': - return ( - - ); - default: - return ( - - ); - } - } - - renderLabel(setting: FieldSetting) { - return setting.name; - } - - renderHelpText(setting: FieldSetting) { - if (setting.isOverridden) { - return ( - - - - ); - } - - const canUpdateSetting = this.props.enableSaving; - const defaultLink = this.renderResetToDefaultLink(setting); - const imageLink = this.renderChangeImageLink(setting); - - if (canUpdateSetting && (defaultLink || imageLink)) { - return ( - - {defaultLink} - {imageLink} - - ); - } - - return null; - } - - renderTitle(setting: FieldSetting) { - const { unsavedChanges } = this.props; - const isInvalid = unsavedChanges?.isInvalid; - - const unsavedIconLabel = unsavedChanges - ? isInvalid - ? i18n.translate('advancedSettings.field.invalidIconLabel', { - defaultMessage: 'Invalid', - }) - : i18n.translate('advancedSettings.field.unsavedIconLabel', { - defaultMessage: 'Unsaved', - }) - : undefined; - - return ( -

- - {setting.displayName || setting.name} - - {setting.isCustom ? ( - - } - /> - ) : ( - '' - )} - - {unsavedChanges ? ( - - ) : ( - '' - )} -

- ); - } - - renderDescription(setting: FieldSetting) { - let description; - let deprecation; - - if (setting.deprecation) { - const links = this.props.docLinks; - - deprecation = ( - <> - - { - window.open(links.management[setting.deprecation!.docLinksKey], '_blank'); - }} - onClickAriaLabel={i18n.translate('advancedSettings.field.deprecationClickAreaLabel', { - defaultMessage: 'Click to view deprecation documentation for {settingName}.', - values: { - settingName: setting.name, - }, - })} - > - Deprecated - - - - - ); - } - - if (React.isValidElement(setting.description)) { - description = setting.description; - } else { - description = ( -
- ); - } - - return ( - - {deprecation} - {description} - {this.renderDefaultValue(setting)} - - ); - } - - renderDefaultValue(setting: FieldSetting) { - const { type, defVal, optionLabels } = setting; - if (isDefaultValue(setting)) { - return; - } - return ( - - - - {type === 'json' ? ( - - = 500 ? 300 : undefined} - > - {this.getDisplayedDefaultValue(type, defVal)} - - ), - }} - /> - - ) : ( - - {this.getDisplayedDefaultValue(type, defVal, optionLabels)} - ), - }} - /> - - )} - - - ); - } - - renderResetToDefaultLink(setting: FieldSetting) { - const { defVal, ariaName, name } = setting; - if ( - defVal === this.props.unsavedChanges?.value || - isDefaultValue(setting) || - this.props.loading - ) { - return; - } - return ( - - - - -     - - ); - } - - renderChangeImageLink(setting: FieldSetting) { - const changeImage = this.props.unsavedChanges?.changeImage; - const { type, value, ariaName, name } = setting; - if (type !== 'image' || !value || changeImage) { - return; - } - return ( - - - - - - ); - } - - render() { - const { setting, unsavedChanges } = this.props; - const error = unsavedChanges?.error; - const isInvalid = unsavedChanges?.isInvalid; - - const className = classNames('mgtAdvancedSettings__field', { - 'mgtAdvancedSettings__field--unsaved': unsavedChanges, - 'mgtAdvancedSettings__field--invalid': isInvalid, - }); - const groupId = `${setting.name}-group`; - const unsavedId = `${setting.name}-unsaved`; - - return ( - - - <> - {this.renderField(setting, unsavedChanges ? `${groupId} ${unsavedId}` : undefined)} - {unsavedChanges && ( - -

- {unsavedChanges.error - ? unsavedChanges.error - : i18n.translate('advancedSettings.field.settingIsUnsaved', { - defaultMessage: 'Setting is currently not saved.', - })} -

-
- )} - -
-
- ); - } -} diff --git a/src/plugins/advanced_settings/public/management_app/components/field/field_code_editor.tsx b/src/plugins/advanced_settings/public/management_app/components/field/field_code_editor.tsx deleted file mode 100644 index 83a6b0c90bfd6..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/components/field/field_code_editor.tsx +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React, { useCallback } from 'react'; -import { monaco, XJsonLang } from '@kbn/monaco'; - -import { CodeEditor, MarkdownLang } from '@kbn/code-editor'; - -interface FieldCodeEditorProps { - value: string; - onChange: (value: string) => void; - type: 'markdown' | 'json'; - isReadOnly: boolean; - a11yProps: Record; - name: string; -} - -const MIN_DEFAULT_LINES_COUNT = 6; -const MAX_DEFAULT_LINES_COUNT = 30; - -export const FieldCodeEditor = ({ - value, - onChange, - type, - isReadOnly, - a11yProps, - name, -}: FieldCodeEditorProps) => { - // setting editor height based on lines height and count to stretch and fit its content - const setEditorCalculatedHeight = useCallback( - (editor: monaco.editor.IStandaloneCodeEditor) => { - const editorElement = editor.getDomNode(); - - if (!editorElement) { - return; - } - - const lineHeight = editor.getOption(monaco.editor.EditorOption.lineHeight); - let lineCount = editor.getModel()?.getLineCount() || MIN_DEFAULT_LINES_COUNT; - if (lineCount < MIN_DEFAULT_LINES_COUNT) { - lineCount = MIN_DEFAULT_LINES_COUNT; - } else if (lineCount > MAX_DEFAULT_LINES_COUNT) { - lineCount = MAX_DEFAULT_LINES_COUNT; - } - const height = lineHeight * lineCount; - - editorElement.id = name; - editorElement.style.height = `${height}px`; - editor.layout(); - }, - [name] - ); - - const trimEditorBlankLines = useCallback((editor: monaco.editor.IStandaloneCodeEditor) => { - const editorModel = editor.getModel(); - - if (!editorModel) { - return; - } - const trimmedValue = editorModel.getValue().trim(); - editorModel.setValue(trimmedValue); - }, []); - - const editorDidMount = useCallback( - (editor) => { - setEditorCalculatedHeight(editor); - - editor.onDidChangeModelContent(() => { - setEditorCalculatedHeight(editor); - }); - - editor.onDidBlurEditorWidget(() => { - trimEditorBlankLines(editor); - }); - }, - [setEditorCalculatedHeight, trimEditorBlankLines] - ); - - return ( - - ); -}; diff --git a/src/plugins/advanced_settings/public/management_app/components/form/__snapshots__/form.test.tsx.snap b/src/plugins/advanced_settings/public/management_app/components/form/__snapshots__/form.test.tsx.snap deleted file mode 100644 index 064269f885cca..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/components/form/__snapshots__/form.test.tsx.snap +++ /dev/null @@ -1,1077 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Form should not render no settings message when instructed not to 1`] = ` - -
- <_EuiSplitPanelOuter - hasBorder={true} - > - <_EuiSplitPanelInner - color="subdued" - > - - - -

- General -

-
-
- - - - - - - , - "settingsCount": -1, - } - } - /> - - -
- - <_EuiSplitPanelInner> - - - - - - - <_EuiSplitPanelOuter - hasBorder={true} - > - <_EuiSplitPanelInner - color="subdued" - > - - - -

- Dashboard -

-
-
-
- - <_EuiSplitPanelInner> - - - - - <_EuiSplitPanelOuter - hasBorder={true} - > - <_EuiSplitPanelInner - color="subdued" - > - - - -

- X-pack -

-
-
- - - - - - - , - "settingsCount": 9, - } - } - /> - - -
- - <_EuiSplitPanelInner> - - - - -
-
-`; - -exports[`Form should render no settings message when there are no settings 1`] = ` - -
- <_EuiSplitPanelOuter - hasBorder={true} - > - <_EuiSplitPanelInner - color="subdued" - > - - - -

- General -

-
-
- - - - - - - , - "settingsCount": -1, - } - } - /> - - -
- - <_EuiSplitPanelInner> - - - - - - - <_EuiSplitPanelOuter - hasBorder={true} - > - <_EuiSplitPanelInner - color="subdued" - > - - - -

- Dashboard -

-
-
-
- - <_EuiSplitPanelInner> - - - - - <_EuiSplitPanelOuter - hasBorder={true} - > - <_EuiSplitPanelInner - color="subdued" - > - - - -

- X-pack -

-
-
- - - - - - - , - "settingsCount": 9, - } - } - /> - - -
- - <_EuiSplitPanelInner> - - - - -
-
-`; - -exports[`Form should render normally 1`] = ` - -
- <_EuiSplitPanelOuter - hasBorder={true} - > - <_EuiSplitPanelInner - color="subdued" - > - - - -

- General -

-
-
- - - - - - - , - "settingsCount": -1, - } - } - /> - - -
- - <_EuiSplitPanelInner> - - - - - - - <_EuiSplitPanelOuter - hasBorder={true} - > - <_EuiSplitPanelInner - color="subdued" - > - - - -

- Dashboard -

-
-
-
- - <_EuiSplitPanelInner> - - - - - <_EuiSplitPanelOuter - hasBorder={true} - > - <_EuiSplitPanelInner - color="subdued" - > - - - -

- X-pack -

-
-
- - - - - - - , - "settingsCount": 9, - } - } - /> - - -
- - <_EuiSplitPanelInner> - - - - -
-
-`; - -exports[`Form should render read-only when saving is disabled 1`] = ` - -
- <_EuiSplitPanelOuter - hasBorder={true} - > - <_EuiSplitPanelInner - color="subdued" - > - - - -

- General -

-
-
- - - - - - - , - "settingsCount": -1, - } - } - /> - - -
- - <_EuiSplitPanelInner> - - - - - - - <_EuiSplitPanelOuter - hasBorder={true} - > - <_EuiSplitPanelInner - color="subdued" - > - - - -

- Dashboard -

-
-
-
- - <_EuiSplitPanelInner> - - - - - <_EuiSplitPanelOuter - hasBorder={true} - > - <_EuiSplitPanelInner - color="subdued" - > - - - -

- X-pack -

-
-
- - - - - - - , - "settingsCount": 9, - } - } - /> - - -
- - <_EuiSplitPanelInner> - - - - -
-
-`; diff --git a/src/plugins/advanced_settings/public/management_app/components/form/form.test.tsx b/src/plugins/advanced_settings/public/management_app/components/form/form.test.tsx deleted file mode 100644 index 4deb1b9c24d1d..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/components/form/form.test.tsx +++ /dev/null @@ -1,321 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React from 'react'; -import { shallowWithI18nProvider, mountWithI18nProvider } from '@kbn/test-jest-helpers'; -import { findTestSubject } from '@elastic/eui/lib/test'; - -import { UiSettingsType } from '@kbn/core/public'; -import { themeServiceMock, notificationServiceMock } from '@kbn/core/public/mocks'; -import { SettingsChanges } from '../../types'; -import { Form } from './form'; - -jest.mock('../field', () => ({ - Field: () => { - return 'field'; - }, -})); - -beforeAll(() => { - const localStorage: Record = { - 'core.chrome.isLocked': true, - }; - - Object.defineProperty(window, 'localStorage', { - value: { - getItem: (key: string) => { - return localStorage[key] || null; - }, - }, - writable: true, - }); -}); - -afterAll(() => { - delete (window as any).localStorage; -}); - -const defaults = { - requiresPageReload: false, - readOnly: false, - value: 'value', - description: 'description', - isOverridden: false, - type: 'string' as UiSettingsType, - isCustom: false, - defVal: 'defVal', -}; - -const settings = { - dashboard: [ - { - ...defaults, - name: 'dashboard:test:setting', - ariaName: 'dashboard test setting', - displayName: 'Dashboard test setting', - category: ['dashboard'], - requiresPageReload: true, - }, - ], - general: [ - { - ...defaults, - name: 'general:test:date', - ariaName: 'general test date', - displayName: 'Test date', - description: 'bar', - category: ['general'], - }, - { - ...defaults, - name: 'setting:test', - ariaName: 'setting test', - displayName: 'Test setting', - description: 'foo', - category: ['general'], - }, - { - ...defaults, - name: 'general:test:array', - ariaName: 'array test', - displayName: 'Test array setting', - description: 'array foo', - type: 'array' as UiSettingsType, - category: ['general'], - defVal: ['test'], - }, - ], - 'x-pack': [ - { - ...defaults, - name: 'xpack:test:setting', - ariaName: 'xpack test setting', - displayName: 'X-Pack test setting', - category: ['x-pack'], - description: 'bar', - }, - ], -}; - -const categories = ['general', 'dashboard', 'hiddenCategory', 'x-pack']; -const categoryCounts = { - general: 2, - dashboard: 1, - 'x-pack': 10, -}; -const save = jest.fn((changes: SettingsChanges) => Promise.resolve([true])); - -const clearQuery = () => {}; - -describe('Form', () => { - it('should render normally', async () => { - const component = shallowWithI18nProvider( - - ); - - expect(component).toMatchSnapshot(); - }); - - it('should render read-only when saving is disabled', async () => { - const component = shallowWithI18nProvider( - - ); - - expect(component).toMatchSnapshot(); - }); - - it('should render no settings message when there are no settings', async () => { - const component = shallowWithI18nProvider( - - ); - - expect(component).toMatchSnapshot(); - }); - - it('should not render no settings message when instructed not to', async () => { - const component = shallowWithI18nProvider( - - ); - - expect(component).toMatchSnapshot(); - }); - - it('should hide bottom bar when clicking on the cancel changes button', async () => { - const wrapper = mountWithI18nProvider( - - ); - (wrapper.instance() as Form).setState({ - unsavedChanges: { - 'dashboard:test:setting': { - value: 'changedValue', - }, - }, - }); - const updated = wrapper.update(); - expect(updated.exists('[data-test-subj="advancedSetting-bottomBar"]')).toEqual(true); - await findTestSubject(updated, `advancedSetting-cancelButton`).simulate('click'); - updated.update(); - expect(updated.exists('[data-test-subj="advancedSetting-bottomBar"]')).toEqual(false); - }); - - it('should show a reload toast when saving setting requiring a page reload', async () => { - const toasts = notificationServiceMock.createStartContract().toasts; - const wrapper = mountWithI18nProvider( - - ); - (wrapper.instance() as Form).setState({ - unsavedChanges: { - 'dashboard:test:setting': { - value: 'changedValue', - }, - }, - }); - const updated = wrapper.update(); - - findTestSubject(updated, `advancedSetting-saveButton`).simulate('click'); - expect(save).toHaveBeenCalled(); - await save({ 'dashboard:test:setting': 'changedValue' }); - expect(toasts.add).toHaveBeenCalledWith( - expect.objectContaining({ - title: expect.stringContaining( - 'One or more settings require you to reload the page to take effect.' - ), - }) - ); - }); - - it('should save an array typed field when user provides an empty string correctly', async () => { - const wrapper = mountWithI18nProvider( - - ); - - (wrapper.instance() as Form).setState({ - unsavedChanges: { - 'general:test:array': { - value: '', - }, - }, - }); - - findTestSubject(wrapper.update(), `advancedSetting-saveButton`).simulate('click'); - expect(save).toHaveBeenCalledWith({ 'general:test:array': [] }); - }); - - it('should save an array typed field when user provides a comma separated string correctly', async () => { - const wrapper = mountWithI18nProvider( - - ); - - (wrapper.instance() as Form).setState({ - unsavedChanges: { - 'general:test:array': { - value: 'test1, test2', - }, - }, - }); - - findTestSubject(wrapper.update(), `advancedSetting-saveButton`).simulate('click'); - expect(save).toHaveBeenCalledWith({ 'general:test:array': ['test1', 'test2'] }); - }); -}); diff --git a/src/plugins/advanced_settings/public/management_app/components/form/form.tsx b/src/plugins/advanced_settings/public/management_app/components/form/form.tsx deleted file mode 100644 index e45af3c98cce6..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/components/form/form.tsx +++ /dev/null @@ -1,432 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React, { PureComponent, Fragment } from 'react'; - -import { - EuiFlexGroup, - EuiFlexItem, - EuiSplitPanel, - EuiLink, - EuiCallOut, - EuiSpacer, - EuiText, - EuiBottomBar, - EuiButton, - EuiToolTip, - EuiButtonEmpty, - EuiTitle, -} from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { isEmpty } from 'lodash'; -import { i18n } from '@kbn/i18n'; -import { UiCounterMetricType } from '@kbn/analytics'; -import { KibanaThemeProvider, toMountPoint } from '@kbn/kibana-react-plugin/public'; -import { DocLinksStart, ThemeServiceStart, ToastsStart } from '@kbn/core/public'; - -import { getCategoryName } from '../../lib'; -import { Field, getEditableValue } from '../field'; -import { FieldSetting, SettingsChanges, FieldState } from '../../types'; - -type Category = string; - -interface FormProps { - settings: Record; - visibleSettings: Record; - categories: Category[]; - categoryCounts: Record; - clearQuery: () => void; - save: (changes: SettingsChanges) => Promise; - showNoResultsMessage: boolean; - enableSaving: boolean; - docLinks: DocLinksStart['links']; - toasts: ToastsStart; - theme: ThemeServiceStart['theme$']; - trackUiMetric?: (metricType: UiCounterMetricType, eventName: string | string[]) => void; - queryText?: string; -} - -interface FormState { - unsavedChanges: { - [key: string]: FieldState; - }; - loading: boolean; -} - -export class Form extends PureComponent { - state: FormState = { - unsavedChanges: {}, - loading: false, - }; - - setLoading(loading: boolean) { - this.setState({ - loading, - }); - } - - getSettingByKey = (key: string): FieldSetting | undefined => { - return Object.values(this.props.settings) - .flat() - .find((el) => el.name === key); - }; - - getCountOfUnsavedChanges = (): number => { - return Object.keys(this.state.unsavedChanges).length; - }; - - getCountOfHiddenUnsavedChanges = (): number => { - const shownSettings = Object.values(this.props.visibleSettings) - .flat() - .map((setting) => setting.name); - return Object.keys(this.state.unsavedChanges).filter((key) => !shownSettings.includes(key)) - .length; - }; - - areChangesInvalid = (): boolean => { - const { unsavedChanges } = this.state; - return Object.values(unsavedChanges).some(({ isInvalid }) => isInvalid); - }; - - handleChange = (key: string, change: FieldState) => { - const setting = this.getSettingByKey(key); - if (!setting) { - return; - } - const { type, defVal, value } = setting; - const savedValue = getEditableValue(type, value, defVal); - if (change.value === savedValue) { - return this.clearChange(key); - } - this.setState({ - unsavedChanges: { - ...this.state.unsavedChanges, - [key]: change, - }, - }); - }; - - clearChange = (key: string) => { - if (!this.state.unsavedChanges[key]) { - return; - } - const unsavedChanges = { ...this.state.unsavedChanges }; - delete unsavedChanges[key]; - - this.setState({ - unsavedChanges, - }); - }; - - clearAllUnsaved = () => { - this.setState({ unsavedChanges: {} }); - }; - - saveAll = async () => { - this.setLoading(true); - const { unsavedChanges } = this.state; - - if (isEmpty(unsavedChanges)) { - return; - } - const configToSave: SettingsChanges = {}; - let requiresReload = false; - - Object.entries(unsavedChanges).forEach(([name, { value }]) => { - const setting = this.getSettingByKey(name); - if (!setting) { - return; - } - const { defVal, type, requiresPageReload, metric } = setting; - let valueToSave = value; - let equalsToDefault = false; - switch (type) { - case 'array': - valueToSave = valueToSave.trim(); - valueToSave = - valueToSave === '' ? [] : valueToSave.split(',').map((val: string) => val.trim()); - equalsToDefault = valueToSave.join(',') === (defVal as string[]).join(','); - break; - case 'json': - const isArray = Array.isArray(JSON.parse((defVal as string) || '{}')); - valueToSave = valueToSave.trim(); - valueToSave = valueToSave || (isArray ? '[]' : '{}'); - case 'boolean': - if (metric && this.props.trackUiMetric) { - const metricName = valueToSave ? `${metric.name}_on` : `${metric.name}_off`; - this.props.trackUiMetric(metric.type, metricName); - } - default: - equalsToDefault = valueToSave === defVal; - } - if (requiresPageReload) { - requiresReload = true; - } - configToSave[name] = equalsToDefault ? null : valueToSave; - }); - - try { - await this.props.save(configToSave); - this.clearAllUnsaved(); - if (requiresReload) { - this.renderPageReloadToast(); - } - } catch (e) { - this.props.toasts.addDanger( - i18n.translate('advancedSettings.form.saveErrorMessage', { - defaultMessage: 'Unable to save', - }) - ); - } - this.setLoading(false); - }; - - renderPageReloadToast = () => { - this.props.toasts.add({ - title: i18n.translate('advancedSettings.form.requiresPageReloadToastDescription', { - defaultMessage: 'One or more settings require you to reload the page to take effect.', - }), - toastLifeTimeMs: 15000, - text: toMountPoint( - - - - window.location.reload()} - data-test-subj="windowReloadButton" - > - {i18n.translate('advancedSettings.form.requiresPageReloadToastButtonLabel', { - defaultMessage: 'Reload page', - })} - - - - - ), - color: 'success', - }); - }; - - renderClearQueryLink(totalSettings: number, currentSettings: number) { - const { clearQuery } = this.props; - - if (totalSettings !== currentSettings) { - return ( - - - - - - - - ), - }} - /> - - - ); - } - - return null; - } - - renderCategory(category: Category, settings: FieldSetting[], totalSettings: number) { - return ( - - - - - - -

{getCategoryName(category)}

-
-
- {this.renderClearQueryLink(totalSettings, settings.length)} -
-
- - {settings.map((setting) => { - return ( - - ); - })} - -
- -
- ); - } - - maybeRenderNoSettings(clearQuery: FormProps['clearQuery']) { - if (this.props.showNoResultsMessage) { - return ( - - - - - ), - queryText: {this.props.queryText}, - }} - /> - - } - /> - ); - } - return null; - } - - renderCountOfUnsaved = () => { - const unsavedCount = this.getCountOfUnsavedChanges(); - const hiddenUnsavedCount = this.getCountOfHiddenUnsavedChanges(); - return ( - - - - ); - }; - - renderBottomBar = () => { - const areChangesInvalid = this.areChangesInvalid(); - return ( - - - -

{this.renderCountOfUnsaved()}

-
- - - - {i18n.translate('advancedSettings.form.cancelButtonLabel', { - defaultMessage: 'Cancel changes', - })} - - - - - - {i18n.translate('advancedSettings.form.saveButtonLabel', { - defaultMessage: 'Save changes', - })} - - - -
-
- ); - }; - - render() { - const { unsavedChanges } = this.state; - const { visibleSettings, categories, categoryCounts, clearQuery } = this.props; - const currentCategories: Category[] = []; - const hasUnsavedChanges = !isEmpty(unsavedChanges); - - if (hasUnsavedChanges) { - document.body.classList.add('kbnBody--mgtAdvancedSettingsHasBottomBar'); - } else { - document.body.classList.remove('kbnBody--mgtAdvancedSettingsHasBottomBar'); - } - - categories.forEach((category) => { - if (visibleSettings[category] && visibleSettings[category].length) { - currentCategories.push(category); - } - }); - - return ( - -
- {currentCategories.length - ? currentCategories.map((category) => { - return this.renderCategory( - category, - visibleSettings[category], - categoryCounts[category] - ); - }) - : this.maybeRenderNoSettings(clearQuery)} -
- {hasUnsavedChanges && this.renderBottomBar()} -
- ); - } -} diff --git a/src/plugins/advanced_settings/public/management_app/components/form/index.ts b/src/plugins/advanced_settings/public/management_app/components/form/index.ts deleted file mode 100644 index 5d218b01b0eaa..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/components/form/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -export { Form } from './form'; diff --git a/src/plugins/advanced_settings/public/management_app/components/search/__snapshots__/search.test.tsx.snap b/src/plugins/advanced_settings/public/management_app/components/search/__snapshots__/search.test.tsx.snap deleted file mode 100644 index 24f8729cafee1..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/components/search/__snapshots__/search.test.tsx.snap +++ /dev/null @@ -1,63 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Search should render normally 1`] = ` - - - -`; diff --git a/src/plugins/advanced_settings/public/management_app/components/search/index.ts b/src/plugins/advanced_settings/public/management_app/components/search/index.ts deleted file mode 100644 index a9abed56dbb27..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/components/search/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -export { Search } from './search'; diff --git a/src/plugins/advanced_settings/public/management_app/components/search/search.test.tsx b/src/plugins/advanced_settings/public/management_app/components/search/search.test.tsx deleted file mode 100644 index cef5978945bc8..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/components/search/search.test.tsx +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React from 'react'; -import { shallowWithI18nProvider, mountWithI18nProvider } from '@kbn/test-jest-helpers'; - -import { findTestSubject } from '@elastic/eui/lib/test'; - -import { Query } from '@elastic/eui'; -import { Search } from './search'; - -const query = Query.parse(''); -const categories = ['general', 'dashboard', 'hiddenCategory', 'x-pack']; - -describe('Search', () => { - it('should render normally', async () => { - const onQueryChange = () => {}; - const component = shallowWithI18nProvider( - - ); - - expect(component).toMatchSnapshot(); - }); - - it('should call parent function when query is changed', async () => { - // This test is brittle as it knows about implementation details - // (EuiFieldSearch uses onKeyup instead of onChange to handle input) - const onQueryChange = jest.fn(); - const component = mountWithI18nProvider( - - ); - findTestSubject(component, 'settingsSearchBar').simulate('keyup', { - target: { value: 'new filter' }, - }); - expect(onQueryChange).toHaveBeenCalledTimes(1); - }); - - it('should handle query parse error', async () => { - const onQueryChangeMock = jest.fn(); - const component = mountWithI18nProvider( - - ); - - const searchBar = findTestSubject(component, 'settingsSearchBar'); - - // Send invalid query - searchBar.simulate('keyup', { target: { value: '?' } }); - expect(onQueryChangeMock).toHaveBeenCalledTimes(0); - expect(component.state().isSearchTextValid).toBe(false); - - onQueryChangeMock.mockReset(); - - // Send valid query to ensure component can recover from invalid query - searchBar.simulate('keyup', { target: { value: 'dateFormat' } }); - expect(onQueryChangeMock).toHaveBeenCalledTimes(1); - expect(component.state().isSearchTextValid).toBe(true); - }); -}); diff --git a/src/plugins/advanced_settings/public/management_app/components/search/search.tsx b/src/plugins/advanced_settings/public/management_app/components/search/search.tsx deleted file mode 100644 index 8805c9cc7eed9..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/components/search/search.tsx +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React, { Fragment, PureComponent } from 'react'; -import { i18n } from '@kbn/i18n'; -import { EuiSearchBar, EuiFormErrorText, Query } from '@elastic/eui'; - -import { getCategoryName } from '../../lib'; - -export const CATEGORY_FIELD = 'category'; - -interface SearchProps { - categories: string[]; - query: Query; - onQueryChange: ({ query }: { query: Query }) => void; -} - -export const parseErrorMsg = i18n.translate( - 'advancedSettings.searchBar.unableToParseQueryErrorMessage', - { defaultMessage: 'Unable to parse query' } -); - -export class Search extends PureComponent { - private categories: Array<{ value: string; name: string }> = []; - - constructor(props: SearchProps) { - super(props); - const { categories } = props; - this.categories = categories.map((category) => { - return { - value: category, - name: getCategoryName(category), - }; - }); - } - - state = { - isSearchTextValid: true, - parseErrorMessage: null, - }; - - onChange = ({ query, error }: { query: Query | null; error: { message: string } | null }) => { - if (error) { - this.setState({ - isSearchTextValid: false, - parseErrorMessage: error.message, - }); - return; - } - - this.setState({ - isSearchTextValid: true, - parseErrorMessage: null, - }); - this.props.onQueryChange({ query: query! }); - }; - - render() { - const { query } = this.props; - - const box = { - incremental: true, - 'data-test-subj': 'settingsSearchBar', - 'aria-label': i18n.translate('advancedSettings.searchBarAriaLabel', { - defaultMessage: 'Search advanced settings', - }), // hack until EuiSearchBar is fixed - }; - - const filters = [ - { - type: 'field_value_selection' as const, - field: CATEGORY_FIELD, - name: i18n.translate('advancedSettings.categorySearchLabel', { - defaultMessage: 'Category', - }), - multiSelect: 'or' as const, - options: this.categories, - }, - ]; - - let queryParseError; - if (!this.state.isSearchTextValid) { - queryParseError = ( - {`${parseErrorMsg}. ${this.state.parseErrorMessage}`} - ); - } - - return ( - - - {queryParseError} - - ); - } -} diff --git a/src/plugins/advanced_settings/public/management_app/i18n_texts.ts b/src/plugins/advanced_settings/public/management_app/i18n_texts.ts deleted file mode 100644 index 5267e4baa8029..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/i18n_texts.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { i18n } from '@kbn/i18n'; - -export const i18nTexts = { - defaultSpaceTabTitle: i18n.translate('advancedSettings.spaceSettingsTabTitle', { - defaultMessage: 'Space Settings', - }), - defaultSpaceCalloutTitle: i18n.translate('advancedSettings.defaultSpaceCalloutTitle', { - defaultMessage: 'Changes will affect the current space.', - }), - defaultSpaceCalloutSubtitle: i18n.translate('advancedSettings.defaultSpaceCalloutSubtitle', { - defaultMessage: - 'Changes will only be applied to the current space. These settings are intended for advanced users, as improper configurations may adversely affect aspects of Kibana.', - }), - globalTabTitle: i18n.translate('advancedSettings.globalSettingsTabTitle', { - defaultMessage: 'Global Settings', - }), - globalCalloutTitle: i18n.translate('advancedSettings.globalCalloutTitle', { - defaultMessage: 'Changes will affect all user settings across all spaces', - }), - globalCalloutSubtitle: i18n.translate('advancedSettings.globalCalloutSubtitle', { - defaultMessage: - 'Changes will be applied to all users across all spaces. This includes both native Kibana users and single-sign on users.', - }), - advancedSettingsTitle: i18n.translate('advancedSettings.advancedSettingsLabel', { - defaultMessage: 'Advanced Settings', - }), -}; diff --git a/src/plugins/advanced_settings/public/management_app/index.scss b/src/plugins/advanced_settings/public/management_app/index.scss deleted file mode 100644 index 5f473c519dda6..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/index.scss +++ /dev/null @@ -1 +0,0 @@ -@import './advanced_settings'; diff --git a/src/plugins/advanced_settings/public/management_app/lib/default_category.ts b/src/plugins/advanced_settings/public/management_app/lib/default_category.ts deleted file mode 100644 index c6fb7839662da..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/lib/default_category.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -export const DEFAULT_CATEGORY = 'general'; diff --git a/src/plugins/advanced_settings/public/management_app/lib/get_aria_name.test.ts b/src/plugins/advanced_settings/public/management_app/lib/get_aria_name.test.ts deleted file mode 100644 index 739485959b316..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/lib/get_aria_name.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import expect from '@kbn/expect'; -import { getAriaName } from './get_aria_name'; - -describe('Settings', function () { - describe('Advanced', function () { - describe('getAriaName(name)', function () { - it('should return a space delimited lower-case string with no special characters', function () { - expect(getAriaName('xPack:defaultAdminEmail')).to.be('x pack default admin email'); - expect(getAriaName('doc_table:highlight')).to.be('doc table highlight'); - expect(getAriaName('foo')).to.be('foo'); - }); - - it('should return an empty string if passed undefined or null', function () { - expect(getAriaName()).to.be(''); - expect(getAriaName(undefined)).to.be(''); - }); - - it('should preserve category string', function () { - expect(getAriaName('xPack:fooBar:foo_bar_baz category:(general)')).to.be( - 'x pack foo bar foo bar baz category:(general)' - ); - expect(getAriaName('xPack:fooBar:foo_bar_baz category:(general or discover)')).to.be( - 'x pack foo bar foo bar baz category:(general or discover)' - ); - }); - }); - }); -}); diff --git a/src/plugins/advanced_settings/public/management_app/lib/get_aria_name.ts b/src/plugins/advanced_settings/public/management_app/lib/get_aria_name.ts deleted file mode 100644 index 5e3ff394dd255..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/lib/get_aria_name.ts +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { words } from 'lodash'; - -import { Query } from '@elastic/eui'; - -import { CATEGORY_FIELD } from '../components/search/search'; - -const mapWords = (name?: string): string => - words(name ?? '') - .map((word) => word.toLowerCase()) - .join(' '); - -/** - * @name {string} the name of the configuration object - * @returns {string} a space delimited, lowercase string with - * special characters removed. - * - * Examples: - * - `xPack:fooBar:foo_bar_baz` -> `x pack foo bar foo bar baz` - * - `xPack:fooBar:foo_bar_baz category:(general)` -> `x pack foo bar foo bar baz category:(general)` - */ -export function getAriaName(name?: string) { - if (!name) { - return ''; - } - - const query = Query.parse(name); - - if (query.hasOrFieldClause(CATEGORY_FIELD)) { - const categories = query.getOrFieldClause(CATEGORY_FIELD); - const termValue = mapWords(query.removeOrFieldClauses(CATEGORY_FIELD).text); - - if (!categories || !Array.isArray(categories.value)) { - return termValue; - } - - let categoriesQuery = Query.parse(''); - categories.value.forEach((v) => { - categoriesQuery = categoriesQuery.addOrFieldValue(CATEGORY_FIELD, v); - }); - - return `${termValue} ${categoriesQuery.text}`; - } - - return mapWords(name); -} diff --git a/src/plugins/advanced_settings/public/management_app/lib/get_category_name.test.ts b/src/plugins/advanced_settings/public/management_app/lib/get_category_name.test.ts deleted file mode 100644 index 22fe8f7a378a5..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/lib/get_category_name.test.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import expect from '@kbn/expect'; -import { getCategoryName } from './get_category_name'; - -describe('Settings', function () { - describe('Advanced', function () { - describe('getCategoryName(category)', function () { - it('should capitalize unknown category', function () { - expect(getCategoryName('elasticsearch')).to.be('Elasticsearch'); - }); - - it('should return empty string for no category', function () { - expect(getCategoryName()).to.be(''); - expect(getCategoryName('')).to.be(''); - }); - }); - }); -}); diff --git a/src/plugins/advanced_settings/public/management_app/lib/get_category_name.ts b/src/plugins/advanced_settings/public/management_app/lib/get_category_name.ts deleted file mode 100644 index 7341104bf2abb..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/lib/get_category_name.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { i18n } from '@kbn/i18n'; - -const upperFirst = (str = '') => str.replace(/^./, (strng) => strng.toUpperCase()); - -const names: Record = { - general: i18n.translate('advancedSettings.categoryNames.generalLabel', { - defaultMessage: 'General', - }), - machineLearning: i18n.translate('advancedSettings.categoryNames.machineLearningLabel', { - defaultMessage: 'Machine Learning', - }), - observability: i18n.translate('advancedSettings.categoryNames.observabilityLabel', { - defaultMessage: 'Observability', - }), - timelion: i18n.translate('advancedSettings.categoryNames.timelionLabel', { - defaultMessage: 'Timelion', - }), - notifications: i18n.translate('advancedSettings.categoryNames.notificationsLabel', { - defaultMessage: 'Notifications', - }), - visualizations: i18n.translate('advancedSettings.categoryNames.visualizationsLabel', { - defaultMessage: 'Visualizations', - }), - discover: i18n.translate('advancedSettings.categoryNames.discoverLabel', { - defaultMessage: 'Discover', - }), - dashboard: i18n.translate('advancedSettings.categoryNames.dashboardLabel', { - defaultMessage: 'Dashboard', - }), - reporting: i18n.translate('advancedSettings.categoryNames.reportingLabel', { - defaultMessage: 'Reporting', - }), - search: i18n.translate('advancedSettings.categoryNames.searchLabel', { - defaultMessage: 'Search', - }), - securitySolution: i18n.translate('advancedSettings.categoryNames.securitySolutionLabel', { - defaultMessage: 'Security Solution', - }), - enterpriseSearch: i18n.translate('advancedSettings.categoryNames.enterpriseSearchLabel', { - defaultMessage: 'Enterprise Search', - }), -}; - -export function getCategoryName(category?: string) { - return category ? names[category] || upperFirst(category) : ''; -} diff --git a/src/plugins/advanced_settings/public/management_app/lib/get_val_type.test.ts b/src/plugins/advanced_settings/public/management_app/lib/get_val_type.test.ts deleted file mode 100644 index 308f471620e56..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/lib/get_val_type.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import expect from '@kbn/expect'; -import { getValType } from './get_val_type'; - -describe('Settings', function () { - describe('Advanced', function () { - describe('getValType(def, val)', function () { - it('should return the explicitly defined type of a setting', function () { - expect(getValType({ type: 'string' })).to.be('string'); - expect(getValType({ type: 'json' })).to.be('json'); - expect(getValType({ type: 'string', value: 5 })).to.be('string'); - }); - - it('should return array if the value is an Array and there is no defined type', function () { - expect(getValType({ type: 'string' }, [1, 2, 3])).to.be('string'); - expect(getValType({ type: 'json', value: [1, 2, 3] })).to.be('json'); - - expect(getValType({ value: 'someString' }, [1, 2, 3])).to.be('array'); - expect(getValType({ value: [1, 2, 3] }, 'someString')).to.be('array'); - }); - - it('should return the type of the default value if there is no type and it is not an array', function () { - expect(getValType({ value: 'someString' })).to.be('string'); - expect(getValType({ value: 'someString' }, 42)).to.be('string'); - }); - - it('should return the type of the value if the default value is null', function () { - expect(getValType({ value: null }, 'someString')).to.be('string'); - }); - }); - }); -}); diff --git a/src/plugins/advanced_settings/public/management_app/lib/get_val_type.ts b/src/plugins/advanced_settings/public/management_app/lib/get_val_type.ts deleted file mode 100644 index eeee280f826ae..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/lib/get_val_type.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -/** - * @param {object} advanced setting definition object - * @param {?} current value of the setting - * @returns {string} the type to use for determining the display and editor - */ - -import { UiSettingsType } from '@kbn/core/public'; -import { FieldSetting } from '../types'; - -export function getValType(def: Partial, value?: any): UiSettingsType { - if (def.type) { - return def.type; - } - - if (Array.isArray(value) || Array.isArray(def.value)) { - return 'array'; - } - - const typeofVal = def.value != null ? typeof def.value : typeof value; - - if (typeofVal === 'bigint') { - return 'number'; - } - - if (typeofVal === 'symbol' || typeofVal === 'object' || typeofVal === 'function') { - throw new Error( - `incompatible UiSettingsType: '${def.name}' type ${typeofVal} | ${JSON.stringify(def)}` - ); - } - - return typeofVal; -} diff --git a/src/plugins/advanced_settings/public/management_app/lib/index.ts b/src/plugins/advanced_settings/public/management_app/lib/index.ts deleted file mode 100644 index 7b812f031a8b7..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/lib/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -export { isDefaultValue } from './is_default_value'; -export { toEditableConfig } from './to_editable_config'; -export { getCategoryName } from './get_category_name'; -export { DEFAULT_CATEGORY } from './default_category'; -export { getAriaName } from './get_aria_name'; -export { fieldSorter } from './sort_fields'; diff --git a/src/plugins/advanced_settings/public/management_app/lib/is_default_value.test.ts b/src/plugins/advanced_settings/public/management_app/lib/is_default_value.test.ts deleted file mode 100644 index 4828ea957718d..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/lib/is_default_value.test.ts +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import expect from '@kbn/expect'; -import { isDefaultValue } from './is_default_value'; -import { UiSettingsType } from '@kbn/core/public'; - -describe('Settings', function () { - describe('Advanced', function () { - describe('getCategoryName(category)', function () { - describe('when given a setting definition object', function () { - const setting = { - isCustom: false, - value: 'value', - defVal: 'defaultValue', - displayName: 'displayName', - name: 'name', - ariaName: 'ariaName', - description: 'description', - requiresPageReload: false, - type: 'string' as UiSettingsType, - isOverridden: false, - readOnly: false, - options: [], - optionLabels: { option: 'label' }, - category: ['category'], - validation: { regex: /regexString/, message: 'validation description' }, - }; - - describe('that is custom', function () { - it('should return true', function () { - expect(isDefaultValue({ ...setting, isCustom: true })).to.be(true); - }); - }); - - describe('without a value', function () { - it('should return false for empty string but true for undefined', function () { - expect(isDefaultValue({ ...setting, value: undefined })).to.be(true); - expect(isDefaultValue({ ...setting, value: '' })).to.be(false); - }); - }); - - describe('with a value that is the same as the default value', function () { - it('should return true', function () { - expect(isDefaultValue({ ...setting, value: 'defaultValue' })).to.be(true); - expect(isDefaultValue({ ...setting, value: [], defVal: [] })).to.be(true); - expect( - isDefaultValue({ ...setting, value: '{"foo":"bar"}', defVal: '{"foo":"bar"}' }) - ).to.be(true); - expect(isDefaultValue({ ...setting, value: 123, defVal: 123 })).to.be(true); - expect(isDefaultValue({ ...setting, value: 456, defVal: '456' })).to.be(true); - expect(isDefaultValue({ ...setting, value: false, defVal: false })).to.be(true); - }); - }); - - describe('with a value that is different than the default value', function () { - it('should return false', function () { - expect(isDefaultValue({ ...setting })).to.be(false); - expect(isDefaultValue({ ...setting, value: [1], defVal: [2] })).to.be(false); - expect( - isDefaultValue({ ...setting, value: '{"foo":"bar"}', defVal: '{"foo2":"bar2"}' }) - ).to.be(false); - expect(isDefaultValue({ ...setting, value: 123, defVal: 1234 })).to.be(false); - expect(isDefaultValue({ ...setting, value: 456, defVal: '4567' })).to.be(false); - expect(isDefaultValue({ ...setting, value: true, defVal: false })).to.be(false); - }); - }); - }); - }); - }); -}); diff --git a/src/plugins/advanced_settings/public/management_app/lib/sort_fields.test.ts b/src/plugins/advanced_settings/public/management_app/lib/sort_fields.test.ts deleted file mode 100644 index ae2d6c609ac60..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/lib/sort_fields.test.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { FieldSetting } from '../types'; -import { fieldSorter } from './sort_fields'; - -const createField = (parts: Partial): FieldSetting => ({ - displayName: 'displayName', - name: 'field', - value: 'value', - requiresPageReload: false, - type: 'string', - category: [], - ariaName: 'ariaName', - isOverridden: false, - defVal: 'defVal', - isCustom: false, - ...parts, -}); - -describe('fieldSorter', () => { - it('sort fields based on their `order` field if present on both', () => { - const fieldA = createField({ order: 3 }); - const fieldB = createField({ order: 1 }); - const fieldC = createField({ order: 2 }); - - expect([fieldA, fieldB, fieldC].sort(fieldSorter)).toEqual([fieldB, fieldC, fieldA]); - }); - it('fields with order defined are ordered first', () => { - const fieldA = createField({ order: 2 }); - const fieldB = createField({ order: undefined }); - const fieldC = createField({ order: 1 }); - - expect([fieldA, fieldB, fieldC].sort(fieldSorter)).toEqual([fieldC, fieldA, fieldB]); - }); - it('sorts by `name` when fields have the same `order`', () => { - const fieldA = createField({ order: 2, name: 'B' }); - const fieldB = createField({ order: 1 }); - const fieldC = createField({ order: 2, name: 'A' }); - - expect([fieldA, fieldB, fieldC].sort(fieldSorter)).toEqual([fieldB, fieldC, fieldA]); - }); - - it('sorts by `name` when fields have no `order`', () => { - const fieldA = createField({ order: undefined, name: 'B' }); - const fieldB = createField({ order: undefined, name: 'A' }); - const fieldC = createField({ order: 1 }); - - expect([fieldA, fieldB, fieldC].sort(fieldSorter)).toEqual([fieldC, fieldB, fieldA]); - }); -}); diff --git a/src/plugins/advanced_settings/public/management_app/lib/sort_fields.ts b/src/plugins/advanced_settings/public/management_app/lib/sort_fields.ts deleted file mode 100644 index 90bfa18d2198e..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/lib/sort_fields.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { Comparators } from '@elastic/eui'; -import { FieldSetting } from '../types'; - -const cmp = Comparators.default('asc'); - -export const fieldSorter = (a: FieldSetting, b: FieldSetting): number => { - const aOrder = a.order !== undefined; - const bOrder = b.order !== undefined; - - if (aOrder && bOrder) { - if (a.order === b.order) { - return cmp(a.name, b.name); - } - return cmp(a.order, b.order); - } - if (aOrder) { - return -1; - } - if (bOrder) { - return 1; - } - return cmp(a.name, b.name); -}; diff --git a/src/plugins/advanced_settings/public/management_app/lib/to_editable_config.test.ts b/src/plugins/advanced_settings/public/management_app/lib/to_editable_config.test.ts deleted file mode 100644 index 7de174d409b55..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/lib/to_editable_config.test.ts +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { PublicUiSettingsParams } from '@kbn/core/public'; -import expect from '@kbn/expect'; -import { toEditableConfig } from './to_editable_config'; - -const defDefault = { - isOverridden: true, -}; - -function invoke({ - def = defDefault, - name = 'woah', - value = 'forreal', -}: { - def?: PublicUiSettingsParams & { isOverridden?: boolean }; - name?: string; - value?: any; -}) { - return toEditableConfig({ def, name, value, isCustom: def === defDefault, isOverridden: true }); -} - -describe('Settings', function () { - describe('Advanced', function () { - describe('toEditableConfig(def, name, value)', function () { - it('sets name', function () { - expect(invoke({ name: 'who' }).name).to.equal('who'); - }); - - it('sets value', function () { - expect(invoke({ value: 'what' }).value).to.equal('what'); - }); - - it('sets type', function () { - expect(invoke({ value: 'what' }).type).to.be('string'); - expect(invoke({ value: 0 }).type).to.be('number'); - expect(invoke({ value: [] }).type).to.be('array'); - }); - - describe('when given a setting definition object', function () { - let def: PublicUiSettingsParams & { isOverridden?: boolean }; - beforeEach(function () { - def = { - value: 'the original', - description: 'the one and only', - options: ['all the options'], - }; - }); - - it('is not marked as custom', function () { - expect(invoke({ def }).isCustom).to.be(false); - }); - - it('sets a default value', function () { - expect(invoke({ def }).defVal).to.equal(def.value); - }); - - it('sets a description', function () { - expect(invoke({ def }).description).to.equal(def.description); - }); - - it('sets options', function () { - expect(invoke({ def }).options).to.equal(def.options); - }); - - describe('that contains a type', function () { - it('sets that type', function () { - def.type = 'string'; - expect(invoke({ def }).type).to.equal(def.type); - }); - }); - - describe('that contains a value of type array', function () { - it('sets type to array', function () { - def.value = []; - expect(invoke({ def }).type).to.equal('array'); - }); - }); - }); - - describe('when not given a setting definition object', function () { - it('is marked as custom', function () { - expect(invoke({}).isCustom).to.be(true); - }); - - it('sets defVal to undefined', function () { - expect(invoke({}).defVal).to.be(undefined); - }); - - it('sets description to undefined', function () { - expect(invoke({}).description).to.be(undefined); - }); - - it('sets options to undefined', function () { - expect(invoke({}).options).to.be(undefined); - }); - }); - }); - }); -}); diff --git a/src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts b/src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts deleted file mode 100644 index b7a08888bb76a..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { PublicUiSettingsParams, UserProvidedValues, SavedObjectAttribute } from '@kbn/core/public'; -import { FieldSetting } from '../types'; -import { getValType } from './get_val_type'; -import { getAriaName } from './get_aria_name'; -import { DEFAULT_CATEGORY } from './default_category'; - -/** - * @param {object} advanced setting definition object - * @param {object} name of setting - * @param {object} current value of setting - * @returns {object} the editable config object - */ -export function toEditableConfig({ - def, - name, - value, - isCustom, - isOverridden, -}: { - def: PublicUiSettingsParams & UserProvidedValues; - name: string; - value: SavedObjectAttribute; - isCustom: boolean; - isOverridden: boolean; -}) { - if (!def) { - def = {}; - } - - const conf: FieldSetting = { - name, - displayName: def.name || name, - ariaName: def.name || getAriaName(name), - value, - category: def.category && def.category.length ? def.category : [DEFAULT_CATEGORY], - isCustom, - isOverridden, - readOnly: !!def.readonly, - defVal: def.value, - type: getValType(def, value), - description: def.description, - deprecation: def.deprecation, - options: def.options, - optionLabels: def.optionLabels, - order: def.order, - requiresPageReload: !!def.requiresPageReload, - metric: def.metric, - }; - - return conf; -} diff --git a/src/plugins/advanced_settings/public/management_app/mount_management_section.tsx b/src/plugins/advanced_settings/public/management_app/mount_management_section.tsx deleted file mode 100644 index d41f1f1cacfe4..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/mount_management_section.tsx +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React from 'react'; -import ReactDOM from 'react-dom'; -import { Redirect, RouteChildrenProps } from 'react-router-dom'; -import { Router, Routes, Route } from '@kbn/shared-ux-router'; - -import { i18n } from '@kbn/i18n'; - -import { LocationDescriptor } from 'history'; -import { url } from '@kbn/kibana-utils-plugin/public'; -import { ManagementAppMountParams } from '@kbn/management-plugin/public'; -import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; -import { StartServicesAccessor } from '@kbn/core/public'; -import type { SectionRegistryStart } from '@kbn/management-settings-section-registry'; -import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; - -import { QUERY } from './advanced_settings'; -import { Settings } from './settings'; - -import './index.scss'; - -const title = i18n.translate('advancedSettings.advancedSettingsLabel', { - defaultMessage: 'Advanced Settings', -}); -const crumb = [{ text: title }]; - -const readOnlyBadge = { - text: i18n.translate('advancedSettings.badge.readOnly.text', { - defaultMessage: 'Read only', - }), - tooltip: i18n.translate('advancedSettings.badge.readOnly.tooltip', { - defaultMessage: 'Unable to save advanced settings', - }), - iconType: 'glasses', -}; - -type RedirectUrlProps = RouteChildrenProps<{ [QUERY]: string }>; - -const redirectUrl = ({ match, location }: RedirectUrlProps): LocationDescriptor => { - const search = url.addQueryParam(location.search, QUERY, match?.params[QUERY]); - - return { - pathname: '/', - search, - }; -}; - -export async function mountManagementSection( - getStartServices: StartServicesAccessor, - params: ManagementAppMountParams, - sectionRegistry: SectionRegistryStart, - usageCollection?: UsageCollectionSetup -) { - params.setBreadcrumbs(crumb); - const [{ settings, notifications, docLinks, application, chrome, i18n: i18nStart, theme }] = - await getStartServices(); - - const { advancedSettings, globalSettings } = application.capabilities; - const canSaveAdvancedSettings = advancedSettings.save as boolean; - const canSaveGlobalSettings = globalSettings.save as boolean; - const canShowGlobalSettings = globalSettings.show as boolean; - const trackUiMetric = usageCollection?.reportUiCounter.bind(usageCollection, 'advanced_settings'); - if (!canSaveAdvancedSettings || (!canSaveGlobalSettings && canShowGlobalSettings)) { - chrome.setBadge(readOnlyBadge); - } - - chrome.docTitle.change(title); - - ReactDOM.render( - - - - {/* TODO: remove route param (`query`) in 7.13 */} - - {(props: RedirectUrlProps) => } - - - - - - - , - params.element - ); - return () => { - chrome.docTitle.reset(); - ReactDOM.unmountComponentAtNode(params.element); - }; -} diff --git a/src/plugins/advanced_settings/public/management_app/settings.test.tsx b/src/plugins/advanced_settings/public/management_app/settings.test.tsx deleted file mode 100644 index a98b29922af1a..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/settings.test.tsx +++ /dev/null @@ -1,376 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React from 'react'; -import { Observable } from 'rxjs'; -import { ReactWrapper } from 'enzyme'; -import { mountWithI18nProvider } from '@kbn/test-jest-helpers'; -import dedent from 'dedent'; -import { PublicUiSettingsParams, UserProvidedValues, UiSettingsType } from '@kbn/core/public'; -import { settingsServiceMock } from '@kbn/core-ui-settings-browser-mocks'; - -import { FieldSetting } from './types'; -import { Settings } from './settings'; -import { - notificationServiceMock, - docLinksServiceMock, - themeServiceMock, -} from '@kbn/core/public/mocks'; -import { SectionRegistry } from '@kbn/management-settings-section-registry'; -import { Search } from './components/search'; -import { EuiTab } from '@elastic/eui'; - -jest.mock('./components/field', () => ({ - Field: () => { - return 'field'; - }, -})); - -jest.mock('./components/call_outs', () => ({ - CallOuts: () => { - return 'callOuts'; - }, -})); - -jest.mock('./components/search', () => ({ - Search: () => { - return 'search'; - }, -})); - -function mockConfig() { - const defaultConfig: Partial = { - displayName: 'defaultName', - requiresPageReload: false, - isOverridden: false, - ariaName: 'ariaName', - readOnly: false, - isCustom: false, - defVal: 'defVal', - type: 'string' as UiSettingsType, - category: ['category'], - }; - - const config = { - set: (key: string, value: any) => Promise.resolve(true), - remove: (key: string) => Promise.resolve(true), - isCustom: (key: string) => false, - isOverridden: (key: string) => Boolean(config.getAll()[key].isOverridden), - getRegistered: () => ({} as Readonly>), - getUpdate$: () => - new Observable<{ - key: string; - newValue: any; - oldValue: any; - }>(), - isDeclared: (key: string) => true, - isDefault: (key: string) => true, - - getSaved$: () => - new Observable<{ - key: string; - newValue: any; - oldValue: any; - }>(), - - getUpdateErrors$: () => new Observable(), - get: (key: string, defaultOverride?: any): any => config.getAll()[key] || defaultOverride, - get$: (key: string) => new Observable(config.get(key)), - getAll: (): Readonly> => { - return { - 'test:array:setting': { - ...defaultConfig, - value: ['default_value'], - name: 'Test array setting', - description: 'Description for Test array setting', - category: ['elasticsearch'], - }, - 'test:boolean:setting': { - ...defaultConfig, - value: true, - name: 'Test boolean setting', - description: 'Description for Test boolean setting', - category: ['elasticsearch'], - }, - 'test:image:setting': { - ...defaultConfig, - value: null, - name: 'Test image setting', - description: 'Description for Test image setting', - type: 'image', - }, - 'test:json:setting': { - ...defaultConfig, - value: '{"foo": "bar"}', - name: 'Test json setting', - description: 'Description for Test json setting', - type: 'json', - }, - 'test:markdown:setting': { - ...defaultConfig, - value: '', - name: 'Test markdown setting', - description: 'Description for Test markdown setting', - type: 'markdown', - }, - 'test:number:setting': { - ...defaultConfig, - value: 5, - name: 'Test number setting', - description: 'Description for Test number setting', - }, - 'test:select:setting': { - ...defaultConfig, - value: 'orange', - name: 'Test select setting', - description: 'Description for Test select setting', - type: 'select', - options: ['apple', 'orange', 'banana'], - }, - 'test:string:setting': { - ...defaultConfig, - ...{ - value: null, - name: 'Test string setting', - description: 'Description for Test string setting', - type: 'string', - isCustom: true, - }, - }, - 'test:readonlystring:setting': { - ...defaultConfig, - ...{ - value: null, - name: 'Test readonly string setting', - description: 'Description for Test readonly string setting', - type: 'string', - readOnly: true, - }, - }, - 'test:customstring:setting': { - ...defaultConfig, - ...{ - value: null, - name: 'Test custom string setting', - description: 'Description for Test custom string setting', - type: 'string', - isCustom: true, - }, - }, - 'test:isOverridden:string': { - ...defaultConfig, - isOverridden: true, - value: 'foo', - name: 'An overridden string', - description: 'Description for overridden string', - type: 'string', - }, - 'test:isOverridden:number': { - ...defaultConfig, - isOverridden: true, - value: 1234, - name: 'An overridden number', - description: 'Description for overridden number', - type: 'number', - }, - 'test:isOverridden:json': { - ...defaultConfig, - isOverridden: true, - value: dedent` - { - "foo": "bar" - } - `, - name: 'An overridden json', - description: 'Description for overridden json', - type: 'json', - }, - 'test:isOverridden:select': { - ...defaultConfig, - isOverridden: true, - value: 'orange', - name: 'Test overridden select setting', - description: 'Description for overridden select setting', - type: 'select', - options: ['apple', 'orange', 'banana'], - }, - }; - }, - validateValue: (key: string, value: any) => - Promise.resolve({ successfulValidation: true, valid: true }), - }; - return { - core: { - settings: { - client: config, - globalClient: settingsServiceMock.createStartContract().globalClient, - }, - }, - plugins: { - advancedSettings: { - componentRegistry: { - get: () => { - const foo: React.ComponentType = () =>
Hello
; - foo.displayName = 'foo_component'; - return foo; - }, - componentType: { - PAGE_TITLE_COMPONENT: 'page_title_component', - PAGE_SUBTITLE_COMPONENT: 'page_subtitle_component', - }, - }, - }, - }, - }; -} - -describe('Settings', () => { - const defaultQuery = 'test:string:setting'; - const mockHistory = { - listen: jest.fn(), - } as any; - const locationSpy = jest.spyOn(window, 'location', 'get'); - - afterAll(() => { - locationSpy.mockRestore(); - }); - - const mockQuery = (query = defaultQuery) => { - locationSpy.mockImplementation( - () => - ({ - search: `?query=${query}`, - } as any) - ); - }; - - it('should render specific setting if given setting key', async () => { - mockQuery(); - const component = mountWithI18nProvider( - - ); - - expect( - component - .find('Field') - .filterWhere( - (n: ReactWrapper) => (n.prop('setting') as Record).name === defaultQuery - ) - ).toHaveLength(1); - }); - - it('should not render a custom setting', async () => { - // The manual mock for the uiSettings client returns false for isConfig, override that - const uiSettings = mockConfig().core.settings.client; - uiSettings.isCustom = (key) => true; - - const customSettingQuery = 'test:customstring:setting'; - mockQuery(customSettingQuery); - const component = mountWithI18nProvider( - - ); - - expect(component.find('Field')).not.toBeNull(); - expect( - component - .find('Field') - .filterWhere( - (n: ReactWrapper) => - (n.prop('setting') as Record).name === customSettingQuery - ) - ).toEqual({}); - }); - - it('should render read-only when saving is disabled', async () => { - mockQuery(); - const component = mountWithI18nProvider( - - ); - - expect(component.find('Field')).not.toBeNull(); - expect( - component - .find('Field') - .filterWhere( - (n: ReactWrapper) => (n.prop('setting') as Record).name === defaultQuery - ) - .prop('enableSaving') - ).toBe(false); - }); - - it('should render unfiltered with query parsing error', async () => { - const badQuery = 'category:(accessibility))'; - mockQuery(badQuery); - const { toasts } = notificationServiceMock.createStartContract(); - - const component = mountWithI18nProvider( - - ); - - expect(toasts.addWarning).toHaveBeenCalledTimes(1); - expect(component.find(Search).prop('query').text).toEqual(''); - }); - - it('does not render global settings if show is set to false', async () => { - const badQuery = 'category:(accessibility))'; - mockQuery(badQuery); - const { toasts } = notificationServiceMock.createStartContract(); - - const component = mountWithI18nProvider( - - ); - - expect(component.find(EuiTab).length).toEqual(1); - expect(component.find(EuiTab).at(0).text()).toEqual('Space Settings'); - }); -}); diff --git a/src/plugins/advanced_settings/public/management_app/settings.tsx b/src/plugins/advanced_settings/public/management_app/settings.tsx deleted file mode 100644 index ae5837a97cbec..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/settings.tsx +++ /dev/null @@ -1,369 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ -import React, { useState, useCallback, useMemo } from 'react'; -import useEffectOnce from 'react-use/lib/useEffectOnce'; -import { - EuiSpacer, - Query, - EuiNotificationBadge, - EuiTab, - EuiTabs, - EuiFlexGroup, - EuiFlexItem, - EuiText, -} from '@elastic/eui'; -import { ScopedHistory } from '@kbn/core-application-browser'; -import { SettingsStart } from '@kbn/core-ui-settings-browser'; -import { DocLinksStart } from '@kbn/core-doc-links-browser'; -import { ToastsStart } from '@kbn/core-notifications-browser'; -import { ThemeServiceStart } from '@kbn/core-theme-browser'; -import { UiCounterMetricType } from '@kbn/analytics'; -import { url } from '@kbn/kibana-utils-plugin/common'; -import { parse } from 'query-string'; -import { UiSettingsScope } from '@kbn/core-ui-settings-common'; -import type { SectionRegistryStart } from '@kbn/management-settings-section-registry'; -import type { RegistryEntry } from '@kbn/management-settings-section-registry'; -import { mapConfig, mapSettings, initCategoryCounts, initCategories } from './settings_helper'; -import { parseErrorMsg } from './components/search/search'; -import { AdvancedSettings, QUERY } from './advanced_settings'; -import { Search } from './components/search'; -import { FieldSetting } from './types'; -import { i18nTexts } from './i18n_texts'; -import { getAriaName } from './lib'; - -interface AdvancedSettingsState { - query: Query; - filteredSettings: Record>; - filteredSections: { - global: RegistryEntry[]; - space: RegistryEntry[]; - }; -} - -export type GroupedSettings = Record; - -interface Props { - history: ScopedHistory; - enableSaving: Record; - enableShowing: Record; - settingsService: SettingsStart; - docLinks: DocLinksStart['links']; - toasts: ToastsStart; - theme: ThemeServiceStart['theme$']; - sectionRegistry: SectionRegistryStart; - trackUiMetric?: (metricType: UiCounterMetricType, eventName: string | string[]) => void; -} - -const SPACE_SETTINGS_ID = 'space-settings'; -const GLOBAL_SETTINGS_ID = 'global-settings'; - -export const Settings = (props: Props) => { - const { sectionRegistry, history, settingsService, enableSaving, enableShowing, ...rest } = props; - const uiSettings = settingsService.client; - const globalUiSettings = settingsService.globalClient; - - const [settings, setSettings] = useState(mapConfig(uiSettings)); - const [globalSettings, setGlobalSettings] = useState(mapConfig(globalUiSettings)); - - const [groupedSettings, setGroupedSettings] = useState>({ - namespace: mapSettings(settings), - global: mapSettings(globalSettings), - }); - - const [categoryCounts, setCategoryCounts] = useState< - Record> - >({ - namespace: initCategoryCounts(groupedSettings.namespace), - global: initCategoryCounts(groupedSettings.global), - }); - - const [categories, setCategories] = useState>({ - namespace: initCategories(groupedSettings.namespace), - global: initCategories(groupedSettings.global), - }); - - const [queryState, setQueryState] = useState({ - filteredSettings: { - global: {}, - namespace: {}, - }, - filteredSections: { - global: sectionRegistry.getGlobalSections(), - space: sectionRegistry.getSpacesSections(), - }, - query: Query.parse(''), - }); - - const setTimeoutCallback = () => { - const { hash } = window.location; - const id = hash.replace('#', ''); - const element = document.getElementById(id); - - let globalNavOffset = 0; - - const globalNavBars = document - .getElementById('globalHeaderBars') - ?.getElementsByClassName('euiHeader'); - - if (globalNavBars) { - Array.from(globalNavBars).forEach((navBar) => { - globalNavOffset += (navBar as HTMLDivElement).offsetHeight; - }); - } - - if (element) { - element.scrollIntoView(); - window.scrollBy(0, -globalNavOffset); // offsets scroll by height of the global nav - } - }; - - useEffectOnce(() => { - setQueryState(getQueryState(undefined, true)); - - const subscription = (mappedSettings: FieldSetting[], scope: UiSettingsScope) => { - const grouped = { ...groupedSettings }; - grouped[scope] = mapSettings(mappedSettings); - setGroupedSettings(grouped); - - const updatedCategories = { ...categories }; - updatedCategories[scope] = initCategories(groupedSettings[scope]); - setCategories(updatedCategories); - - const updatedCategoryCounts = { ...categoryCounts }; - updatedCategoryCounts[scope] = initCategoryCounts(groupedSettings[scope]); - setCategoryCounts(updatedCategoryCounts); - const updatedQueryState = { ...getQueryState(undefined, true) }; - updatedQueryState.filteredSettings[scope] = mapSettings( - Query.execute(updatedQueryState.query, mappedSettings) - ); - setQueryState(updatedQueryState); - }; - - const uiSettingsSubscription = uiSettings.getUpdate$().subscribe(() => { - const updatedSettings = mapConfig(uiSettings); - setSettings(updatedSettings); - subscription(updatedSettings, 'namespace'); - }); - const globalUiSettingsSubscription = globalUiSettings.getUpdate$().subscribe(() => { - const mappedSettings = mapConfig(globalUiSettings); - setGlobalSettings(mappedSettings); - subscription(mappedSettings, 'global'); - }); - if (window.location.hash !== '') { - setTimeout(() => setTimeoutCallback(), 0); - } - const unregister = history.listen(({ search }) => { - setQueryState(getQueryState(search)); - }); - return () => { - unregister(); - uiSettingsSubscription.unsubscribe(); - globalUiSettingsSubscription.unsubscribe(); - }; - }); - - const setUrlQuery = useCallback( - (query: string = '') => { - const search = url.addQueryParam(window.location.search, QUERY, query); - - history.push({ - pathname: '', // remove any route query param - search, - }); - }, - [history] - ); - - const searchCategories = useMemo(() => { - return categories.global.concat(categories.namespace); - }, [categories.global, categories.namespace]); - - const callOutTitle = (scope: UiSettingsScope) => { - if (scope === 'namespace') { - return i18nTexts.defaultSpaceCalloutTitle; - } - return i18nTexts.globalCalloutTitle; - }; - - const callOutSubtitle = (scope: UiSettingsScope) => { - if (scope === 'namespace') { - return i18nTexts.defaultSpaceCalloutSubtitle; - } - return i18nTexts.globalCalloutSubtitle; - }; - - const getClientForScope = (scope: UiSettingsScope) => { - if (scope === 'namespace') { - return uiSettings; - } - return globalUiSettings; - }; - - const renderAdvancedSettings = (scope: UiSettingsScope) => { - return ( - setUrlQuery('')} - noResults={ - queryState.filteredSections.global.length + queryState.filteredSections.space.length === 0 - } - queryText={queryState.query.text} - callOutTitle={callOutTitle(scope)} - callOutSubtitle={callOutSubtitle(scope)} - settingsService={settingsService} - uiSettingsClient={getClientForScope(scope)} - enableSaving={enableSaving[scope]} - {...rest} - /> - ); - }; - - const tabs = [ - { - id: SPACE_SETTINGS_ID, - name: i18nTexts.defaultSpaceTabTitle, - append: - queryState.query.text !== '' ? ( - - {Object.keys(queryState.filteredSettings.namespace).length + - queryState.filteredSections.space.length} - - ) : null, - content: renderAdvancedSettings('namespace'), - }, - ]; - if (enableShowing.global) { - tabs.push({ - id: GLOBAL_SETTINGS_ID, - name: i18nTexts.globalTabTitle, - append: - queryState.query.text !== '' ? ( - - {Object.keys(queryState.filteredSettings.global).length + - queryState.filteredSections.global.length} - - ) : null, - content: renderAdvancedSettings('global'), - }); - } - - const [selectedTabId, setSelectedTabId] = useState(SPACE_SETTINGS_ID); - - const selectedTabContent = tabs.find((obj) => obj.id === selectedTabId)?.content; - - const onSelectedTabChanged = (id: string) => { - setSelectedTabId(id); - }; - - const renderTabs = () => { - return tabs.map((tab, index) => ( - onSelectedTabChanged(tab.id)} - isSelected={tab.id === selectedTabId} - append={tab.append} - > - {tab.name} - - )); - }; - - const getQuery = (queryString: string, initialQuery = false): Query => { - try { - const query = initialQuery ? getAriaName(queryString) : queryString ?? ''; - return Query.parse(query); - } catch ({ message }) { - props.toasts.addWarning({ - title: parseErrorMsg, - text: message, - }); - return Query.parse(''); - } - }; - - const getQueryText = (search?: string): string => { - const queryParams = parse(search ?? window.location.search) ?? {}; - return (queryParams[QUERY] as string) ?? ''; - }; - - const getQueryState = (search?: string, initialQuery = false): AdvancedSettingsState => { - const queryString = getQueryText(search); - const query = getQuery(queryString, initialQuery); - const filteredSettings = { - namespace: mapSettings(Query.execute(query, settings)), - global: mapSettings(Query.execute(query, globalSettings)), - }; - - return { - query, - filteredSettings, - filteredSections: { - global: sectionRegistry - .getGlobalSections() - .filter(({ queryMatch }) => queryMatch(query.text)), - space: sectionRegistry - .getSpacesSections() - .filter(({ queryMatch }) => queryMatch(query.text)), - }, - }; - }; - - const onQueryChange = useCallback( - ({ query }: { query: Query }) => { - setUrlQuery(query.text); - }, - [setUrlQuery] - ); - - const PageTitle = ( - -

{i18nTexts.advancedSettingsTitle}

-
- ); - - const mapSections = (entries: RegistryEntry[]) => - entries.map(({ Component, queryMatch }, index) => { - if (queryMatch(queryState.query.text)) { - return ( - - ); - } - return null; - }); - - return ( -
- - {PageTitle} - - - - - - {renderTabs()} - {selectedTabContent} - {selectedTabId === SPACE_SETTINGS_ID ? ( - <>{mapSections(queryState.filteredSections.space)} - ) : ( - <>{mapSections(queryState.filteredSections.global)} - )} -
- ); -}; diff --git a/src/plugins/advanced_settings/public/management_app/settings_helper.test.ts b/src/plugins/advanced_settings/public/management_app/settings_helper.test.ts deleted file mode 100644 index e4aaab4bb3054..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/settings_helper.test.ts +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { UiSettingsType, UserProvidedValues } from '@kbn/core-ui-settings-common'; -import { PublicUiSettingsParams } from '@kbn/core/public'; -import { Observable } from 'rxjs'; -import { FieldSetting } from './types'; -import { mapConfig, mapSettings, initCategoryCounts, initCategories } from './settings_helper'; - -describe('Settings Helper', () => { - const defaultConfig: Partial = { - displayName: 'defaultName', - requiresPageReload: false, - isOverridden: false, - ariaName: 'ariaName', - readOnly: false, - isCustom: false, - defVal: 'defVal', - type: 'string' as UiSettingsType, - category: ['category'], - }; - - const arraySetting = { - 'test:array:setting': { - ...defaultConfig, - value: ['default_value'], - name: 'Test array setting', - description: 'Description for Test array setting', - category: ['elasticsearch'], - }, - }; - - const booleanSetting = { - 'test:boolean:setting': { - ...defaultConfig, - value: true, - name: 'Test boolean setting', - description: 'Description for Test boolean setting', - category: ['elasticsearch'], - }, - }; - - const imageSetting = { - 'test:image:setting': { - ...defaultConfig, - value: null, - name: 'Test image setting', - description: 'Description for Test image setting', - type: 'image' as UiSettingsType, - }, - }; - - const arrayFieldSetting = { - ariaName: 'Test array setting', - category: ['elasticsearch'], - defVal: ['default_value'], - description: 'Description for Test array setting', - displayName: 'Test array setting', - isCustom: false, - isOverridden: false, - name: 'test:array:setting', - readOnly: false, - requiresPageReload: false, - type: 'string' as UiSettingsType, - }; - - const booleanFieldSetting = { - ariaName: 'Test boolean setting', - category: ['elasticsearch'], - defVal: true, - description: 'Description for Test boolean setting', - displayName: 'Test boolean setting', - isCustom: false, - isOverridden: false, - name: 'test:boolean:setting', - readOnly: false, - requiresPageReload: false, - type: 'string' as UiSettingsType, - }; - - const imageFieldSetting = { - ariaName: 'Test image setting', - category: ['category'], - defVal: null, - description: 'Description for Test image setting', - displayName: 'Test image setting', - isCustom: false, - isOverridden: false, - name: 'test:image:setting', - readOnly: false, - requiresPageReload: false, - type: 'image' as UiSettingsType, - }; - - const config = { - set: (key: string, value: any) => Promise.resolve(true), - remove: (key: string) => Promise.resolve(true), - isCustom: (key: string) => false, - isOverridden: (key: string) => Boolean(config.getAll()[key].isOverridden), - getRegistered: () => ({} as Readonly>), - getUpdate$: () => - new Observable<{ - key: string; - newValue: any; - oldValue: any; - }>(), - isDeclared: (key: string) => true, - isDefault: (key: string) => true, - - getSaved$: () => - new Observable<{ - key: string; - newValue: any; - oldValue: any; - }>(), - - getUpdateErrors$: () => new Observable(), - get: (key: string, defaultOverride?: any): any => config.getAll()[key] || defaultOverride, - get$: (key: string) => new Observable(config.get(key)), - getAll: (): Readonly> => { - return { - ...arraySetting, - ...booleanSetting, - ...imageSetting, - }; - }, - validateValue: (key: string, value: any) => - Promise.resolve({ successfulValidation: true, valid: true }), - }; - - it('mapConfig', () => { - expect(mapConfig(config)).toEqual([arrayFieldSetting, booleanFieldSetting, imageFieldSetting]); - }); - - it('mapSettings, initCategoryCounts and initCategories', () => { - const fieldSetting1: FieldSetting = { ...arrayFieldSetting, value: ['a', 'b', 'c'] }; - const fieldSetting2: FieldSetting = { ...booleanFieldSetting, value: false }; - const fieldSetting3: FieldSetting = { ...imageFieldSetting, value: 'imageSrc' }; - const mapped = mapSettings([fieldSetting1, fieldSetting2, fieldSetting3]); - expect(Object.keys(mapped).sort()).toEqual(['category', 'elasticsearch'].sort()); - expect(mapped.category.length).toEqual(1); - expect(mapped.elasticsearch.length).toEqual(2); - - const categoryCounts = initCategoryCounts(mapped); - expect(categoryCounts).toEqual({ category: 1, elasticsearch: 2 }); - - const categories = initCategories(mapped); - expect(categories).toEqual(['category', 'elasticsearch']); - }); -}); diff --git a/src/plugins/advanced_settings/public/management_app/settings_helper.ts b/src/plugins/advanced_settings/public/management_app/settings_helper.ts deleted file mode 100644 index 15921f2dd77c4..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/settings_helper.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; -import { DEFAULT_CATEGORY, fieldSorter, toEditableConfig } from './lib'; -import { FieldSetting } from './types'; -import { GroupedSettings } from './settings'; - -export const mapConfig = (config: IUiSettingsClient) => { - const all = config.getAll(); - return Object.entries(all) - .map(([settingId, settingDef]) => { - return toEditableConfig({ - def: settingDef, - name: settingId, - value: settingDef.userValue, - isCustom: config.isCustom(settingId), - isOverridden: config.isOverridden(settingId), - }); - }) - .filter((c) => !c.readOnly) - .filter((c) => !c.isCustom) // hide any settings that aren't explicitly registered by enabled plugins. - .sort(fieldSorter); -}; - -export const mapSettings = (fieldSettings: FieldSetting[]) => { - // Group settings by category - return fieldSettings.reduce((grouped: GroupedSettings, setting) => { - // We will want to change this logic when we put each category on its - // own page aka allowing a setting to be included in multiple categories. - const category = setting.category[0]; - (grouped[category] = grouped[category] || []).push(setting); - return grouped; - }, {}); -}; - -export const initCategoryCounts = (grouped: GroupedSettings) => { - return Object.keys(grouped).reduce((counts: Record, category: string) => { - counts[category] = grouped[category].length; - return counts; - }, {}); -}; - -export const initCategories = (grouped: GroupedSettings) => { - return Object.keys(grouped).sort((a, b) => { - if (a === DEFAULT_CATEGORY) return -1; - if (b === DEFAULT_CATEGORY) return 1; - if (a > b) return 1; - return a === b ? 0 : -1; - }); -}; diff --git a/src/plugins/advanced_settings/public/management_app/types.ts b/src/plugins/advanced_settings/public/management_app/types.ts deleted file mode 100644 index 9ee0d7811cd30..0000000000000 --- a/src/plugins/advanced_settings/public/management_app/types.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import type { ReactElement } from 'react'; -import { UiCounterMetricType } from '@kbn/analytics'; -import { UiSettingsType } from '@kbn/core/public'; - -export interface FieldSetting { - displayName: string; - name: string; - value: unknown; - description?: string | ReactElement; - options?: string[] | number[]; - optionLabels?: Record; - requiresPageReload: boolean; - type: UiSettingsType; - category: string[]; - ariaName: string; - isOverridden: boolean; - defVal: unknown; - isCustom: boolean; - readOnly?: boolean; - order?: number; - deprecation?: { - message: string; - docLinksKey: string; - }; - metric?: { - type: UiCounterMetricType; - name: string; - }; -} - -// until eui searchbar and query are typed - -export interface SettingsChanges { - [key: string]: any; -} - -export interface FieldState { - value?: any; - changeImage?: boolean; - loading?: boolean; - isInvalid?: boolean; - error?: string | null; -} diff --git a/src/plugins/advanced_settings/public/mocks.ts b/src/plugins/advanced_settings/public/mocks.ts deleted file mode 100644 index 00e50b6672e07..0000000000000 --- a/src/plugins/advanced_settings/public/mocks.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import type { - SectionRegistrySetup, - SectionRegistryStart, -} from '@kbn/management-settings-section-registry'; - -const addGlobalSection = jest.fn(); -const addSpaceSection = jest.fn(); -const getGlobalSections = jest.fn(); -const getSpacesSections = jest.fn(); - -export const advancedSettingsMock = { - createSetupContract(): SectionRegistrySetup { - return { addGlobalSection, addSpaceSection }; - }, - createStartContract(): SectionRegistryStart { - return { getGlobalSections, getSpacesSections }; - }, -}; diff --git a/src/plugins/advanced_settings/public/plugin.ts b/src/plugins/advanced_settings/public/plugin.tsx similarity index 65% rename from src/plugins/advanced_settings/public/plugin.ts rename to src/plugins/advanced_settings/public/plugin.tsx index f47993c1bb452..aca337c70ceac 100644 --- a/src/plugins/advanced_settings/public/plugin.ts +++ b/src/plugins/advanced_settings/public/plugin.tsx @@ -9,10 +9,20 @@ import { i18n } from '@kbn/i18n'; import { CoreSetup, Plugin } from '@kbn/core/public'; import { SectionRegistry } from '@kbn/management-settings-section-registry'; +import ReactDOM from 'react-dom'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; +import React from 'react'; +import { withSuspense } from '@kbn/shared-ux-utility'; import { AdvancedSettingsSetup, AdvancedSettingsStart, AdvancedSettingsPluginSetup } from './types'; const { setup: sectionRegistrySetup, start: sectionRegistryStart } = new SectionRegistry(); +const LazyKibanaSettingsApplication = React.lazy(async () => ({ + default: (await import('@kbn/management-settings-application')).KibanaSettingsApplication, +})); + +const KibanaSettingsApplication = withSuspense(LazyKibanaSettingsApplication); + const title = i18n.translate('advancedSettings.advancedSettingsLabel', { defaultMessage: 'Advanced Settings', }); @@ -30,16 +40,21 @@ export class AdvancedSettingsPlugin id: 'settings', title, order: 3, - async mount(params) { - const { mountManagementSection } = await import( - './management_app/mount_management_section' - ); - return mountManagementSection( - core.getStartServices, - params, - sectionRegistryStart, - usageCollection + async mount({ element, setBreadcrumbs, history }) { + const [coreStart] = await core.getStartServices(); + setBreadcrumbs([{ text: title }]); + + ReactDOM.render( + + + , + element ); + return () => { + ReactDOM.unmountComponentAtNode(element); + }; }, }); diff --git a/src/plugins/advanced_settings/server/capabilities_provider.ts b/src/plugins/advanced_settings/server/capabilities_provider.ts index 760d6f418201b..06f86cce3239a 100644 --- a/src/plugins/advanced_settings/server/capabilities_provider.ts +++ b/src/plugins/advanced_settings/server/capabilities_provider.ts @@ -6,13 +6,15 @@ * Side Public License, v 1. */ -export const capabilitiesProvider = () => ({ +import { AdvancedSettingsConfig } from './config'; + +export const capabilitiesProvider = (config: AdvancedSettingsConfig) => ({ globalSettings: { - show: true, + show: config.globalSettingsEnabled, save: true, }, advancedSettings: { - show: true, + show: config.advancedSettingsEnabled, save: true, }, }); diff --git a/src/plugins/advanced_settings/server/config.ts b/src/plugins/advanced_settings/server/config.ts index ea4950d3f11cc..dadb03cb7d6b4 100644 --- a/src/plugins/advanced_settings/server/config.ts +++ b/src/plugins/advanced_settings/server/config.ts @@ -10,7 +10,8 @@ import { schema, TypeOf } from '@kbn/config-schema'; import { PluginConfigDescriptor } from '@kbn/core-plugins-server'; const configSchema = schema.object({ - enabled: schema.boolean({ defaultValue: true }), + globalSettingsEnabled: schema.boolean({ defaultValue: true }), + advancedSettingsEnabled: schema.boolean({ defaultValue: true }), }); export type AdvancedSettingsConfig = TypeOf; diff --git a/src/plugins/advanced_settings/server/plugin.ts b/src/plugins/advanced_settings/server/plugin.ts index 8d100ee2e26b2..aa46c6aba6ebe 100644 --- a/src/plugins/advanced_settings/server/plugin.ts +++ b/src/plugins/advanced_settings/server/plugin.ts @@ -7,19 +7,23 @@ */ import { PluginInitializerContext, CoreSetup, CoreStart, Plugin, Logger } from '@kbn/core/server'; + import { capabilitiesProvider } from './capabilities_provider'; +import { AdvancedSettingsConfig } from './config'; export class AdvancedSettingsServerPlugin implements Plugin { private readonly logger: Logger; + private readonly config: AdvancedSettingsConfig; constructor(initializerContext: PluginInitializerContext) { this.logger = initializerContext.logger.get(); + this.config = initializerContext.config.get(); } public setup(core: CoreSetup) { this.logger.debug('advancedSettings: Setup'); - core.capabilities.registerProvider(capabilitiesProvider); + core.capabilities.registerProvider(() => capabilitiesProvider(this.config)); return {}; } diff --git a/src/plugins/advanced_settings/tsconfig.json b/src/plugins/advanced_settings/tsconfig.json index 9db3f75e007f6..547e82d64c73c 100644 --- a/src/plugins/advanced_settings/tsconfig.json +++ b/src/plugins/advanced_settings/tsconfig.json @@ -12,28 +12,13 @@ "@kbn/management-plugin", "@kbn/home-plugin", "@kbn/usage-collection-plugin", - "@kbn/kibana-react-plugin", "@kbn/i18n", - "@kbn/test-jest-helpers", - "@kbn/analytics", - "@kbn/kibana-utils-plugin", - "@kbn/i18n-react", - "@kbn/expect", - "@kbn/monaco", - "@kbn/shared-ux-router", - "@kbn/core-ui-settings-browser-mocks", - "@kbn/core-application-browser", - "@kbn/core-ui-settings-browser", - "@kbn/core-doc-links-browser", - "@kbn/core-notifications-browser", - "@kbn/core-theme-browser", - "@kbn/core-ui-settings-common", "@kbn/config-schema", "@kbn/core-plugins-server", "@kbn/management-settings-section-registry", "@kbn/react-kibana-context-render", - "@kbn/code-editor", - "@kbn/code-editor-mock", + "@kbn/shared-ux-utility", + "@kbn/management-settings-application", ], "exclude": [ "target/**/*", diff --git a/src/plugins/console/public/plugin.ts b/src/plugins/console/public/plugin.ts index ea4ddc7099fc4..711b4304af9b0 100644 --- a/src/plugins/console/public/plugin.ts +++ b/src/plugins/console/public/plugin.ts @@ -15,6 +15,7 @@ import { AppStartUIPluginDependencies, ClientConfigType, ConsolePluginSetup, + ConsolePluginStart, ConsoleUILocatorParams, EmbeddableConsoleProps, EmbeddableConsoleDependencies, @@ -101,22 +102,27 @@ export class ConsoleUIPlugin implements Plugin(); - if (isConsoleUiEnabled && core.application.capabilities?.dev_tools?.show === true) { - return { - renderEmbeddableConsole: (props: EmbeddableConsoleProps) => { - const consoleDeps: EmbeddableConsoleDependencies = { - core, - usageCollection: deps.usageCollection, - }; - return renderEmbeddableConsole(props, consoleDeps); - }, + const consoleStart: ConsolePluginStart = {}; + const embeddedConsoleAvailable = + isConsoleUiEnabled && + isEmbeddedConsoleEnabled && + core.application.capabilities?.dev_tools?.show === true; + + if (embeddedConsoleAvailable) { + consoleStart.renderEmbeddableConsole = (props?: EmbeddableConsoleProps) => { + const consoleDeps: EmbeddableConsoleDependencies = { + core, + usageCollection: deps.usageCollection, + }; + return renderEmbeddableConsole(props, consoleDeps); }; } - return {}; + + return consoleStart; } } diff --git a/src/plugins/console/public/types/config.ts b/src/plugins/console/public/types/config.ts index da41eef6f5484..683ff1b45ead4 100644 --- a/src/plugins/console/public/types/config.ts +++ b/src/plugins/console/public/types/config.ts @@ -9,5 +9,6 @@ export interface ClientConfigType { ui: { enabled: boolean; + embeddedEnabled: boolean; }; } diff --git a/src/plugins/console/server/config.ts b/src/plugins/console/server/config.ts index 281d18895ceec..0c27254dfc34b 100644 --- a/src/plugins/console/server/config.ts +++ b/src/plugins/console/server/config.ts @@ -23,6 +23,7 @@ const schemaLatest = schema.object( { ui: schema.object({ enabled: schema.boolean({ defaultValue: true }), + embeddedEnabled: schema.boolean({ defaultValue: true }), }), autocompleteDefinitions: schema.object({ // Only displays the endpoints that are available in the specified environment diff --git a/src/plugins/controls/common/control_group/control_group_persistence.ts b/src/plugins/controls/common/control_group/control_group_persistence.ts index be01e0ca555b8..8c51c4a2212b5 100644 --- a/src/plugins/controls/common/control_group/control_group_persistence.ts +++ b/src/plugins/controls/common/control_group/control_group_persistence.ts @@ -22,7 +22,12 @@ import { genericControlPanelDiffSystem, } from './control_group_panel_diff_system'; import { ControlGroupInput } from '..'; -import { ControlsPanels, PersistableControlGroupInput, RawControlGroupAttributes } from './types'; +import { + ControlsPanels, + PersistableControlGroupInput, + persistableControlGroupInputKeys, + RawControlGroupAttributes, +} from './types'; const safeJSONParse = (jsonString?: string): OutType | undefined => { if (!jsonString && typeof jsonString !== 'string') return; @@ -47,6 +52,9 @@ export const getDefaultControlGroupInput = (): Omit => }, }); +export const getDefaultControlGroupPersistableInput = (): PersistableControlGroupInput => + pick(getDefaultControlGroupInput(), persistableControlGroupInputKeys); + export const persistableControlGroupInputIsEqual = ( a: PersistableControlGroupInput | undefined, b: PersistableControlGroupInput | undefined diff --git a/src/plugins/controls/common/control_group/types.ts b/src/plugins/controls/common/control_group/types.ts index 65c29c3bac7c5..eeda06437cd55 100644 --- a/src/plugins/controls/common/control_group/types.ts +++ b/src/plugins/controls/common/control_group/types.ts @@ -36,9 +36,15 @@ export interface ControlGroupInput extends EmbeddableInput, ControlInput { /** * Only parts of the Control Group Input should be persisted */ +export const persistableControlGroupInputKeys: Array< + keyof Pick< + ControlGroupInput, + 'panels' | 'chainingSystem' | 'controlStyle' | 'ignoreParentSettings' + > +> = ['panels', 'chainingSystem', 'controlStyle', 'ignoreParentSettings']; export type PersistableControlGroupInput = Pick< ControlGroupInput, - 'panels' | 'chainingSystem' | 'controlStyle' | 'ignoreParentSettings' + typeof persistableControlGroupInputKeys[number] >; /** diff --git a/src/plugins/controls/common/index.ts b/src/plugins/controls/common/index.ts index b1d4488a876ea..75b9881b83ea5 100644 --- a/src/plugins/controls/common/index.ts +++ b/src/plugins/controls/common/index.ts @@ -18,12 +18,14 @@ export { type RawControlGroupAttributes, type PersistableControlGroupInput, type SerializableControlGroupInput, + persistableControlGroupInputKeys, } from './control_group/types'; export { controlGroupInputToRawControlGroupAttributes, rawControlGroupAttributesToControlGroupInput, rawControlGroupAttributesToSerializable, serializableToRawControlGroupAttributes, + getDefaultControlGroupPersistableInput, persistableControlGroupInputIsEqual, getDefaultControlGroupInput, generateNewControlIds, diff --git a/src/plugins/controls/public/constants.ts b/src/plugins/controls/public/constants.ts index 0773dd7ea9076..1be94fcc6ae11 100644 --- a/src/plugins/controls/public/constants.ts +++ b/src/plugins/controls/public/constants.ts @@ -7,3 +7,5 @@ */ export const MIN_POPOVER_WIDTH = 300; + +export const CHANGE_CHECK_DEBOUNCE = 100; diff --git a/src/plugins/controls/public/control_group/embeddable/control_group_container.tsx b/src/plugins/controls/public/control_group/embeddable/control_group_container.tsx index f06067fd95ae2..dcb74fd606154 100644 --- a/src/plugins/controls/public/control_group/embeddable/control_group_container.tsx +++ b/src/plugins/controls/public/control_group/embeddable/control_group_container.tsx @@ -6,7 +6,7 @@ * Side Public License, v 1. */ import { compareFilters, COMPARE_ALL_OPTIONS, Filter, uniqFilters } from '@kbn/es-query'; -import { isEqual } from 'lodash'; +import { isEqual, pick } from 'lodash'; import React, { createContext, useContext } from 'react'; import ReactDOM from 'react-dom'; import { Provider, TypedUseSelectorHook, useSelector } from 'react-redux'; @@ -18,6 +18,11 @@ import { Container, EmbeddableFactory } from '@kbn/embeddable-plugin/public'; import { ReduxEmbeddableTools, ReduxToolsPackage } from '@kbn/presentation-util-plugin/public'; import { KibanaThemeProvider } from '@kbn/react-kibana-context-theme'; +import { + PersistableControlGroupInput, + persistableControlGroupInputIsEqual, + persistableControlGroupInputKeys, +} from '../../../common'; import { pluginServices } from '../../services'; import { ControlEmbeddable, ControlInput, ControlOutput } from '../../types'; import { ControlGroup } from '../component/control_group_component'; @@ -32,12 +37,13 @@ import { type AddOptionsListControlProps, type AddRangeSliderControlProps, } from '../external_api/control_group_input_builder'; +import { startDiffingControlGroupState } from '../state/control_group_diffing_integration'; import { controlGroupReducers } from '../state/control_group_reducers'; import { + ControlGroupComponentState, ControlGroupInput, ControlGroupOutput, ControlGroupReduxState, - ControlGroupSettings, ControlPanelState, ControlsPanels, CONTROL_GROUP_TYPE, @@ -85,6 +91,7 @@ export class ControlGroupContainer extends Container< private recalculateFilters$: Subject; private relevantDataViewId?: string; private lastUsedDataViewId?: string; + public diffingSubscription: Subscription = new Subscription(); // state management public select: ControlGroupReduxEmbeddableTools['select']; @@ -99,13 +106,16 @@ export class ControlGroupContainer extends Container< public onFiltersPublished$: Subject; public onControlRemoved$: Subject; + /** This currently reports the **entire** persistable control group input on unsaved changes */ + public unsavedChanges: BehaviorSubject; + public fieldFilterPredicate: FieldFilterPredicate | undefined; constructor( reduxToolsPackage: ReduxToolsPackage, initialInput: ControlGroupInput, parent?: Container, - settings?: ControlGroupSettings, + initialComponentState?: ControlGroupComponentState, fieldFilterPredicate?: FieldFilterPredicate ) { super( @@ -120,6 +130,10 @@ export class ControlGroupContainer extends Container< this.onFiltersPublished$ = new Subject(); this.onControlRemoved$ = new Subject(); + // start diffing control group state + this.unsavedChanges = new BehaviorSubject(undefined); + const diffingMiddleware = startDiffingControlGroupState.bind(this)(); + // build redux embeddable tools const reduxEmbeddableTools = reduxToolsPackage.createReduxEmbeddableTools< ControlGroupReduxState, @@ -127,7 +141,8 @@ export class ControlGroupContainer extends Container< >({ embeddable: this, reducers: controlGroupReducers, - initialComponentState: settings, + additionalMiddleware: [diffingMiddleware], + initialComponentState, }); this.select = reduxEmbeddableTools.select; @@ -190,6 +205,20 @@ export class ControlGroupContainer extends Container< ); }; + public resetToLastSavedState() { + const { + componentState: { lastSavedInput }, + } = this.getState(); + if (!persistableControlGroupInputIsEqual(this.getPersistableInput(), lastSavedInput)) { + this.updateInput(lastSavedInput); + } + } + + public getPersistableInput: () => PersistableControlGroupInput & { id: string } = () => { + const input = this.getInput(); + return pick(input, [...persistableControlGroupInputKeys, 'id']); + }; + public updateInputAndReinitialize = (newInput: Partial) => { this.subscriptions.unsubscribe(); this.subscriptions = new Subscription(); diff --git a/src/plugins/controls/public/control_group/embeddable/control_group_container_factory.ts b/src/plugins/controls/public/control_group/embeddable/control_group_container_factory.ts index c3c323c85970b..b2ee529c5e0f8 100644 --- a/src/plugins/controls/public/control_group/embeddable/control_group_container_factory.ts +++ b/src/plugins/controls/public/control_group/embeddable/control_group_container_factory.ts @@ -20,8 +20,8 @@ import { lazyLoadReduxToolsPackage } from '@kbn/presentation-util-plugin/public' import { EmbeddablePersistableStateService } from '@kbn/embeddable-plugin/common'; import { + ControlGroupComponentState, ControlGroupInput, - ControlGroupSettings, CONTROL_GROUP_TYPE, FieldFilterPredicate, } from '../types'; @@ -57,7 +57,7 @@ export class ControlGroupContainerFactory implements EmbeddableFactoryDefinition public create = async ( initialInput: ControlGroupInput, parent?: Container, - settings?: ControlGroupSettings, + initialComponentState?: ControlGroupComponentState, fieldFilterPredicate?: FieldFilterPredicate ) => { const reduxEmbeddablePackage = await lazyLoadReduxToolsPackage(); @@ -66,7 +66,7 @@ export class ControlGroupContainerFactory implements EmbeddableFactoryDefinition reduxEmbeddablePackage, initialInput, parent, - settings, + initialComponentState, fieldFilterPredicate ); }; diff --git a/src/plugins/controls/public/control_group/external_api/control_group_renderer.test.tsx b/src/plugins/controls/public/control_group/external_api/control_group_renderer.test.tsx index 3ad4ec92f3de3..db240befd6ec9 100644 --- a/src/plugins/controls/public/control_group/external_api/control_group_renderer.test.tsx +++ b/src/plugins/controls/public/control_group/external_api/control_group_renderer.test.tsx @@ -53,7 +53,7 @@ describe('control group renderer', () => { expect(mockControlGroupFactory.create).toHaveBeenCalledWith( expect.objectContaining({ controlStyle: 'twoLine' }), undefined, - undefined, + { lastSavedInput: expect.objectContaining({ controlStyle: 'twoLine' }) }, undefined ); }); diff --git a/src/plugins/controls/public/control_group/external_api/control_group_renderer.tsx b/src/plugins/controls/public/control_group/external_api/control_group_renderer.tsx index d236a49f661cb..b5e024815e7ab 100644 --- a/src/plugins/controls/public/control_group/external_api/control_group_renderer.tsx +++ b/src/plugins/controls/public/control_group/external_api/control_group_renderer.tsx @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { isEqual, pick } from 'lodash'; import React, { forwardRef, useEffect, @@ -14,28 +15,31 @@ import React, { useRef, useState, } from 'react'; -import { isEqual } from 'lodash'; import { v4 as uuidv4 } from 'uuid'; -import { compareFilters } from '@kbn/es-query'; -import type { Filter, TimeRange, Query } from '@kbn/es-query'; import { EmbeddableFactory } from '@kbn/embeddable-plugin/public'; +import type { Filter, Query, TimeRange } from '@kbn/es-query'; +import { compareFilters } from '@kbn/es-query'; import { + getDefaultControlGroupInput, + getDefaultControlGroupPersistableInput, + persistableControlGroupInputKeys, +} from '../../../common'; +import { ControlGroupContainer } from '../embeddable/control_group_container'; +import { ControlGroupContainerFactory } from '../embeddable/control_group_container_factory'; +import { + ControlGroupCreationOptions, ControlGroupInput, - CONTROL_GROUP_TYPE, ControlGroupOutput, - ControlGroupCreationOptions, + CONTROL_GROUP_TYPE, } from '../types'; import { - ControlGroupAPI, AwaitingControlGroupAPI, buildApiFromControlGroupContainer, + ControlGroupAPI, } from './control_group_api'; -import { getDefaultControlGroupInput } from '../../../common'; import { controlGroupInputBuilder, ControlGroupInputBuilder } from './control_group_input_builder'; -import { ControlGroupContainer } from '../embeddable/control_group_container'; -import { ControlGroupContainerFactory } from '../embeddable/control_group_container_factory'; export interface ControlGroupRendererProps { filters?: Filter[]; @@ -87,7 +91,13 @@ export const ControlGroupRenderer = forwardRef = [ + 'setDefaultControlWidth', + 'setDefaultControlGrow', +]; + +/** + * Does an initial diff between @param initialInput and @param initialLastSavedInput, and created a middleware + * which listens to the redux store and checks for & publishes the unsaved changes on dispatches. + */ +export function startDiffingControlGroupState(this: ControlGroupContainer) { + const checkForUnsavedChangesSubject$ = new Subject(); + this.diffingSubscription.add( + checkForUnsavedChangesSubject$ + .pipe( + startWith(null), + debounceTime(CHANGE_CHECK_DEBOUNCE), + switchMap(() => { + return new Observable((observer) => { + if (observer.closed) return; + + const { + explicitInput: currentInput, + componentState: { lastSavedInput }, + } = this.getState(); + const hasUnsavedChanges = !persistableControlGroupInputIsEqual( + currentInput, + lastSavedInput + ); + this.unsavedChanges.next(hasUnsavedChanges ? this.getPersistableInput() : undefined); + }); + }) + ) + .subscribe() + ); + const diffingMiddleware: Middleware = (store) => (next) => (action) => { + const dispatchedActionName = action.type.split('/')?.[1]; + if ( + dispatchedActionName && + dispatchedActionName !== 'updateEmbeddableReduxOutput' && // ignore any generic output updates. + !reducersToIgnore.includes(dispatchedActionName) + ) { + checkForUnsavedChangesSubject$.next(null); + } + next(action); + }; + return diffingMiddleware; +} diff --git a/src/plugins/controls/public/control_group/state/control_group_reducers.ts b/src/plugins/controls/public/control_group/state/control_group_reducers.ts index a81784351a631..617a708fb0fe2 100644 --- a/src/plugins/controls/public/control_group/state/control_group_reducers.ts +++ b/src/plugins/controls/public/control_group/state/control_group_reducers.ts @@ -10,9 +10,15 @@ import { PayloadAction } from '@reduxjs/toolkit'; import { WritableDraft } from 'immer/dist/types/types-external'; import { ControlWidth } from '../../types'; -import { ControlGroupInput, ControlGroupReduxState } from '../types'; +import { ControlGroupComponentState, ControlGroupInput, ControlGroupReduxState } from '../types'; export const controlGroupReducers = { + setLastSavedInput: ( + state: WritableDraft, + action: PayloadAction + ) => { + state.componentState.lastSavedInput = action.payload; + }, setControlStyle: ( state: WritableDraft, action: PayloadAction diff --git a/src/plugins/controls/public/control_group/types.ts b/src/plugins/controls/public/control_group/types.ts index 72701c0eb61f8..699b003097fe1 100644 --- a/src/plugins/controls/public/control_group/types.ts +++ b/src/plugins/controls/public/control_group/types.ts @@ -9,7 +9,7 @@ import { DataViewField } from '@kbn/data-views-plugin/common'; import { ContainerOutput } from '@kbn/embeddable-plugin/public'; import { ReduxEmbeddableState } from '@kbn/presentation-util-plugin/public'; -import { ControlGroupInput } from '../../common/control_group/types'; +import { ControlGroupInput, PersistableControlGroupInput } from '../../common/control_group/types'; import { CommonControlOutput } from '../types'; export type ControlGroupOutput = ContainerOutput & @@ -19,7 +19,7 @@ export type ControlGroupOutput = ContainerOutput & export type ControlGroupReduxState = ReduxEmbeddableState< ControlGroupInput, ControlGroupOutput, - ControlGroupSettings + ControlGroupComponentState >; export type FieldFilterPredicate = (f: DataViewField) => boolean; @@ -40,9 +40,13 @@ export interface ControlGroupSettings { }; } +export type ControlGroupComponentState = ControlGroupSettings & { + lastSavedInput: PersistableControlGroupInput; +}; + export { - type ControlsPanels, + CONTROL_GROUP_TYPE, type ControlGroupInput, type ControlPanelState, - CONTROL_GROUP_TYPE, + type ControlsPanels, } from '../../common/control_group/types'; diff --git a/src/plugins/controls/public/options_list/components/options_list.scss b/src/plugins/controls/public/options_list/components/options_list.scss index e0c749441ff6a..4dca925e952ce 100644 --- a/src/plugins/controls/public/options_list/components/options_list.scss +++ b/src/plugins/controls/public/options_list/components/options_list.scss @@ -31,10 +31,9 @@ color: $euiColorDanger; } - .euiFilterButton__text-hasNotification { + .optionsList--selectionText { flex-grow: 1; - justify-content: space-between; - width: 0; + text-align: left; } } diff --git a/src/plugins/controls/public/options_list/components/options_list_control.tsx b/src/plugins/controls/public/options_list/components/options_list_control.tsx index 11683266ad2f0..5a358b29c6196 100644 --- a/src/plugins/controls/public/options_list/components/options_list_control.tsx +++ b/src/plugins/controls/public/options_list/components/options_list_control.tsx @@ -152,6 +152,7 @@ export const OptionsListControl = ({ isSelected={isPopoverOpen} numActiveFilters={validSelectionsCount} hasActiveFilters={Boolean(validSelectionsCount)} + textProps={{ className: 'optionsList--selectionText' }} > {hasSelections || existsSelected ? selectionDisplayNode diff --git a/src/plugins/controls/public/range_slider/range_slider_reducers.ts b/src/plugins/controls/public/range_slider/range_slider_reducers.ts index 35914473cf4a4..8f3ff2e89fce2 100644 --- a/src/plugins/controls/public/range_slider/range_slider_reducers.ts +++ b/src/plugins/controls/public/range_slider/range_slider_reducers.ts @@ -24,7 +24,15 @@ export const rangeSliderReducers = { state: WritableDraft, action: PayloadAction ) => { - state.explicitInput.value = action.payload; + const [minSelection, maxSelection]: RangeValue = action.payload; + if ( + minSelection === String(state.componentState.min) && + maxSelection === String(state.componentState.max) + ) { + state.explicitInput.value = undefined; + } else { + state.explicitInput.value = action.payload; + } }, setField: ( state: WritableDraft, diff --git a/src/plugins/dashboard/common/dashboard_container/types.ts b/src/plugins/dashboard/common/dashboard_container/types.ts index b4c6a874f0651..1497f7c08bb33 100644 --- a/src/plugins/dashboard/common/dashboard_container/types.ts +++ b/src/plugins/dashboard/common/dashboard_container/types.ts @@ -14,7 +14,6 @@ import { } from '@kbn/embeddable-plugin/common'; import { Filter, Query, TimeRange } from '@kbn/es-query'; import { RefreshInterval } from '@kbn/data-plugin/common'; -import { PersistableControlGroupInput } from '@kbn/controls-plugin/common'; import { KibanaExecutionContext } from '@kbn/core-execution-context-common'; import { DashboardOptions } from '../types'; @@ -65,6 +64,5 @@ export interface DashboardContainerInput extends EmbeddableInput { syncCursor: DashboardOptions['syncCursor']; // dashboard contents - controlGroupInput?: PersistableControlGroupInput; panels: DashboardPanelMap; } diff --git a/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx b/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx index 2072f3b630bbf..4d6cf2d4bf357 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx @@ -48,7 +48,7 @@ export const DashboardViewportComponent = () => { const panelCount = Object.keys(dashboard.select((state) => state.explicitInput.panels)).length; const controlCount = Object.keys( - dashboard.select((state) => state.explicitInput.controlGroupInput?.panels) ?? {} + controlGroup?.select((state) => state.explicitInput.panels) ?? {} ).length; const viewMode = dashboard.select((state) => state.explicitInput.viewMode); diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx index 22b16e654e8e4..26c52cb429fd3 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx @@ -6,19 +6,24 @@ * Side Public License, v 1. */ +import { showSaveModal } from '@kbn/saved-objects-plugin/public'; import React from 'react'; import { batch } from 'react-redux'; -import { showSaveModal } from '@kbn/saved-objects-plugin/public'; +import { PersistableControlGroupInput } from '@kbn/controls-plugin/common'; import { reportPerformanceMetricEvent } from '@kbn/ebt-tools'; + +import { DashboardContainerInput } from '../../../../common'; import { DASHBOARD_CONTENT_ID, SAVED_OBJECT_POST_TIME } from '../../../dashboard_constants'; +import { + SaveDashboardReturn, + SavedDashboardInput, +} from '../../../services/dashboard_content_management/types'; +import { pluginServices } from '../../../services/plugin_services'; import { DashboardSaveOptions, DashboardStateFromSaveModal } from '../../types'; -import { DashboardSaveModal } from './overlays/save_modal'; import { DashboardContainer } from '../dashboard_container'; -import { pluginServices } from '../../../services/plugin_services'; -import { DashboardContainerInput } from '../../../../common'; -import { SaveDashboardReturn } from '../../../services/dashboard_content_management/types'; import { extractTitleAndCount } from './lib/extract_title_and_count'; +import { DashboardSaveModal } from './overlays/save_modal'; export function runSaveAs(this: DashboardContainer) { const { @@ -77,10 +82,17 @@ export function runSaveAs(this: DashboardContainer) { // do not save if title is duplicate and is unconfirmed return {}; } - const stateToSave: DashboardContainerInput = { + + const lastSavedInput: DashboardContainerInput = { ...currentState, ...stateFromSaveModal, }; + let stateToSave: SavedDashboardInput = lastSavedInput; + let persistableControlGroupInput: PersistableControlGroupInput | undefined; + if (this.controlGroup) { + persistableControlGroupInput = this.controlGroup.getPersistableInput(); + stateToSave = { ...stateToSave, controlGroupInput: persistableControlGroupInput }; + } const beforeAddTime = window.performance.now(); const saveResult = await saveDashboardState({ currentState: stateToSave, @@ -100,7 +112,10 @@ export function runSaveAs(this: DashboardContainer) { if (saveResult.id) { batch(() => { this.dispatch.setStateFromSaveModal(stateFromSaveModal); - this.dispatch.setLastSavedInput(stateToSave); + this.dispatch.setLastSavedInput(lastSavedInput); + if (this.controlGroup && persistableControlGroupInput) { + this.controlGroup.dispatch.setLastSavedInput(persistableControlGroupInput); + } }); } resolve(saveResult); @@ -138,12 +153,23 @@ export async function runQuickSave(this: DashboardContainer) { if (managed) return; + let stateToSave: SavedDashboardInput = currentState; + let persistableControlGroupInput: PersistableControlGroupInput | undefined; + if (this.controlGroup) { + persistableControlGroupInput = this.controlGroup.getPersistableInput(); + stateToSave = { ...stateToSave, controlGroupInput: persistableControlGroupInput }; + } + const saveResult = await saveDashboardState({ lastSavedId, - currentState, + currentState: stateToSave, saveOptions: {}, }); + this.dispatch.setLastSavedInput(currentState); + if (this.controlGroup && persistableControlGroupInput) { + this.controlGroup.dispatch.setLastSavedInput(persistableControlGroupInput); + } return saveResult; } @@ -171,12 +197,23 @@ export async function runClone(this: DashboardContainer) { copyCount++; newTitle = `${baseTitle} (${copyCount})`; } + + let stateToSave: DashboardContainerInput & { + controlGroupInput?: PersistableControlGroupInput; + } = currentState; + if (this.controlGroup) { + stateToSave = { + ...stateToSave, + controlGroupInput: this.controlGroup.getPersistableInput(), + }; + } + const saveResult = await saveDashboardState({ saveOptions: { saveAsCopy: true, }, currentState: { - ...currentState, + ...stateToSave, title: newTitle, }, }); diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/controls/dashboard_control_group_integration.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/controls/dashboard_control_group_integration.ts index 7c907461d8f80..e06318656cf66 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/create/controls/dashboard_control_group_integration.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/controls/dashboard_control_group_integration.ts @@ -6,20 +6,17 @@ * Side Public License, v 1. */ +import { compareFilters, COMPARE_ALL_OPTIONS, type Filter } from '@kbn/es-query'; +import deepEqual from 'fast-deep-equal'; import { isEqual } from 'lodash'; import { Observable } from 'rxjs'; -import deepEqual from 'fast-deep-equal'; -import { compareFilters, COMPARE_ALL_OPTIONS, type Filter } from '@kbn/es-query'; import { distinctUntilChanged, skip } from 'rxjs/operators'; -import { - ControlGroupInput, - persistableControlGroupInputIsEqual, -} from '@kbn/controls-plugin/common'; +import { ControlGroupInput } from '@kbn/controls-plugin/common'; import { ControlGroupContainer } from '@kbn/controls-plugin/public'; -import { DashboardContainer } from '../../dashboard_container'; import { DashboardContainerInput } from '../../../../../common'; +import { DashboardContainer } from '../../dashboard_container'; interface DiffChecks { [key: string]: (a?: unknown, b?: unknown) => boolean; @@ -37,40 +34,6 @@ type DashboardControlGroupCommonKeys = keyof Pick< export function startSyncingDashboardControlGroup(this: DashboardContainer) { if (!this.controlGroup) return; - const isControlGroupInputEqual = () => - persistableControlGroupInputIsEqual( - this.controlGroup!.getInput(), - this.getInput().controlGroupInput - ); - - // Because dashboard container stores control group state, certain control group changes need to be passed up dashboard container - const controlGroupDiff: DiffChecks = { - panels: deepEqual, - controlStyle: deepEqual, - chainingSystem: deepEqual, - ignoreParentSettings: deepEqual, - }; - this.integrationSubscriptions.add( - this.controlGroup - .getInput$() - .pipe( - distinctUntilChanged((a, b) => - distinctUntilDiffCheck(a, b, controlGroupDiff) - ) - ) - .subscribe(() => { - const { panels, controlStyle, chainingSystem, ignoreParentSettings } = - this.controlGroup!.getInput(); - if (!isControlGroupInputEqual()) { - this.dispatch.setControlGroupState({ - panels, - controlStyle, - chainingSystem, - ignoreParentSettings, - }); - } - }) - ); const compareAllFilters = (a?: Filter[], b?: Filter[]) => compareFilters(a ?? [], b ?? [], COMPARE_ALL_OPTIONS); diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts index fe70c5f83304e..fe21437028e73 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { Observable } from 'rxjs'; +import { BehaviorSubject, Observable } from 'rxjs'; import { ContactCardEmbeddable, @@ -431,6 +431,7 @@ test('creates a control group from the control group factory and waits for it to getInput: jest.fn().mockReturnValue({}), getInput$: jest.fn().mockReturnValue(new Observable()), getOutput$: jest.fn().mockReturnValue(new Observable()), + unsavedChanges: new BehaviorSubject(undefined), } as unknown as ControlGroupContainer; const mockControlGroupFactory = { create: jest.fn().mockReturnValue(mockControlGroupContainer), @@ -450,7 +451,9 @@ test('creates a control group from the control group factory and waits for it to 'control_group' ); expect(mockControlGroupFactory.create).toHaveBeenCalledWith( - expect.objectContaining({ controlStyle: 'twoLine' }) + expect.objectContaining({ controlStyle: 'twoLine' }), + undefined, + { lastSavedInput: expect.objectContaining({ controlStyle: 'oneLine' }) } ); expect(mockControlGroupContainer.untilInitialized).toHaveBeenCalled(); }); diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts index a8530bca3bc9e..6fc13af8a7ca9 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts @@ -5,38 +5,46 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ +import { cloneDeep, identity, omit, pickBy } from 'lodash'; +import { BehaviorSubject, combineLatestWith, distinctUntilChanged, map, Subject } from 'rxjs'; import { v4 } from 'uuid'; -import { Subject } from 'rxjs'; -import { cloneDeep, identity, pickBy } from 'lodash'; import { ControlGroupInput, CONTROL_GROUP_TYPE, getDefaultControlGroupInput, + getDefaultControlGroupPersistableInput, } from '@kbn/controls-plugin/common'; +import { + ControlGroupContainerFactory, + ControlGroupOutput, + type ControlGroupContainer, +} from '@kbn/controls-plugin/public'; +import { GlobalQueryStateFromUrl, syncGlobalQueryStateWithUrl } from '@kbn/data-plugin/public'; +import { EmbeddableFactory, isErrorEmbeddable, ViewMode } from '@kbn/embeddable-plugin/public'; import { TimeRange } from '@kbn/es-query'; -import { isErrorEmbeddable, ViewMode } from '@kbn/embeddable-plugin/public'; import { lazyLoadReduxToolsPackage } from '@kbn/presentation-util-plugin/public'; -import { type ControlGroupContainer, ControlGroupOutput } from '@kbn/controls-plugin/public'; -import { GlobalQueryStateFromUrl, syncGlobalQueryStateWithUrl } from '@kbn/data-plugin/public'; -import { DashboardContainer } from '../dashboard_container'; -import { pluginServices } from '../../../services/plugin_services'; -import { DashboardCreationOptions } from '../dashboard_container_factory'; import { DashboardContainerInput, DashboardPanelState } from '../../../../common'; -import { startSyncingDashboardDataViews } from './data_views/sync_dashboard_data_views'; -import { LoadDashboardReturn } from '../../../services/dashboard_content_management/types'; -import { syncUnifiedSearchState } from './unified_search/sync_dashboard_unified_search_state'; -import { panelPlacementStrategies } from '../../component/panel_placement/place_new_panel_strategies'; import { DEFAULT_DASHBOARD_INPUT, DEFAULT_PANEL_HEIGHT, DEFAULT_PANEL_WIDTH, GLOBAL_STATE_STORAGE_KEY, } from '../../../dashboard_constants'; +import { + LoadDashboardReturn, + SavedDashboardInput, +} from '../../../services/dashboard_content_management/types'; +import { pluginServices } from '../../../services/plugin_services'; +import { panelPlacementStrategies } from '../../component/panel_placement/place_new_panel_strategies'; +import { DashboardPublicState } from '../../types'; +import { DashboardContainer } from '../dashboard_container'; +import { DashboardCreationOptions } from '../dashboard_container_factory'; import { startSyncingDashboardControlGroup } from './controls/dashboard_control_group_integration'; +import { startSyncingDashboardDataViews } from './data_views/sync_dashboard_data_views'; import { startDashboardSearchSessionIntegration } from './search_sessions/start_dashboard_search_session_integration'; -import { DashboardPublicState } from '../../types'; +import { syncUnifiedSearchState } from './unified_search/sync_dashboard_unified_search_state'; /** * Builds a new Dashboard from scratch. @@ -95,7 +103,7 @@ export const createDashboard = async ( // Build and return the dashboard container. // -------------------------------------------------------------------------------------- const initialComponentState: DashboardPublicState = { - lastSavedInput: savedObjectResult?.dashboardInput ?? { + lastSavedInput: omit(savedObjectResult?.dashboardInput, 'controlGroupInput') ?? { ...DEFAULT_DASHBOARD_INPUT, id: input.id, }, @@ -173,7 +181,7 @@ export const initializeDashboard = async ({ // -------------------------------------------------------------------------------------- // Gather input from session storage and local storage if integration is used. // -------------------------------------------------------------------------------------- - const sessionStorageInput = ((): Partial | undefined => { + const sessionStorageInput = ((): Partial | undefined => { if (!useSessionStorageIntegration) return; return dashboardBackup.getState(loadDashboardReturn.dashboardId); })(); @@ -194,23 +202,31 @@ export const initializeDashboard = async ({ })(); const overrideInput = getInitialInput?.(); - const initialInput: DashboardContainerInput = cloneDeep({ - ...DEFAULT_DASHBOARD_INPUT, - ...(loadDashboardReturn?.dashboardInput ?? {}), - ...sessionStorageInput, + const initialDashboardInput: DashboardContainerInput = omit( + cloneDeep({ + ...DEFAULT_DASHBOARD_INPUT, + ...(loadDashboardReturn?.dashboardInput ?? {}), + ...sessionStorageInput, - ...(initialViewMode ? { viewMode: initialViewMode } : {}), - ...overrideInput, - }); + ...(initialViewMode ? { viewMode: initialViewMode } : {}), + ...overrideInput, + }), + 'controlGroupInput' + ); + const initialControlGroupInput: ControlGroupInput | {} = { + ...(loadDashboardReturn?.dashboardInput?.controlGroupInput ?? {}), + ...(sessionStorageInput?.controlGroupInput ?? {}), + ...(overrideInput?.controlGroupInput ?? {}), + }; // Back up any view mode passed in explicitly. if (overrideInput?.viewMode) { dashboardBackup.storeViewMode(overrideInput?.viewMode); } - initialInput.executionContext = { + initialDashboardInput.executionContext = { type: 'dashboard', - description: initialInput.title, + description: initialDashboardInput.title, }; // -------------------------------------------------------------------------------------- @@ -223,7 +239,7 @@ export const initializeDashboard = async ({ timeRestore, timeRange: savedTimeRange, refreshInterval: savedRefreshInterval, - } = initialInput; + } = initialDashboardInput; const { kbnUrlStateStorage } = unifiedSearchSettings; // apply filters and query to the query service @@ -245,7 +261,7 @@ export const initializeDashboard = async ({ // otherwise fall back to the time range from the timefilterService. return timefilterService.getTime(); })(); - initialInput.timeRange = initialTimeRange; + initialDashboardInput.timeRange = initialTimeRange; if (timeRestore) { if (savedTimeRange) timefilterService.setTime(savedTimeRange); if (savedRefreshInterval) timefilterService.setRefreshInterval(savedRefreshInterval); @@ -277,13 +293,13 @@ export const initializeDashboard = async ({ container.setHighlightPanelId(id); }; - initialInput.viewMode = ViewMode.EDIT; // view mode must always be edit to recieve an embeddable. + initialDashboardInput.viewMode = ViewMode.EDIT; // view mode must always be edit to recieve an embeddable. if ( incomingEmbeddable.embeddableId && - Boolean(initialInput.panels[incomingEmbeddable.embeddableId]) + Boolean(initialDashboardInput.panels[incomingEmbeddable.embeddableId]) ) { // this embeddable already exists, we will update the explicit input. - const panelToUpdate = initialInput.panels[incomingEmbeddable.embeddableId]; + const panelToUpdate = initialDashboardInput.panels[incomingEmbeddable.embeddableId]; const sameType = panelToUpdate.type === incomingEmbeddable.type; panelToUpdate.type = incomingEmbeddable.type; @@ -380,21 +396,32 @@ export const initializeDashboard = async ({ ControlGroupInput, ControlGroupOutput, ControlGroupContainer - >(CONTROL_GROUP_TYPE); - const { filters, query, timeRange, viewMode, controlGroupInput, id } = initialInput; + >(CONTROL_GROUP_TYPE) as EmbeddableFactory< + ControlGroupInput, + ControlGroupOutput, + ControlGroupContainer + > & { + create: ControlGroupContainerFactory['create']; + }; + const { filters, query, timeRange, viewMode, id } = initialDashboardInput; const fullControlGroupInput = { id: `control_group_${id ?? 'new_dashboard'}`, ...getDefaultControlGroupInput(), - ...pickBy(controlGroupInput, identity), // undefined keys in initialInput should not overwrite defaults + ...pickBy(initialControlGroupInput, identity), // undefined keys in initialInput should not overwrite defaults timeRange, viewMode, filters, query, }; + if (controlGroup) { controlGroup.updateInputAndReinitialize(fullControlGroupInput); } else { - const newControlGroup = await controlsGroupFactory?.create(fullControlGroupInput); + const newControlGroup = await controlsGroupFactory?.create(fullControlGroupInput, this, { + lastSavedInput: + loadDashboardReturn?.dashboardInput?.controlGroupInput ?? + getDefaultControlGroupPersistableInput(), + }); if (!newControlGroup || isErrorEmbeddable(newControlGroup)) { throw new Error('Error in control group startup'); } @@ -424,5 +451,49 @@ export const initializeDashboard = async ({ setTimeout(() => dashboard.dispatch.setAnimatePanelTransforms(true), 500) ); - return { input: initialInput, searchSessionId: initialSearchSessionId }; + // -------------------------------------------------------------------------------------- + // Start diffing subscription to keep track of unsaved changes + // -------------------------------------------------------------------------------------- + untilDashboardReady().then((dashboard) => { + // subscription that handles the unsaved changes badge + dashboard.integrationSubscriptions.add( + dashboard.hasUnsavedChanges + .pipe( + combineLatestWith( + dashboard.controlGroup?.unsavedChanges.pipe( + map((unsavedControlchanges) => Boolean(unsavedControlchanges)) + ) ?? new BehaviorSubject(false) + ), + distinctUntilChanged( + ( + [dashboardHasChanges1, controlHasChanges1], + [dashboardHasChanges2, controlHasChanges2] + ) => + (dashboardHasChanges1 || controlHasChanges1) === + (dashboardHasChanges2 || controlHasChanges2) + ) + ) + .subscribe(([dashboardHasChanges, controlGroupHasChanges]) => { + dashboard.dispatch.setHasUnsavedChanges(dashboardHasChanges || controlGroupHasChanges); + }) + ); + + // subscription that handles backing up the unsaved changes to the session storage + dashboard.integrationSubscriptions.add( + dashboard.backupUnsavedChanges + .pipe( + combineLatestWith( + dashboard.controlGroup?.unsavedChanges ?? new BehaviorSubject(undefined) + ) + ) + .subscribe(([dashboardChanges, controlGroupChanges]) => { + dashboardBackup.setState(dashboard.getDashboardSavedObjectId(), { + ...dashboardChanges, + controlGroupInput: controlGroupChanges, + }); + }) + ); + }); + + return { input: initialDashboardInput, searchSessionId: initialSearchSessionId }; }; diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx index 1cd028cfc53e9..163b1a7b4d08f 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx @@ -6,15 +6,12 @@ * Side Public License, v 1. */ +import { omit } from 'lodash'; import React, { createContext, useContext } from 'react'; import ReactDOM from 'react-dom'; import { batch } from 'react-redux'; import { BehaviorSubject, Subject, Subscription } from 'rxjs'; -import { - getDefaultControlGroupInput, - persistableControlGroupInputIsEqual, -} from '@kbn/controls-plugin/common'; import type { ControlGroupContainer } from '@kbn/controls-plugin/public'; import type { KibanaExecutionContext, OverlayRef } from '@kbn/core/public'; import { RefreshInterval } from '@kbn/data-plugin/public'; @@ -31,11 +28,11 @@ import { import type { Filter, Query, TimeRange } from '@kbn/es-query'; import { I18nProvider } from '@kbn/i18n-react'; import { KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; +import { PanelPackage } from '@kbn/presentation-containers'; import { ReduxEmbeddableTools, ReduxToolsPackage } from '@kbn/presentation-util-plugin/public'; import { LocatorPublic } from '@kbn/share-plugin/common'; import { ExitFullScreenButtonKibanaProvider } from '@kbn/shared-ux-button-exit-full-screen'; -import { PanelPackage } from '@kbn/presentation-containers'; import { DashboardLocatorParams, DASHBOARD_CONTAINER_TYPE } from '../..'; import { DashboardContainerInput, DashboardPanelState } from '../../../common'; import { DASHBOARD_APP_ID, DASHBOARD_LOADED_EVENT } from '../../dashboard_constants'; @@ -68,6 +65,7 @@ import { dashboardTypeDisplayLowercase, dashboardTypeDisplayName, } from './dashboard_container_factory'; +import { SavedDashboardInput } from '../../services/dashboard_content_management/types'; export interface InheritedChildInput { filters: Filter[]; @@ -116,6 +114,9 @@ export class DashboardContainer public diffingSubscription: Subscription = new Subscription(); public controlGroup?: ControlGroupContainer; + public hasUnsavedChanges: BehaviorSubject; + public backupUnsavedChanges: BehaviorSubject | undefined>; + public searchSessionId?: string; public locator?: Pick, 'navigate' | 'getRedirectUrl'>; @@ -176,6 +177,10 @@ export class DashboardContainer this.dashboardCreationStartTime = dashboardCreationStartTime; // start diffing dashboard state + this.hasUnsavedChanges = new BehaviorSubject(false); + this.backupUnsavedChanges = new BehaviorSubject | undefined>( + undefined + ); const diffingMiddleware = startDiffingDashboardState.bind(this)(creationOptions); // build redux embeddable tools @@ -188,7 +193,6 @@ export class DashboardContainer additionalMiddleware: [diffingMiddleware], initialComponentState, }); - this.onStateChange = reduxTools.onStateChange; this.cleanupStateTools = reduxTools.cleanup; this.getState = reduxTools.getState; @@ -411,18 +415,12 @@ export class DashboardContainer const { explicitInput: { timeRange, refreshInterval }, componentState: { - lastSavedInput: { - controlGroupInput: lastSavedControlGroupInput, - timeRestore: lastSavedTimeRestore, - }, + lastSavedInput: { timeRestore: lastSavedTimeRestore }, }, } = this.getState(); - if ( - this.controlGroup && - !persistableControlGroupInputIsEqual(this.controlGroup.getInput(), lastSavedControlGroupInput) - ) { - this.controlGroup.updateInput(lastSavedControlGroupInput ?? getDefaultControlGroupInput()); + if (this.controlGroup) { + this.controlGroup.resetToLastSavedState(); } // if we are using the unified search integration, we need to force reset the time picker. @@ -476,8 +474,15 @@ export class DashboardContainer this.searchSessionId = searchSessionId; batch(() => { - this.dispatch.setLastSavedInput(loadDashboardReturn?.dashboardInput); + this.dispatch.setLastSavedInput( + omit(loadDashboardReturn?.dashboardInput, 'controlGroupInput') + ); this.dispatch.setManaged(loadDashboardReturn?.managed); + if (this.controlGroup && loadDashboardReturn?.dashboardInput.controlGroupInput) { + this.controlGroup.dispatch.setLastSavedInput( + loadDashboardReturn?.dashboardInput.controlGroupInput + ); + } this.dispatch.setAnimatePanelTransforms(false); // prevents panels from animating on navigate. this.dispatch.setLastSavedId(newSavedObjectId); }); diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container_factory.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container_factory.tsx index 33bb4d14508a6..c7bcc14ef6b25 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container_factory.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container_factory.tsx @@ -6,27 +6,30 @@ * Side Public License, v 1. */ -import { Observable } from 'rxjs'; import { i18n } from '@kbn/i18n'; +import { Observable } from 'rxjs'; +import { SearchSessionInfoProvider } from '@kbn/data-plugin/public'; +import { EmbeddablePersistableStateService } from '@kbn/embeddable-plugin/common'; import { Container, - ErrorEmbeddable, ContainerOutput, + EmbeddableAppContext, EmbeddableFactory, EmbeddableFactoryDefinition, EmbeddablePackageState, - EmbeddableAppContext, + ErrorEmbeddable, } from '@kbn/embeddable-plugin/public'; -import { SearchSessionInfoProvider } from '@kbn/data-plugin/public'; import { IKbnUrlStateStorage } from '@kbn/kibana-utils-plugin/public'; -import { EmbeddablePersistableStateService } from '@kbn/embeddable-plugin/common'; import { DASHBOARD_CONTAINER_TYPE } from '..'; -import type { DashboardContainer } from './dashboard_container'; +import { createExtract, createInject, DashboardContainerInput } from '../../../common'; import { DEFAULT_DASHBOARD_INPUT } from '../../dashboard_constants'; -import { createInject, createExtract, DashboardContainerInput } from '../../../common'; -import { LoadDashboardReturn } from '../../services/dashboard_content_management/types'; +import { + LoadDashboardReturn, + SavedDashboardInput, +} from '../../services/dashboard_content_management/types'; +import type { DashboardContainer } from './dashboard_container'; export type DashboardContainerFactory = EmbeddableFactory< DashboardContainerInput, @@ -35,7 +38,7 @@ export type DashboardContainerFactory = EmbeddableFactory< >; export interface DashboardCreationOptions { - getInitialInput?: () => Partial; + getInitialInput?: () => Partial; getIncomingEmbeddable?: () => EmbeddablePackageState | undefined; diff --git a/src/plugins/dashboard/public/dashboard_container/state/dashboard_container_reducers.ts b/src/plugins/dashboard/public/dashboard_container/state/dashboard_container_reducers.ts index b0299ecfd47f1..e642cf2afe976 100644 --- a/src/plugins/dashboard/public/dashboard_container/state/dashboard_container_reducers.ts +++ b/src/plugins/dashboard/public/dashboard_container/state/dashboard_container_reducers.ts @@ -21,13 +21,6 @@ export const dashboardContainerReducers = { // ------------------------------------------------------------------------------ // Content Reducers // ------------------------------------------------------------------------------ - setControlGroupState: ( - state: DashboardReduxState, - action: PayloadAction - ) => { - state.explicitInput.controlGroupInput = action.payload; - }, - setPanels: ( state: DashboardReduxState, action: PayloadAction diff --git a/src/plugins/dashboard/public/dashboard_container/state/diffing/dashboard_diffing_functions.ts b/src/plugins/dashboard/public/dashboard_container/state/diffing/dashboard_diffing_functions.ts index 5c9e1854fb10a..4816b261f373f 100644 --- a/src/plugins/dashboard/public/dashboard_container/state/diffing/dashboard_diffing_functions.ts +++ b/src/plugins/dashboard/public/dashboard_container/state/diffing/dashboard_diffing_functions.ts @@ -8,17 +8,16 @@ import fastIsEqual from 'fast-deep-equal'; -import { persistableControlGroupInputIsEqual } from '@kbn/controls-plugin/common'; +import { shouldRefreshFilterCompareOptions } from '@kbn/embeddable-plugin/public'; import { compareFilters, COMPARE_ALL_OPTIONS, isFilterPinned, onlyDisabledFiltersChanged, } from '@kbn/es-query'; -import { shouldRefreshFilterCompareOptions } from '@kbn/embeddable-plugin/public'; -import { DashboardContainer } from '../../embeddable/dashboard_container'; import { DashboardContainerInput } from '../../../../common'; +import { DashboardContainer } from '../../embeddable/dashboard_container'; import { DashboardContainerInputWithoutId } from '../../types'; import { areTimesEqual, getPanelLayoutsAreEqual } from './dashboard_diffing_utils'; @@ -132,9 +131,6 @@ export const unsavedChangesDiffingFunctions: DashboardDiffFunctions = { return fastIsEqual(currentValue, lastValue); }, - controlGroupInput: ({ currentValue, lastValue }) => - persistableControlGroupInputIsEqual(currentValue, lastValue), - viewMode: () => false, // When compared view mode is always considered unequal so that it gets backed up. }; diff --git a/src/plugins/dashboard/public/dashboard_container/state/diffing/dashboard_diffing_integration.ts b/src/plugins/dashboard/public/dashboard_container/state/diffing/dashboard_diffing_integration.ts index 13ff33b6bf9ca..31e99e213fb25 100644 --- a/src/plugins/dashboard/public/dashboard_container/state/diffing/dashboard_diffing_integration.ts +++ b/src/plugins/dashboard/public/dashboard_container/state/diffing/dashboard_diffing_integration.ts @@ -16,7 +16,6 @@ import { unsavedChangesDiffingFunctions, } from './dashboard_diffing_functions'; import { DashboardContainerInput } from '../../../../common'; -import { pluginServices } from '../../../services/plugin_services'; import { DashboardContainer, DashboardCreationOptions } from '../..'; import { CHANGE_CHECK_DEBOUNCE } from '../../../dashboard_constants'; import { dashboardContainerReducers } from '../dashboard_container_reducers'; @@ -76,8 +75,9 @@ const sessionChangeKeys: Array> = ]; /** - * Does an initial diff between @param initialInput and @param initialLastSavedInput, and created a middleware - * which listens to the redux store and checks for & publishes the unsaved changes on dispatches. + * Does an initial diff between @param initialInput and @param initialLastSavedInput, and creates a middleware + * which listens to the redux store and pushes updates to the `hasUnsavedChanges` and `backupUnsavedChanges` behaviour + * subjects so that the corresponding subscriptions can dispatch updates as necessary */ export function startDiffingDashboardState( this: DashboardContainer, @@ -99,10 +99,14 @@ export function startDiffingDashboardState( .bind(this)(lastSavedInput, currentInput) .then((unsavedChanges) => { if (observer.closed) return; + const validUnsavedChanges = omit(unsavedChanges, keysNotConsideredUnsavedChanges); + const hasChanges = Object.keys(validUnsavedChanges).length > 0; + this.hasUnsavedChanges.next(hasChanges); - updateUnsavedChangesState.bind(this)(unsavedChanges); if (creationOptions?.useSessionStorageIntegration) { - backupUnsavedChanges.bind(this)(unsavedChanges); + this.backupUnsavedChanges.next( + omit(unsavedChanges, keysToOmitFromSessionStorage) + ); } }); }); @@ -142,7 +146,6 @@ export async function getUnsavedChanges( if (input[key] === undefined && lastInput[key] === undefined) { resolve({ key, isEqual: true }); } - isKeyEqualAsync( key, { @@ -195,25 +198,3 @@ export function getShouldRefresh( } return false; } - -function updateUnsavedChangesState( - this: DashboardContainer, - unsavedChanges: Partial -) { - // dispatch has unsaved changes state - const hasChanges = Object.keys(omit(unsavedChanges, keysNotConsideredUnsavedChanges)).length > 0; - if (this.getState().componentState.hasUnsavedChanges !== hasChanges) { - this.dispatch.setHasUnsavedChanges(hasChanges); - } -} - -function backupUnsavedChanges( - this: DashboardContainer, - unsavedChanges: Partial -) { - const { dashboardBackup } = pluginServices.getServices(); - dashboardBackup.setState( - this.getDashboardSavedObjectId(), - omit(unsavedChanges, keysToOmitFromSessionStorage) - ); -} diff --git a/src/plugins/dashboard/public/services/dashboard_backup/types.ts b/src/plugins/dashboard/public/services/dashboard_backup/types.ts index c302295af832a..70748085d3ee1 100644 --- a/src/plugins/dashboard/public/services/dashboard_backup/types.ts +++ b/src/plugins/dashboard/public/services/dashboard_backup/types.ts @@ -7,12 +7,12 @@ */ import { ViewMode } from '@kbn/embeddable-plugin/public'; -import type { DashboardContainerInput } from '../../../common'; +import { SavedDashboardInput } from '../dashboard_content_management/types'; export interface DashboardBackupServiceType { clearState: (id?: string) => void; - getState: (id: string | undefined) => Partial | undefined; - setState: (id: string | undefined, newState: Partial) => void; + getState: (id: string | undefined) => Partial | undefined; + setState: (id: string | undefined, newState: Partial) => void; getViewMode: () => ViewMode; storeViewMode: (viewMode: ViewMode) => void; getDashboardIdsWithUnsavedChanges: () => string[]; diff --git a/src/plugins/dashboard/public/services/dashboard_content_management/lib/migrate_dashboard_input.test.ts b/src/plugins/dashboard/public/services/dashboard_content_management/lib/migrate_dashboard_input.test.ts index 10c7c5c40b587..1878344b630fc 100644 --- a/src/plugins/dashboard/public/services/dashboard_content_management/lib/migrate_dashboard_input.test.ts +++ b/src/plugins/dashboard/public/services/dashboard_content_management/lib/migrate_dashboard_input.test.ts @@ -9,10 +9,10 @@ import { ControlGroupInput } from '@kbn/controls-plugin/common'; import { controlGroupInputBuilder } from '@kbn/controls-plugin/public'; -import { DashboardContainerInput } from '../../../../common'; -import { migrateDashboardInput } from './migrate_dashboard_input'; -import { DashboardEmbeddableService } from '../../embeddable/types'; import { getSampleDashboardInput, getSampleDashboardPanel } from '../../../mocks'; +import { DashboardEmbeddableService } from '../../embeddable/types'; +import { SavedDashboardInput } from '../types'; +import { migrateDashboardInput } from './migrate_dashboard_input'; jest.mock('@kbn/embeddable-plugin/public', () => { return { @@ -25,7 +25,7 @@ jest.mock('@kbn/embeddable-plugin/public', () => { describe('Migrate dashboard input', () => { it('should run factory migrations on all Dashboard content', () => { - const dashboardInput: DashboardContainerInput = getSampleDashboardInput(); + const dashboardInput: SavedDashboardInput = getSampleDashboardInput(); dashboardInput.panels = { panel1: getSampleDashboardPanel({ type: 'superLens', explicitInput: { id: 'panel1' } }), panel2: getSampleDashboardPanel({ type: 'superLens', explicitInput: { id: 'panel2' } }), diff --git a/src/plugins/dashboard/public/services/dashboard_content_management/lib/migrate_dashboard_input.ts b/src/plugins/dashboard/public/services/dashboard_content_management/lib/migrate_dashboard_input.ts index 57da6e85618fd..9d42d496df25f 100644 --- a/src/plugins/dashboard/public/services/dashboard_content_management/lib/migrate_dashboard_input.ts +++ b/src/plugins/dashboard/public/services/dashboard_content_management/lib/migrate_dashboard_input.ts @@ -6,14 +6,15 @@ * Side Public License, v 1. */ +import { ControlGroupInput } from '@kbn/controls-plugin/common'; import { - runEmbeddableFactoryMigrations, EmbeddableFactoryNotFoundError, + runEmbeddableFactoryMigrations, } from '@kbn/embeddable-plugin/public'; -import { ControlGroupInput } from '@kbn/controls-plugin/common'; -import { type DashboardEmbeddableService } from '../../embeddable/types'; import { DashboardContainerInput, DashboardPanelState } from '../../../../common'; +import { type DashboardEmbeddableService } from '../../embeddable/types'; +import { SavedDashboardInput } from '../types'; /** * Run Dashboard migrations clientside. We pre-emptively run all migrations for all content on this Dashboard so that @@ -22,7 +23,7 @@ import { DashboardContainerInput, DashboardPanelState } from '../../../../common * get skipped at Embeddable create time - unless states with older versions are saved in the URL or session storage. */ export const migrateDashboardInput = ( - dashboardInput: DashboardContainerInput, + dashboardInput: SavedDashboardInput, embeddable: DashboardEmbeddableService ) => { let anyMigrationRun = false; diff --git a/src/plugins/dashboard/public/services/dashboard_content_management/lib/save_dashboard_state.ts b/src/plugins/dashboard/public/services/dashboard_content_management/lib/save_dashboard_state.ts index 3469aed639a4a..ec7e1fd2c097b 100644 --- a/src/plugins/dashboard/public/services/dashboard_content_management/lib/save_dashboard_state.ts +++ b/src/plugins/dashboard/public/services/dashboard_content_management/lib/save_dashboard_state.ts @@ -10,35 +10,32 @@ import { pick } from 'lodash'; import moment, { Moment } from 'moment'; import { - getDefaultControlGroupInput, - persistableControlGroupInputIsEqual, controlGroupInputToRawControlGroupAttributes, generateNewControlIds, + getDefaultControlGroupInput, + persistableControlGroupInputIsEqual, } from '@kbn/controls-plugin/common'; -import { isFilterPinned } from '@kbn/es-query'; import { extractSearchSourceReferences, RefreshInterval } from '@kbn/data-plugin/public'; +import { isFilterPinned } from '@kbn/es-query'; +import { convertPanelMapToSavedPanels, extractReferences } from '../../../../common'; +import { DashboardAttributes, DashboardCrudTypes } from '../../../../common/content_management'; +import { generateNewPanelIds } from '../../../../common/lib/dashboard_panel_converters'; +import { DASHBOARD_CONTENT_ID } from '../../../dashboard_constants'; +import { LATEST_DASHBOARD_CONTAINER_VERSION } from '../../../dashboard_container'; +import { dashboardSaveToastStrings } from '../../../dashboard_container/_dashboard_container_strings'; +import { DashboardStartDependencies } from '../../../plugin'; +import { dashboardContentManagementCache } from '../dashboard_content_management_service'; import { - extractReferences, - DashboardContainerInput, - convertPanelMapToSavedPanels, -} from '../../../../common'; -import { + DashboardContentManagementRequiredServices, SaveDashboardProps, SaveDashboardReturn, - DashboardContentManagementRequiredServices, + SavedDashboardInput, } from '../types'; -import { DashboardStartDependencies } from '../../../plugin'; -import { DASHBOARD_CONTENT_ID } from '../../../dashboard_constants'; import { convertDashboardVersionToNumber } from './dashboard_versioning'; -import { LATEST_DASHBOARD_CONTAINER_VERSION } from '../../../dashboard_container'; -import { generateNewPanelIds } from '../../../../common/lib/dashboard_panel_converters'; -import { dashboardContentManagementCache } from '../dashboard_content_management_service'; -import { DashboardCrudTypes, DashboardAttributes } from '../../../../common/content_management'; -import { dashboardSaveToastStrings } from '../../../dashboard_container/_dashboard_container_strings'; export const serializeControlGroupInput = ( - controlGroupInput: DashboardContainerInput['controlGroupInput'] + controlGroupInput: SavedDashboardInput['controlGroupInput'] ) => { // only save to saved object if control group is not default if ( diff --git a/src/plugins/dashboard/public/services/dashboard_content_management/types.ts b/src/plugins/dashboard/public/services/dashboard_content_management/types.ts index 50806797dfeca..7e79e01df56ad 100644 --- a/src/plugins/dashboard/public/services/dashboard_content_management/types.ts +++ b/src/plugins/dashboard/public/services/dashboard_content_management/types.ts @@ -6,25 +6,26 @@ * Side Public License, v 1. */ +import { PersistableControlGroupInput } from '@kbn/controls-plugin/common'; import { SavedObjectSaveOpts } from '@kbn/saved-objects-plugin/public'; -import { - FindDashboardsByIdResponse, - SearchDashboardsArgs, - SearchDashboardsResponse, -} from './lib/find_dashboards'; -import { DashboardDataService } from '../data/types'; -import { DashboardSpacesService } from '../spaces/types'; import { DashboardContainerInput } from '../../../common'; +import { DashboardCrudTypes } from '../../../common/content_management'; import { DashboardStartDependencies } from '../../plugin'; +import { DashboardBackupServiceType } from '../dashboard_backup/types'; +import { DashboardDataService } from '../data/types'; import { DashboardEmbeddableService } from '../embeddable/types'; -import { DashboardNotificationsService } from '../notifications/types'; -import { DashboardCrudTypes } from '../../../common/content_management'; -import { DashboardScreenshotModeService } from '../screenshot_mode/types'; import { DashboardInitializerContextService } from '../initializer_context/types'; +import { DashboardNotificationsService } from '../notifications/types'; import { DashboardSavedObjectsTaggingService } from '../saved_objects_tagging/types'; -import { DashboardBackupServiceType } from '../dashboard_backup/types'; +import { DashboardScreenshotModeService } from '../screenshot_mode/types'; +import { DashboardSpacesService } from '../spaces/types'; import { DashboardDuplicateTitleCheckProps } from './lib/check_for_duplicate_dashboard_title'; +import { + FindDashboardsByIdResponse, + SearchDashboardsArgs, + SearchDashboardsResponse, +} from './lib/find_dashboards'; export interface DashboardContentManagementRequiredServices { data: DashboardDataService; @@ -61,13 +62,17 @@ export interface LoadDashboardFromSavedObjectProps { type DashboardResolveMeta = DashboardCrudTypes['GetOut']['meta']; +export type SavedDashboardInput = DashboardContainerInput & { + controlGroupInput?: PersistableControlGroupInput; +}; + export interface LoadDashboardReturn { dashboardFound: boolean; newDashboardCreated?: boolean; dashboardId?: string; managed?: boolean; resolveMeta?: DashboardResolveMeta; - dashboardInput: DashboardContainerInput; + dashboardInput: SavedDashboardInput; anyMigrationRun?: boolean; } @@ -77,7 +82,7 @@ export interface LoadDashboardReturn { export type SavedDashboardSaveOpts = SavedObjectSaveOpts & { saveAsCopy?: boolean }; export interface SaveDashboardProps { - currentState: DashboardContainerInput; + currentState: SavedDashboardInput; saveOptions: SavedDashboardSaveOpts; lastSavedId?: string; } diff --git a/src/plugins/discover/public/application/main/components/top_nav/discover_topnav_serverless.test.tsx b/src/plugins/discover/public/application/main/components/top_nav/discover_topnav_serverless.test.tsx index 85d273728f6a2..72c1667172961 100644 --- a/src/plugins/discover/public/application/main/components/top_nav/discover_topnav_serverless.test.tsx +++ b/src/plugins/discover/public/application/main/components/top_nav/discover_topnav_serverless.test.tsx @@ -130,8 +130,8 @@ describe('DiscoverTopNavServerless', () => { }); }); - describe('LogExplorerTabs', () => { - it('should render when showLogExplorerTabs is true', async () => { + describe('LogsExplorerTabs', () => { + it('should render when showLogsExplorerTabs is true', async () => { mockUseKibana.mockReturnValue({ services: { ...mockDiscoverService, @@ -148,12 +148,12 @@ describe('DiscoverTopNavServerless', () => { const topNav = screen.queryByTestId('discoverTopNavServerless'); expect(topNav).not.toBeNull(); await waitFor(() => { - const logExplorerTabs = screen.queryByTestId('logExplorerTabs'); + const logExplorerTabs = screen.queryByTestId('logsExplorerTabs'); expect(logExplorerTabs).not.toBeNull(); }); }); - it('should not render when showLogExplorerTabs is false', async () => { + it('should not render when showLogsExplorerTabs is false', async () => { mockUseKibana.mockReturnValue({ services: { ...mockDiscoverService, @@ -169,7 +169,7 @@ describe('DiscoverTopNavServerless', () => { const topNav = screen.queryByTestId('discoverTopNavServerless'); expect(topNav).not.toBeNull(); await waitFor(() => { - const logExplorerTabs = screen.queryByTestId('logExplorerTabs'); + const logExplorerTabs = screen.queryByTestId('logsExplorerTabs'); expect(logExplorerTabs).toBeNull(); }); }); diff --git a/src/plugins/discover/public/components/log_explorer_tabs/log_explorer_tabs.tsx b/src/plugins/discover/public/components/log_explorer_tabs/log_explorer_tabs.tsx index ea9504d6b7ba1..fb9895b62b269 100644 --- a/src/plugins/discover/public/components/log_explorer_tabs/log_explorer_tabs.tsx +++ b/src/plugins/discover/public/components/log_explorer_tabs/log_explorer_tabs.tsx @@ -41,7 +41,7 @@ export const LogExplorerTabs = ({ services, selectedTab }: LogExplorerTabsProps) }); return ( - + - {i18n.translate('discover.logExplorerTabs.discover', { + {i18n.translate('discover.logsExplorerTabs.discover', { defaultMessage: 'Discover', })} @@ -58,9 +58,9 @@ export const LogExplorerTabs = ({ services, selectedTab }: LogExplorerTabsProps) href={logExplorerUrl} onClick={navigateToLogExplorer} css={{ '.euiTab__content': { lineHeight: euiTheme.size.xxxl } }} - data-test-subj="logExplorerTab" + data-test-subj="logsExplorerTab" > - {i18n.translate('discover.logExplorerTabs.logExplorer', { + {i18n.translate('discover.logsExplorerTabs.logsExplorer', { defaultMessage: 'Logs Explorer', })} diff --git a/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts b/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts index c7ec7deaa16a9..97c2c74814db1 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts @@ -155,6 +155,7 @@ export const applicationUsageSchema = { ml: commonSchema, monitoring: commonSchema, 'observability-log-explorer': commonSchema, + 'observability-logs-explorer': commonSchema, 'observability-overview': commonSchema, observabilityOnboarding: commonSchema, observabilityAIAssistant: commonSchema, diff --git a/src/plugins/management/public/plugin.tsx b/src/plugins/management/public/plugin.tsx index ee0668d0b9c7a..f3df5201cae7e 100644 --- a/src/plugins/management/public/plugin.tsx +++ b/src/plugins/management/public/plugin.tsx @@ -6,8 +6,6 @@ * Side Public License, v 1. */ -import React from 'react'; -import ReactDOM from 'react-dom'; import { i18n as kbnI18n } from '@kbn/i18n'; import { BehaviorSubject } from 'rxjs'; import type { SharePluginSetup, SharePluginStart } from '@kbn/share-plugin/public'; @@ -25,8 +23,6 @@ import { AppNavLinkStatus, AppDeepLink, } from '@kbn/core/public'; -import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; -import { withSuspense } from '@kbn/shared-ux-utility'; import { ConfigSchema, ManagementSetup, ManagementStart, NavigationCardsSubject } from './types'; import { MANAGEMENT_APP_ID } from '../common/contants'; @@ -47,12 +43,6 @@ interface ManagementStartDependencies { serverless?: ServerlessPluginStart; } -const LazyKibanaSettingsApplication = React.lazy(async () => ({ - default: (await import('@kbn/management-settings-application')).KibanaSettingsApplication, -})); - -const KibanaSettingsApplication = withSuspense(LazyKibanaSettingsApplication); - export class ManagementPlugin implements Plugin< @@ -176,33 +166,6 @@ export class ManagementPlugin }); } - // Register the Settings app only if in serverless, until we integrate the SettingsApplication into the Advanced settings plugin - // Otherwise, it will be double registered from the Advanced settings plugin - if (plugins.serverless) { - const title = kbnI18n.translate('management.settings.settingsLabel', { - defaultMessage: 'Advanced Settings', - }); - - this.managementSections.definedSections.kibana.registerApp({ - id: 'settings', - title, - order: 3, - async mount({ element, setBreadcrumbs, history }) { - setBreadcrumbs([{ text: title }]); - - ReactDOM.render( - - - , - element - ); - return () => { - ReactDOM.unmountComponentAtNode(element); - }; - }, - }); - } - return { setIsSidebarEnabled: (isSidebarEnabled: boolean) => this.isSidebarEnabled$.next(isSidebarEnabled), diff --git a/src/plugins/management/tsconfig.json b/src/plugins/management/tsconfig.json index acbf33fc46abc..df0a876b4b3c4 100644 --- a/src/plugins/management/tsconfig.json +++ b/src/plugins/management/tsconfig.json @@ -25,10 +25,7 @@ "@kbn/test-jest-helpers", "@kbn/config-schema", "@kbn/serverless", - "@kbn/management-settings-application", - "@kbn/react-kibana-context-render", - "@kbn/shared-ux-utility", - "@kbn/shared-ux-error-boundary" + "@kbn/shared-ux-error-boundary", ], "exclude": [ "target/**/*" diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index 7fbf4ad7aeeb3..7686be9584e4e 100644 --- a/src/plugins/telemetry/schema/oss_plugins.json +++ b/src/plugins/telemetry/schema/oss_plugins.json @@ -4718,6 +4718,137 @@ } } }, + "observability-logs-explorer": { + "properties": { + "appId": { + "type": "keyword", + "_meta": { + "description": "The application being tracked" + } + }, + "viewId": { + "type": "keyword", + "_meta": { + "description": "Always `main`" + } + }, + "clicks_total": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application since we started counting them" + } + }, + "clicks_7_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application over the last 7 days" + } + }, + "clicks_30_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application over the last 30 days" + } + }, + "clicks_90_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application over the last 90 days" + } + }, + "minutes_on_screen_total": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen since we started counting them." + } + }, + "minutes_on_screen_7_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen over the last 7 days" + } + }, + "minutes_on_screen_30_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen over the last 30 days" + } + }, + "minutes_on_screen_90_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen over the last 90 days" + } + }, + "views": { + "type": "array", + "items": { + "properties": { + "appId": { + "type": "keyword", + "_meta": { + "description": "The application being tracked" + } + }, + "viewId": { + "type": "keyword", + "_meta": { + "description": "The application view being tracked" + } + }, + "clicks_total": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application sub view since we started counting them" + } + }, + "clicks_7_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the active application sub view over the last 7 days" + } + }, + "clicks_30_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the active application sub view over the last 30 days" + } + }, + "clicks_90_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the active application sub view over the last 90 days" + } + }, + "minutes_on_screen_total": { + "type": "float", + "_meta": { + "description": "Minutes the application sub view is active and on-screen since we started counting them." + } + }, + "minutes_on_screen_7_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen active application sub view over the last 7 days" + } + }, + "minutes_on_screen_30_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen active application sub view over the last 30 days" + } + }, + "minutes_on_screen_90_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen active application sub view over the last 90 days" + } + } + } + } + } + } + }, "observability-overview": { "properties": { "appId": { diff --git a/src/plugins/visualizations/public/embeddable/interfaces/has_visualize_config.ts b/src/plugins/visualizations/public/embeddable/interfaces/has_visualize_config.ts index a6cd54f55ed86..d62474f2c0bd2 100644 --- a/src/plugins/visualizations/public/embeddable/interfaces/has_visualize_config.ts +++ b/src/plugins/visualizations/public/embeddable/interfaces/has_visualize_config.ts @@ -6,13 +6,18 @@ * Side Public License, v 1. */ +import { type HasType, apiIsOfType } from '@kbn/presentation-publishing'; import { VisParams } from '../../types'; import Vis from '../../vis'; -export interface HasVisualizeConfig { +export type HasVisualizeConfig = HasType<'visualization'> & { getVis: () => Vis; -} +}; export const apiHasVisualizeConfig = (api: unknown): api is HasVisualizeConfig => { - return Boolean(api && typeof (api as HasVisualizeConfig).getVis === 'function'); + return Boolean( + api && + apiIsOfType(api, 'visualization') && + typeof (api as HasVisualizeConfig).getVis === 'function' + ); }; diff --git a/src/plugins/visualizations/tsconfig.json b/src/plugins/visualizations/tsconfig.json index 296367543271a..5b1a718d551c8 100644 --- a/src/plugins/visualizations/tsconfig.json +++ b/src/plugins/visualizations/tsconfig.json @@ -67,7 +67,8 @@ "@kbn/logging", "@kbn/content-management-table-list-view-common", "@kbn/chart-expressions-common", - "@kbn/shared-ux-utility" + "@kbn/shared-ux-utility", + "@kbn/presentation-publishing" ], "exclude": [ "target/**/*", diff --git a/test/examples/expressions_explorer/expressions.ts b/test/examples/expressions_explorer/expressions.ts index 916a81c781ec1..cd796f3bfc3a1 100644 --- a/test/examples/expressions_explorer/expressions.ts +++ b/test/examples/expressions_explorer/expressions.ts @@ -53,7 +53,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { await find.clickByCssSelector(selector); await retry.try(async () => { const text = await browser.getCurrentUrl(); - expect(text).to.contain('https://www.google.com/'); + expect(text).to.contain('https://www.google.com'); }); }); }); diff --git a/test/functional/apps/management/data_views/_cache.ts b/test/functional/apps/management/data_views/_cache.ts index 447e44052bb8d..764dd99d20252 100644 --- a/test/functional/apps/management/data_views/_cache.ts +++ b/test/functional/apps/management/data_views/_cache.ts @@ -11,7 +11,7 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['settings', 'common', 'header']); - const find = getService('find'); + const testSubjects = getService('testSubjects'); describe('Data view field caps cache advanced setting', async function () { before(async () => { @@ -19,8 +19,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.settings.clickKibanaSettings(); }); it('should have cache setting', async () => { - const cacheSetting = await find.byCssSelector('#data_views\\:cache_max_age-group'); - expect(cacheSetting).to.not.be(undefined); + expect( + await testSubjects.exists('management-settings-editField-data_views:cache_max_age') + ).to.be(true); }); }); } diff --git a/test/functional/fixtures/kbn_archiver/managed_content.json b/test/functional/fixtures/kbn_archiver/managed_content.json index b530dfd3f2352..3bd33217c4e58 100644 --- a/test/functional/fixtures/kbn_archiver/managed_content.json +++ b/test/functional/fixtures/kbn_archiver/managed_content.json @@ -7,3 +7,7 @@ {"attributes":{"columns":["@tags","clientip"],"description":"","grid":{},"hideChart":false,"isTextBasedQuery":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"agent.raw:\\\"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)\\\" \",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"timeRestore":false,"title":"Saved search","usesAdHocDataView":false},"coreMigrationVersion":"8.8.0","created_at":"2024-01-22T18:11:05.016Z","id":"managed-3d62-4113-ac7c-de2e20a68fbc","managed":true,"references":[{"id":"5f863f70-4728-4e8d-b441-db08f8c33b28","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"search","typeMigrationVersion":"8.0.0","updated_at":"2024-01-22T18:11:05.016Z","version":"WzIzLDFd"} {"attributes":{"columns":["@tags","clientip"],"description":"","grid":{},"hideChart":false,"isTextBasedQuery":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"agent.raw:\\\"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)\\\" \",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"timeRestore":false,"title":"Saved search","usesAdHocDataView":false},"coreMigrationVersion":"8.8.0","created_at":"2024-01-22T18:11:05.016Z","id":"unmanaged-3d62-4113-ac7c-de2e20a68fbc","managed":false,"references":[{"id":"5f863f70-4728-4e8d-b441-db08f8c33b28","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"search","typeMigrationVersion":"8.0.0","updated_at":"2024-01-22T18:11:05.016Z","version":"WzIzLDFd"} + +{"attributes":{"description":"","layerListJSON":"[{\"locale\":\"autoselect\",\"sourceDescriptor\":{\"type\":\"EMS_TMS\",\"isAutoSelect\":true,\"lightModeDefault\":\"road_map_desaturated\"},\"id\":\"5ff9c98e-e0d3-4aff-ac98-b33c191496b4\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":1,\"visible\":true,\"style\":{\"type\":\"EMS_VECTOR_TILE\",\"color\":\"\"},\"includeInFitToBounds\":true,\"type\":\"EMS_VECTOR_TILE\"}]","mapStateJSON":"{\"adHocDataViews\":[],\"zoom\":1.4,\"center\":{\"lon\":0,\"lat\":19.94277},\"timeFilters\":{\"from\":\"now-15m\",\"to\":\"now\"},\"refreshConfig\":{\"isPaused\":true,\"interval\":60000},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"settings\":{\"autoFitToDataBounds\":false,\"backgroundColor\":\"#ffffff\",\"customIcons\":[],\"disableInteractive\":false,\"disableTooltipControl\":false,\"hideToolbarOverlay\":false,\"hideLayerControl\":false,\"hideViewControl\":false,\"initialLocation\":\"LAST_SAVED_LOCATION\",\"fixedLocation\":{\"lat\":0,\"lon\":0,\"zoom\":2},\"browserLocation\":{\"zoom\":2},\"keydownScrollZoom\":false,\"maxZoom\":24,\"minZoom\":0,\"showScaleControl\":false,\"showSpatialFilters\":true,\"showTimesliderToggleButton\":true,\"spatialFiltersAlpa\":0.3,\"spatialFiltersFillColor\":\"#DA8B45\",\"spatialFiltersLineColor\":\"#DA8B45\"}}","title":"Map","uiStateJSON":"{\"isLayerTOCOpen\":true,\"openTOCDetails\":[]}"},"coreMigrationVersion":"8.8.0","created_at":"2024-01-24T18:22:40.360Z","id":"managed-d7ab-46eb-a807-8fed28ed8566","managed":true,"references":[],"type":"map","typeMigrationVersion":"8.4.0","updated_at":"2024-01-24T18:23:07.090Z","version":"WzEyLDFd"} + +{"attributes":{"description":"","layerListJSON":"[{\"locale\":\"autoselect\",\"sourceDescriptor\":{\"type\":\"EMS_TMS\",\"isAutoSelect\":true,\"lightModeDefault\":\"road_map_desaturated\"},\"id\":\"5ff9c98e-e0d3-4aff-ac98-b33c191496b4\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":1,\"visible\":true,\"style\":{\"type\":\"EMS_VECTOR_TILE\",\"color\":\"\"},\"includeInFitToBounds\":true,\"type\":\"EMS_VECTOR_TILE\"}]","mapStateJSON":"{\"adHocDataViews\":[],\"zoom\":1.4,\"center\":{\"lon\":0,\"lat\":19.94277},\"timeFilters\":{\"from\":\"now-15m\",\"to\":\"now\"},\"refreshConfig\":{\"isPaused\":true,\"interval\":60000},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"settings\":{\"autoFitToDataBounds\":false,\"backgroundColor\":\"#ffffff\",\"customIcons\":[],\"disableInteractive\":false,\"disableTooltipControl\":false,\"hideToolbarOverlay\":false,\"hideLayerControl\":false,\"hideViewControl\":false,\"initialLocation\":\"LAST_SAVED_LOCATION\",\"fixedLocation\":{\"lat\":0,\"lon\":0,\"zoom\":2},\"browserLocation\":{\"zoom\":2},\"keydownScrollZoom\":false,\"maxZoom\":24,\"minZoom\":0,\"showScaleControl\":false,\"showSpatialFilters\":true,\"showTimesliderToggleButton\":true,\"spatialFiltersAlpa\":0.3,\"spatialFiltersFillColor\":\"#DA8B45\",\"spatialFiltersLineColor\":\"#DA8B45\"}}","title":"Map","uiStateJSON":"{\"isLayerTOCOpen\":true,\"openTOCDetails\":[]}"},"coreMigrationVersion":"8.8.0","created_at":"2024-01-24T18:22:40.360Z","id":"unmanaged-d7ab-46eb-a807-8fed28ed8566","managed":false,"references":[],"type":"map","typeMigrationVersion":"8.4.0","updated_at":"2024-01-24T18:23:07.090Z","version":"WzEyLDFd"} diff --git a/test/functional/page_objects/settings_page.ts b/test/functional/page_objects/settings_page.ts index 2d85b6f662665..5e8fddb626efd 100644 --- a/test/functional/page_objects/settings_page.ts +++ b/test/functional/page_objects/settings_page.ts @@ -39,7 +39,7 @@ export class SettingsPageObject extends FtrService { async clickKibanaGlobalSettings() { await this.testSubjects.click('settings'); await this.header.waitUntilLoadingHasFinished(); - await this.testSubjects.click('advancedSettingsTab-global-settings'); + await this.testSubjects.click('settings-tab-global-settings'); } async clickKibanaSavedObjects() { @@ -73,21 +73,24 @@ export class SettingsPageObject extends FtrService { async getAdvancedSettings(propertyName: string) { this.log.debug('in getAdvancedSettings'); return await this.testSubjects.getAttribute( - `advancedSetting-editField-${propertyName}`, + `management-settings-editField-${propertyName}`, 'value' ); } async expectDisabledAdvancedSetting(propertyName: string) { expect( - await this.testSubjects.getAttribute(`advancedSetting-editField-${propertyName}`, 'disabled') + await this.testSubjects.getAttribute( + `management-settings-editField-${propertyName}`, + 'disabled' + ) ).to.eql('true'); } async getAdvancedSettingCheckbox(propertyName: string) { this.log.debug('in getAdvancedSettingCheckbox'); return await this.testSubjects.getAttribute( - `advancedSetting-editField-${propertyName}`, + `management-settings-editField-${propertyName}`, 'checked' ); } @@ -95,37 +98,37 @@ export class SettingsPageObject extends FtrService { async getAdvancedSettingAriaCheckbox(propertyName: string) { this.log.debug('in getAdvancedSettingAriaCheckbox'); return await this.testSubjects.getAttribute( - `advancedSetting-editField-${propertyName}`, + `management-settings-editField-${propertyName}`, 'aria-checked' ); } async clearAdvancedSettings(propertyName: string) { - await this.testSubjects.click(`advancedSetting-resetField-${propertyName}`); + await this.testSubjects.click(`management-settings-resetField-${propertyName}`); await this.header.waitUntilLoadingHasFinished(); - await this.testSubjects.click(`advancedSetting-saveButton`); + await this.testSubjects.click(`settings-save-button`); await this.header.waitUntilLoadingHasFinished(); } async setAdvancedSettingsSelect(propertyName: string, propertyValue: string) { await this.find.clickByCssSelector( - `[data-test-subj="advancedSetting-editField-${propertyName}"] option[value="${propertyValue}"]` + `[data-test-subj="management-settings-editField-${propertyName}"] option[value="${propertyValue}"]` ); await this.header.waitUntilLoadingHasFinished(); - await this.testSubjects.click(`advancedSetting-saveButton`); + await this.testSubjects.click(`settings-save-button`); await this.header.waitUntilLoadingHasFinished(); } async setAdvancedSettingsInput(propertyName: string, propertyValue: string) { - const input = await this.testSubjects.find(`advancedSetting-editField-${propertyName}`); + const input = await this.testSubjects.find(`management-settings-editField-${propertyName}`); await input.clearValue(); await input.type(propertyValue); - await this.testSubjects.click(`advancedSetting-saveButton`); + await this.testSubjects.click(`settings-save-button`); await this.header.waitUntilLoadingHasFinished(); } async setAdvancedSettingsTextArea(propertyName: string, propertyValue: string) { - const wrapper = await this.testSubjects.find(`advancedSetting-editField-${propertyName}`); + const wrapper = await this.testSubjects.find(`management-settings-editField-${propertyName}`); const textarea = await wrapper.findByTagName('textarea'); await textarea.focus(); // only way to properly replace the value of the ace editor is via the JS api @@ -133,17 +136,17 @@ export class SettingsPageObject extends FtrService { (editor: string, value: string) => { return (window as any).ace.edit(editor).setValue(value); }, - `advancedSetting-editField-${propertyName}-editor`, + `management-settings-editField-${propertyName}-editor`, propertyValue ); - await this.testSubjects.click(`advancedSetting-saveButton`); + await this.testSubjects.click(`settings-save-button`); await this.header.waitUntilLoadingHasFinished(); } async setAdvancedSettingsImage(propertyName: string, path: string) { - const input = await this.testSubjects.find(`advancedSetting-editField-${propertyName}`); + const input = await this.testSubjects.find(`management-settings-editField-${propertyName}`); await input.type(path); - await this.testSubjects.click(`advancedSetting-saveButton`); + await this.testSubjects.click(`settings-save-button`); await this.header.waitUntilLoadingHasFinished(); } @@ -155,9 +158,9 @@ export class SettingsPageObject extends FtrService { if (curValue === (value ? 'true' : 'false')) return; } - await this.testSubjects.click(`advancedSetting-editField-${propertyName}`); + await this.testSubjects.click(`management-settings-editField-${propertyName}`); await this.header.waitUntilLoadingHasFinished(); - await this.testSubjects.click(`advancedSetting-saveButton`); + await this.testSubjects.click(`settings-save-button`); await this.header.waitUntilLoadingHasFinished(); } diff --git a/test/plugin_functional/test_suites/core_plugins/rendering.ts b/test/plugin_functional/test_suites/core_plugins/rendering.ts index 0a924da955698..bc13a0c5a8e2a 100644 --- a/test/plugin_functional/test_suites/core_plugins/rendering.ts +++ b/test/plugin_functional/test_suites/core_plugins/rendering.ts @@ -102,6 +102,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { // Ensure that your change does not unintentionally expose any sensitive values! 'console.autocompleteDefinitions.endpointsAvailability (alternatives)', 'console.ui.enabled (boolean)', + 'console.ui.embeddedEnabled (boolean)', 'dashboard.allowByValueEmbeddables (boolean)', 'unifiedSearch.autocomplete.querySuggestions.enabled (boolean)', 'unifiedSearch.autocomplete.valueSuggestions.enabled (boolean)', @@ -270,7 +271,6 @@ export default function ({ getService }: PluginFunctionalProviderContext) { 'xpack.index_management.enableIndexStats (any)', 'xpack.index_management.editableIndexSettings (any)', 'xpack.index_management.enableDataStreamsStorageColumn (any)', - 'xpack.index_management.enableEmbeddedConsole (boolean)', 'xpack.infra.sources.default.fields.message (array)', /** * Feature flags bellow are conditional based on traditional/serverless offering diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/get_evaluate_route.gen.ts b/x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/get_evaluate_route.gen.ts new file mode 100644 index 0000000000000..0a6281d69d109 --- /dev/null +++ b/x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/get_evaluate_route.gen.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { z } from 'zod'; + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Get Evaluate API endpoint + * version: 1 + */ + +export type GetEvaluateResponse = z.infer; +export const GetEvaluateResponse = z.object({ + agentExecutors: z.array(z.string()), +}); diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/get_evaluate_route.schema.yaml b/x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/get_evaluate_route.schema.yaml new file mode 100644 index 0000000000000..b0c0c218eb9ac --- /dev/null +++ b/x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/get_evaluate_route.schema.yaml @@ -0,0 +1,40 @@ +openapi: 3.0.0 +info: + title: Get Evaluate API endpoint + version: '1' +paths: + /internal/elastic_assistant/evaluate: + get: + operationId: GetEvaluate + x-codegen-enabled: true + description: Get relevant data for performing an evaluation like available sample data, agents, and evaluators + summary: Get relevant data for performing an evaluation + tags: + - Evaluation API + responses: + '200': + description: Successful response + content: + application/json: + schema: + type: object + properties: + agentExecutors: + type: array + items: + type: string + required: + - agentExecutors + '400': + description: Generic Error + content: + application/json: + schema: + type: object + properties: + statusCode: + type: number + error: + type: string + message: + type: string diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.gen.ts b/x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.gen.ts new file mode 100644 index 0000000000000..d5d1177a9c16e --- /dev/null +++ b/x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.gen.ts @@ -0,0 +1,85 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { z } from 'zod'; + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Post Evaluate API endpoint + * version: 1 + */ + +export type OutputIndex = z.infer; +export const OutputIndex = z.string().regex(/^.kibana-elastic-ai-assistant-/); + +export type DatasetItem = z.infer; +export const DatasetItem = z.object({ + id: z.string().optional(), + input: z.string(), + prediction: z.string().optional(), + reference: z.string(), + tags: z.array(z.string()).optional(), +}); + +export type Dataset = z.infer; +export const Dataset = z.array(DatasetItem).default([]); + +export type PostEvaluateBody = z.infer; +export const PostEvaluateBody = z.object({ + dataset: Dataset.optional(), + evalPrompt: z.string().optional(), +}); + +export type PostEvaluateRequestQuery = z.infer; +export const PostEvaluateRequestQuery = z.object({ + /** + * Agents parameter description + */ + agents: z.string(), + /** + * Dataset Name parameter description + */ + datasetName: z.string().optional(), + /** + * Evaluation Type parameter description + */ + evaluationType: z.string().optional(), + /** + * Eval Model parameter description + */ + evalModel: z.string().optional(), + /** + * Models parameter description + */ + models: z.string(), + /** + * Output Index parameter description + */ + outputIndex: OutputIndex, + /** + * Project Name parameter description + */ + projectName: z.string().optional(), + /** + * Run Name parameter description + */ + runName: z.string().optional(), +}); +export type PostEvaluateRequestQueryInput = z.input; + +export type PostEvaluateRequestBody = z.infer; +export const PostEvaluateRequestBody = PostEvaluateBody; +export type PostEvaluateRequestBodyInput = z.input; + +export type PostEvaluateResponse = z.infer; +export const PostEvaluateResponse = z.object({ + evaluationId: z.string(), + success: z.boolean(), +}); diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.schema.yaml b/x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.schema.yaml new file mode 100644 index 0000000000000..41a7230e85ac5 --- /dev/null +++ b/x-pack/packages/kbn-elastic-assistant-common/impl/schemas/evaluation/post_evaluate_route.schema.yaml @@ -0,0 +1,126 @@ +openapi: 3.0.0 +info: + title: Post Evaluate API endpoint + version: '1' +paths: + /internal/elastic_assistant/evaluate: + post: + operationId: PostEvaluate + x-codegen-enabled: true + description: Perform an evaluation using sample data against a combination of Agents and Connectors + summary: Performs an evaluation of the Elastic Assistant + tags: + - Evaluation API + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PostEvaluateBody' + parameters: + - name: agents + in: query + description: Agents parameter description + required: true + schema: + type: string + - name: datasetName + in: query + description: Dataset Name parameter description + schema: + type: string + - name: evaluationType + in: query + description: Evaluation Type parameter description + schema: + type: string + - name: evalModel + in: query + description: Eval Model parameter description + schema: + type: string + - name: models + in: query + description: Models parameter description + required: true + schema: + type: string + - name: outputIndex + in: query + description: Output Index parameter description + required: true + schema: + $ref: '#/components/schemas/OutputIndex' + - name: projectName + in: query + description: Project Name parameter description + schema: + type: string + - name: runName + in: query + description: Run Name parameter description + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + type: object + properties: + evaluationId: + type: string + success: + type: boolean + required: + - evaluationId + - success + '400': + description: Generic Error + content: + application/json: + schema: + type: object + properties: + statusCode: + type: number + error: + type: string + message: + type: string +components: + schemas: + OutputIndex: + type: string + pattern: '^.kibana-elastic-ai-assistant-' + DatasetItem: + type: object + properties: + id: + type: string + input: + type: string + prediction: + type: string + reference: + type: string + tags: + type: array + items: + type: string + required: + - input + - reference + Dataset: + type: array + items: + $ref: '#/components/schemas/DatasetItem' + default: [] + PostEvaluateBody: + type: object + properties: + dataset: + $ref: '#/components/schemas/Dataset' + evalPrompt: + type: string diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/schemas/index.ts b/x-pack/packages/kbn-elastic-assistant-common/impl/schemas/index.ts new file mode 100644 index 0000000000000..4257cb9bae149 --- /dev/null +++ b/x-pack/packages/kbn-elastic-assistant-common/impl/schemas/index.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +// API versioning constants +export const API_VERSIONS = { + public: { + v1: '2023-10-31', + }, + internal: { + v1: '1', + }, +}; + +export const PUBLIC_API_ACCESS = 'public'; +export const INTERNAL_API_ACCESS = 'internal'; + +// Evaluation Schemas +export * from './evaluation/post_evaluate_route.gen'; +export * from './evaluation/get_evaluate_route.gen'; + +// Capabilities Schemas +export * from './capabilities/get_capabilities_route.gen'; diff --git a/x-pack/packages/kbn-elastic-assistant-common/index.ts b/x-pack/packages/kbn-elastic-assistant-common/index.ts index a2576038c6f51..e285be395c71c 100644 --- a/x-pack/packages/kbn-elastic-assistant-common/index.ts +++ b/x-pack/packages/kbn-elastic-assistant-common/index.ts @@ -5,7 +5,8 @@ * 2.0. */ -export { GetCapabilitiesResponse } from './impl/schemas/capabilities/get_capabilities_route.gen'; +// Schema constants +export * from './impl/schemas'; export { defaultAssistantFeatures } from './impl/capabilities'; export type { AssistantFeatures } from './impl/capabilities'; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.test.tsx index 4c71c1e63f8b3..26a37e12c4e53 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.test.tsx @@ -13,7 +13,6 @@ import { fetchConnectorExecuteAction, FetchConnectorExecuteAction, getKnowledgeBaseStatus, - postEvaluation, postKnowledgeBase, } from './api'; import type { Conversation, Message } from '../assistant_context/types'; @@ -340,52 +339,4 @@ describe('API tests', () => { await expect(deleteKnowledgeBase(knowledgeBaseArgs)).resolves.toThrowError('simulated error'); }); }); - - describe('postEvaluation', () => { - it('calls the knowledge base API when correct resource path', async () => { - (mockHttp.fetch as jest.Mock).mockResolvedValue({ success: true }); - const testProps = { - http: mockHttp, - evalParams: { - agents: ['not', 'alphabetical'], - dataset: '{}', - datasetName: 'Test Dataset', - projectName: 'Test Project Name', - runName: 'Test Run Name', - evalModel: ['not', 'alphabetical'], - evalPrompt: 'evalPrompt', - evaluationType: ['not', 'alphabetical'], - models: ['not', 'alphabetical'], - outputIndex: 'outputIndex', - }, - }; - - await postEvaluation(testProps); - - expect(mockHttp.fetch).toHaveBeenCalledWith('/internal/elastic_assistant/evaluate', { - method: 'POST', - body: '{"dataset":{},"evalPrompt":"evalPrompt"}', - headers: { 'Content-Type': 'application/json' }, - query: { - models: 'alphabetical,not', - agents: 'alphabetical,not', - datasetName: 'Test Dataset', - evaluationType: 'alphabetical,not', - evalModel: 'alphabetical,not', - outputIndex: 'outputIndex', - projectName: 'Test Project Name', - runName: 'Test Run Name', - }, - signal: undefined, - }); - }); - it('returns error when error is an error', async () => { - const error = 'simulated error'; - (mockHttp.fetch as jest.Mock).mockImplementation(() => { - throw new Error(error); - }); - - await expect(postEvaluation(knowledgeBaseArgs)).resolves.toThrowError('simulated error'); - }); - }); }); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.tsx index f04b99c4e46e1..c18193c7fa0a6 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.tsx @@ -16,7 +16,6 @@ import { getOptionalRequestParams, hasParsableResponse, } from './helpers'; -import { PerformEvaluationParams } from './settings/evaluation_settings/use_perform_evaluation'; export interface FetchConnectorExecuteAction { isEnabledRAGAlerts: boolean; @@ -335,61 +334,3 @@ export const deleteKnowledgeBase = async ({ return error as IHttpFetchError; } }; - -export interface PostEvaluationParams { - http: HttpSetup; - evalParams?: PerformEvaluationParams; - signal?: AbortSignal | undefined; -} - -export interface PostEvaluationResponse { - evaluationId: string; - success: boolean; -} - -/** - * API call for evaluating models. - * - * @param {Object} options - The options object. - * @param {HttpSetup} options.http - HttpSetup - * @param {string} [options.evalParams] - Params necessary for evaluation - * @param {AbortSignal} [options.signal] - AbortSignal - * - * @returns {Promise} - */ -export const postEvaluation = async ({ - http, - evalParams, - signal, -}: PostEvaluationParams): Promise => { - try { - const path = `/internal/elastic_assistant/evaluate`; - const query = { - agents: evalParams?.agents.sort()?.join(','), - datasetName: evalParams?.datasetName, - evaluationType: evalParams?.evaluationType.sort()?.join(','), - evalModel: evalParams?.evalModel.sort()?.join(','), - outputIndex: evalParams?.outputIndex, - models: evalParams?.models.sort()?.join(','), - projectName: evalParams?.projectName, - runName: evalParams?.runName, - }; - - const response = await http.fetch(path, { - method: 'POST', - body: JSON.stringify({ - dataset: JSON.parse(evalParams?.dataset ?? '[]'), - evalPrompt: evalParams?.evalPrompt ?? '', - }), - headers: { - 'Content-Type': 'application/json', - }, - query, - signal, - }); - - return response as PostEvaluationResponse; - } catch (error) { - return error as IHttpFetchError; - } -}; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/capabilities/capabilities.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/capabilities/capabilities.test.tsx index b41d7ac144554..30c113eb0e803 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/capabilities/capabilities.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/capabilities/capabilities.test.tsx @@ -13,7 +13,7 @@ import { API_ERROR } from '../../translations'; jest.mock('@kbn/core-http-browser'); const mockHttp = { - fetch: jest.fn(), + get: jest.fn(), } as unknown as HttpSetup; describe('Capabilities API tests', () => { @@ -25,15 +25,14 @@ describe('Capabilities API tests', () => { it('calls the internal assistant API for fetching assistant capabilities', async () => { await getCapabilities({ http: mockHttp }); - expect(mockHttp.fetch).toHaveBeenCalledWith('/internal/elastic_assistant/capabilities', { - method: 'GET', + expect(mockHttp.get).toHaveBeenCalledWith('/internal/elastic_assistant/capabilities', { signal: undefined, version: '1', }); }); it('returns API_ERROR when the response status is error', async () => { - (mockHttp.fetch as jest.Mock).mockResolvedValue({ status: API_ERROR }); + (mockHttp.get as jest.Mock).mockResolvedValue({ status: API_ERROR }); const result = await getCapabilities({ http: mockHttp }); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/capabilities/capabilities.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/capabilities/capabilities.tsx index 59927dbf2c472..96e6660f6bc0e 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/capabilities/capabilities.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/capabilities/capabilities.tsx @@ -6,7 +6,7 @@ */ import { HttpSetup, IHttpFetchError } from '@kbn/core-http-browser'; -import { GetCapabilitiesResponse } from '@kbn/elastic-assistant-common'; +import { API_VERSIONS, GetCapabilitiesResponse } from '@kbn/elastic-assistant-common'; export interface GetCapabilitiesParams { http: HttpSetup; @@ -29,13 +29,10 @@ export const getCapabilities = async ({ try { const path = `/internal/elastic_assistant/capabilities`; - const response = await http.fetch(path, { - method: 'GET', + return await http.get(path, { signal, - version: '1', + version: API_VERSIONS.internal.v1, }); - - return response as GetCapabilitiesResponse; } catch (error) { return error as IHttpFetchError; } diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/capabilities/use_capabilities.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/capabilities/use_capabilities.test.tsx index c9e60b806d1bf..b7648983e6f7a 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/capabilities/use_capabilities.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/capabilities/use_capabilities.test.tsx @@ -11,11 +11,12 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import type { ReactNode } from 'react'; import React from 'react'; import { useCapabilities, UseCapabilitiesParams } from './use_capabilities'; +import { API_VERSIONS } from '@kbn/elastic-assistant-common'; const statusResponse = { assistantModelEvaluation: true, assistantStreamingEnabled: false }; const http = { - fetch: jest.fn().mockResolvedValue(statusResponse), + get: jest.fn().mockResolvedValue(statusResponse), }; const toasts = { addError: jest.fn(), @@ -36,14 +37,10 @@ describe('useFetchRelatedCases', () => { wrapper: createWrapper(), }); - expect(defaultProps.http.fetch).toHaveBeenCalledWith( - '/internal/elastic_assistant/capabilities', - { - method: 'GET', - version: '1', - signal: new AbortController().signal, - } - ); + expect(defaultProps.http.get).toHaveBeenCalledWith('/internal/elastic_assistant/capabilities', { + version: API_VERSIONS.internal.v1, + signal: new AbortController().signal, + }); expect(toasts.addError).not.toHaveBeenCalled(); }); }); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/evaluate/evaluate.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/evaluate/evaluate.test.tsx new file mode 100644 index 0000000000000..d25953370e97a --- /dev/null +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/evaluate/evaluate.test.tsx @@ -0,0 +1,69 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { postEvaluation } from './evaluate'; +import { HttpSetup } from '@kbn/core-http-browser'; +import { API_VERSIONS } from '@kbn/elastic-assistant-common'; + +jest.mock('@kbn/core-http-browser'); + +const mockHttp = { + post: jest.fn(), +} as unknown as HttpSetup; + +describe('postEvaluation', () => { + it('calls the knowledge base API when correct resource path', async () => { + (mockHttp.post as jest.Mock).mockResolvedValue({ success: true }); + const testProps = { + http: mockHttp, + evalParams: { + agents: ['not', 'alphabetical'], + dataset: '{}', + datasetName: 'Test Dataset', + projectName: 'Test Project Name', + runName: 'Test Run Name', + evalModel: ['not', 'alphabetical'], + evalPrompt: 'evalPrompt', + evaluationType: ['not', 'alphabetical'], + models: ['not', 'alphabetical'], + outputIndex: 'outputIndex', + }, + }; + + await postEvaluation(testProps); + + expect(mockHttp.post).toHaveBeenCalledWith('/internal/elastic_assistant/evaluate', { + body: '{"dataset":{},"evalPrompt":"evalPrompt"}', + headers: { 'Content-Type': 'application/json' }, + query: { + models: 'alphabetical,not', + agents: 'alphabetical,not', + datasetName: 'Test Dataset', + evaluationType: 'alphabetical,not', + evalModel: 'alphabetical,not', + outputIndex: 'outputIndex', + projectName: 'Test Project Name', + runName: 'Test Run Name', + }, + signal: undefined, + version: API_VERSIONS.internal.v1, + }); + }); + it('returns error when error is an error', async () => { + const error = 'simulated error'; + (mockHttp.post as jest.Mock).mockImplementation(() => { + throw new Error(error); + }); + + const knowledgeBaseArgs = { + resource: 'a-resource', + http: mockHttp, + }; + + await expect(postEvaluation(knowledgeBaseArgs)).resolves.toThrowError('simulated error'); + }); +}); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/evaluate/evaluate.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/evaluate/evaluate.tsx new file mode 100644 index 0000000000000..6581e22e77921 --- /dev/null +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/evaluate/evaluate.tsx @@ -0,0 +1,95 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { HttpSetup, IHttpFetchError } from '@kbn/core-http-browser'; +import { + API_VERSIONS, + GetEvaluateResponse, + PostEvaluateResponse, +} from '@kbn/elastic-assistant-common'; +import { PerformEvaluationParams } from './use_perform_evaluation'; + +export interface PostEvaluationParams { + http: HttpSetup; + evalParams?: PerformEvaluationParams; + signal?: AbortSignal | undefined; +} + +/** + * API call for evaluating models. + * + * @param {Object} options - The options object. + * @param {HttpSetup} options.http - HttpSetup + * @param {string} [options.evalParams] - Params necessary for evaluation + * @param {AbortSignal} [options.signal] - AbortSignal + * + * @returns {Promise} + */ +export const postEvaluation = async ({ + http, + evalParams, + signal, +}: PostEvaluationParams): Promise => { + try { + const path = `/internal/elastic_assistant/evaluate`; + const query = { + agents: evalParams?.agents.sort()?.join(','), + datasetName: evalParams?.datasetName, + evaluationType: evalParams?.evaluationType.sort()?.join(','), + evalModel: evalParams?.evalModel.sort()?.join(','), + outputIndex: evalParams?.outputIndex, + models: evalParams?.models.sort()?.join(','), + projectName: evalParams?.projectName, + runName: evalParams?.runName, + }; + + return await http.post(path, { + body: JSON.stringify({ + dataset: JSON.parse(evalParams?.dataset ?? '[]'), + evalPrompt: evalParams?.evalPrompt ?? '', + }), + headers: { + 'Content-Type': 'application/json', + }, + query, + signal, + version: API_VERSIONS.internal.v1, + }); + } catch (error) { + return error as IHttpFetchError; + } +}; + +export interface GetEvaluationParams { + http: HttpSetup; + signal?: AbortSignal | undefined; +} + +/** + * API call for fetching evaluation data. + * + * @param {Object} options - The options object. + * @param {HttpSetup} options.http - HttpSetup + * @param {AbortSignal} [options.signal] - AbortSignal + * + * @returns {Promise} + */ +export const getEvaluation = async ({ + http, + signal, +}: GetEvaluationParams): Promise => { + try { + const path = `/internal/elastic_assistant/evaluate`; + + return await http.get(path, { + signal, + version: API_VERSIONS.internal.v1, + }); + } catch (error) { + return error as IHttpFetchError; + } +}; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/evaluate/use_evaluation_data.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/evaluate/use_evaluation_data.tsx new file mode 100644 index 0000000000000..a37cf18a235ec --- /dev/null +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/evaluate/use_evaluation_data.tsx @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useQuery } from '@tanstack/react-query'; +import type { HttpSetup, IHttpFetchError, ResponseErrorBody } from '@kbn/core-http-browser'; +import type { IToasts } from '@kbn/core-notifications-browser'; +import { i18n } from '@kbn/i18n'; +import { getEvaluation } from './evaluate'; + +const EVALUATION_DATA_QUERY_KEY = ['elastic-assistant', 'evaluation-data']; + +export interface UseEvaluationDataParams { + http: HttpSetup; + toasts?: IToasts; +} + +/** + * Hook for fetching evaluation data, like available agents, test data, etc + * + * @param {Object} options - The options object. + * @param {HttpSetup} options.http - HttpSetup + * @param {IToasts} [options.toasts] - IToasts + * + * @returns {useMutation} mutation hook for setting up the Knowledge Base + */ +export const useEvaluationData = ({ http, toasts }: UseEvaluationDataParams) => { + return useQuery({ + queryKey: EVALUATION_DATA_QUERY_KEY, + queryFn: ({ signal }) => { + // Optional params workaround: see: https://github.com/TanStack/query/issues/1077#issuecomment-1431247266 + return getEvaluation({ http, signal }); + }, + retry: false, + keepPreviousData: true, + // Deprecated, hoist to `queryCache` w/in `QueryClient. See: https://stackoverflow.com/a/76961109 + onError: (error: IHttpFetchError) => { + if (error.name !== 'AbortError') { + toasts?.addError(error.body && error.body.message ? new Error(error.body.message) : error, { + title: i18n.translate('xpack.elasticAssistant.evaluation.fetchEvaluationDataError', { + defaultMessage: 'Error fetching evaluation data...', + }), + }); + } + }, + }); +}; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/evaluation_settings/use_perform_evaluation.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/evaluate/use_perform_evaluation.test.tsx similarity index 81% rename from x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/evaluation_settings/use_perform_evaluation.test.tsx rename to x-pack/packages/kbn-elastic-assistant/impl/assistant/api/evaluate/use_perform_evaluation.test.tsx index b065338480549..f9fdb2e80b7b2 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/evaluation_settings/use_perform_evaluation.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/evaluate/use_perform_evaluation.test.tsx @@ -7,14 +7,15 @@ import { act, renderHook } from '@testing-library/react-hooks'; import { usePerformEvaluation, UsePerformEvaluationParams } from './use_perform_evaluation'; -import { postEvaluation as _postEvaluation } from '../../api'; +import { postEvaluation as _postEvaluation } from './evaluate'; import { useMutation as _useMutation } from '@tanstack/react-query'; +import { API_VERSIONS } from '@kbn/elastic-assistant-common'; const useMutationMock = _useMutation as jest.Mock; const postEvaluationMock = _postEvaluation as jest.Mock; -jest.mock('../../api', () => { - const actual = jest.requireActual('../../api'); +jest.mock('./evaluate', () => { + const actual = jest.requireActual('./evaluate'); return { ...actual, postEvaluation: jest.fn((...args) => actual.postEvaluation(...args)), @@ -37,7 +38,7 @@ const statusResponse = { }; const http = { - fetch: jest.fn().mockResolvedValue(statusResponse), + post: jest.fn().mockResolvedValue(statusResponse), }; const toasts = { addError: jest.fn(), @@ -53,20 +54,23 @@ describe('usePerformEvaluation', () => { const { waitForNextUpdate } = renderHook(() => usePerformEvaluation(defaultProps)); await waitForNextUpdate(); - expect(defaultProps.http.fetch).toHaveBeenCalledWith('/internal/elastic_assistant/evaluate', { - method: 'POST', + expect(defaultProps.http.post).toHaveBeenCalledWith('/internal/elastic_assistant/evaluate', { body: '{"dataset":[],"evalPrompt":""}', headers: { 'Content-Type': 'application/json', }, query: { agents: undefined, + datasetName: undefined, evalModel: undefined, evaluationType: undefined, models: undefined, outputIndex: undefined, + projectName: undefined, + runName: undefined, }, signal: undefined, + version: API_VERSIONS.internal.v1, }); expect(toasts.addError).not.toHaveBeenCalled(); }); @@ -82,6 +86,8 @@ describe('usePerformEvaluation', () => { evaluationType: ['f', 'e'], models: ['h', 'g'], outputIndex: 'outputIndex', + projectName: 'test project', + runName: 'test run', }); return Promise.resolve(res); } catch (e) { @@ -92,20 +98,23 @@ describe('usePerformEvaluation', () => { const { waitForNextUpdate } = renderHook(() => usePerformEvaluation(defaultProps)); await waitForNextUpdate(); - expect(defaultProps.http.fetch).toHaveBeenCalledWith('/internal/elastic_assistant/evaluate', { - method: 'POST', + expect(defaultProps.http.post).toHaveBeenCalledWith('/internal/elastic_assistant/evaluate', { body: '{"dataset":["kewl"],"evalPrompt":"evalPrompt"}', headers: { 'Content-Type': 'application/json', }, query: { agents: 'c,d', + datasetName: undefined, evalModel: 'a,b', evaluationType: 'e,f', models: 'g,h', outputIndex: 'outputIndex', + projectName: 'test project', + runName: 'test run', }, signal: undefined, + version: API_VERSIONS.internal.v1, }); }); }); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/evaluation_settings/use_perform_evaluation.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/evaluate/use_perform_evaluation.tsx similarity index 97% rename from x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/evaluation_settings/use_perform_evaluation.tsx rename to x-pack/packages/kbn-elastic-assistant/impl/assistant/api/evaluate/use_perform_evaluation.tsx index 158f7159310ad..30e95d9d80407 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/evaluation_settings/use_perform_evaluation.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/evaluate/use_perform_evaluation.tsx @@ -9,7 +9,7 @@ import { useMutation } from '@tanstack/react-query'; import type { HttpSetup, IHttpFetchError, ResponseErrorBody } from '@kbn/core-http-browser'; import type { IToasts } from '@kbn/core-notifications-browser'; import { i18n } from '@kbn/i18n'; -import { postEvaluation } from '../../api'; +import { postEvaluation } from './evaluate'; const PERFORM_EVALUATION_MUTATION_KEY = ['elastic-assistant', 'perform-evaluation']; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/evaluation_settings/evaluation_settings.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/evaluation_settings/evaluation_settings.tsx index f4fe4d7f8a407..09cdf6717ca6c 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/evaluation_settings/evaluation_settings.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/evaluation_settings/evaluation_settings.tsx @@ -27,20 +27,16 @@ import { import { css } from '@emotion/react'; import { FormattedMessage } from '@kbn/i18n-react'; +import type { GetEvaluateResponse, PostEvaluateResponse } from '@kbn/elastic-assistant-common'; import * as i18n from './translations'; import { useAssistantContext } from '../../../assistant_context'; import { useLoadConnectors } from '../../../connectorland/use_load_connectors'; import { getActionTypeTitle, getGenAiConfig } from '../../../connectorland/helpers'; import { PRECONFIGURED_CONNECTOR } from '../../../connectorland/translations'; -import { usePerformEvaluation } from './use_perform_evaluation'; +import { usePerformEvaluation } from '../../api/evaluate/use_perform_evaluation'; import { getApmLink, getDiscoverLink } from './utils'; -import { PostEvaluationResponse } from '../../api'; +import { useEvaluationData } from '../../api/evaluate/use_evaluation_data'; -/** - * See AGENT_EXECUTOR_MAP in `x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.ts` - * for the agent name -> executor mapping - */ -const DEFAULT_AGENTS = ['DefaultAgentExecutor', 'OpenAIFunctionsExecutor']; const DEFAULT_EVAL_TYPES_OPTIONS = [ { label: 'correctness' }, { label: 'esql-validator', disabled: true }, @@ -65,6 +61,11 @@ export const EvaluationSettings: React.FC = React.memo(({ onEvaluationSet } = usePerformEvaluation({ http, }); + const { data: evalData } = useEvaluationData({ http }); + const defaultAgents = useMemo( + () => (evalData as GetEvaluateResponse)?.agentExecutors ?? [], + [evalData] + ); // Run Details // Project Name @@ -195,8 +196,8 @@ export const EvaluationSettings: React.FC = React.memo(({ onEvaluationSet [selectedAgentOptions] ); const agentOptions = useMemo(() => { - return DEFAULT_AGENTS.map((label) => ({ label })); - }, []); + return defaultAgents.map((label) => ({ label })); + }, [defaultAgents]); // Evaluation // Evaluation Type @@ -283,12 +284,12 @@ export const EvaluationSettings: React.FC = React.memo(({ onEvaluationSet ]); const discoverLink = useMemo( - () => getDiscoverLink(basePath, (evalResponse as PostEvaluationResponse)?.evaluationId ?? ''), + () => getDiscoverLink(basePath, (evalResponse as PostEvaluateResponse)?.evaluationId ?? ''), [basePath, evalResponse] ); const apmLink = useMemo( - () => getApmLink(basePath, (evalResponse as PostEvaluationResponse)?.evaluationId ?? ''), + () => getApmLink(basePath, (evalResponse as PostEvaluateResponse)?.evaluationId ?? ''), [basePath, evalResponse] ); diff --git a/x-pack/packages/kbn-slo-schema/src/models/duration.ts b/x-pack/packages/kbn-slo-schema/src/models/duration.ts index 33ff6cbd25ac8..d507dcee6514e 100644 --- a/x-pack/packages/kbn-slo-schema/src/models/duration.ts +++ b/x-pack/packages/kbn-slo-schema/src/models/duration.ts @@ -57,6 +57,10 @@ class Duration { asSeconds(): number { return moment.duration(this.value, toMomentUnitOfTime(this.unit)).asSeconds(); } + + asMinutes(): number { + return moment.duration(this.value, toMomentUnitOfTime(this.unit)).asMinutes(); + } } const toDurationUnit = (unit: string): DurationUnit => { diff --git a/x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts b/x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts index 4f72827957ef7..c939d25cfac15 100644 --- a/x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts +++ b/x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts @@ -60,13 +60,18 @@ const createSLOResponseSchema = t.type({ }); const getPreviewDataParamsSchema = t.type({ - body: t.type({ - indicator: indicatorSchema, - range: t.type({ - start: t.number, - end: t.number, + body: t.intersection([ + t.type({ + indicator: indicatorSchema, + range: t.type({ + start: t.number, + end: t.number, + }), }), - }), + t.partial({ + objective: objectiveSchema, + }), + ]), }); const getPreviewDataResponseSchema = t.array(previewDataSchema); @@ -282,6 +287,7 @@ type BudgetingMethod = t.OutputOf; type TimeWindow = t.OutputOf; type IndicatorType = t.OutputOf; type Indicator = t.OutputOf; +type Objective = t.OutputOf; type APMTransactionErrorRateIndicator = t.OutputOf; type APMTransactionDurationIndicator = t.OutputOf; type MetricCustomIndicator = t.OutputOf; @@ -350,6 +356,7 @@ export type { GetSLOInstancesResponse, IndicatorType, Indicator, + Objective, MetricCustomIndicator, TimesliceMetricIndicator, TimesliceMetricBasicMetricWithField, diff --git a/x-pack/plugins/apm/common/instances.ts b/x-pack/plugins/apm/common/instances.ts new file mode 100644 index 0000000000000..8a1cdb4eed538 --- /dev/null +++ b/x-pack/plugins/apm/common/instances.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import * as t from 'io-ts'; + +export const instancesSortFieldRt = t.keyof({ + serviceNodeName: null, + latency: null, + throughput: null, + errorRate: null, + cpuUsage: null, + memoryUsage: null, +}); + +export type InstancesSortField = t.TypeOf; diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts b/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts index 889724f664f9b..c0c3c032a0e61 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts @@ -115,6 +115,31 @@ describe('Service inventory', () => { }); }); + describe('Table search', () => { + beforeEach(() => { + cy.updateAdvancedSettings({ + 'observability:apmEnableTableSearchBar': true, + }); + + cy.loginAsEditorUser(); + }); + + it('filters for java service on the table', () => { + cy.visitKibana(serviceInventoryHref); + cy.contains('opbeans-node'); + cy.contains('opbeans-java'); + cy.contains('opbeans-rum'); + cy.get('[data-test-subj="tableSearchInput"]').type('java'); + cy.contains('opbeans-node').should('not.exist'); + cy.contains('opbeans-java'); + cy.contains('opbeans-rum').should('not.exist'); + cy.get('[data-test-subj="tableSearchInput"]').clear(); + cy.contains('opbeans-node'); + cy.contains('opbeans-java'); + cy.contains('opbeans-rum'); + }); + }); + describe('Check detailed statistics API with multiple services', () => { before(() => { // clean previous data created diff --git a/x-pack/plugins/apm/public/components/alerting/ui_components/alert_details_app_section/index.tsx b/x-pack/plugins/apm/public/components/alerting/ui_components/alert_details_app_section/index.tsx index f8b14acfb364a..ad80482d70ffb 100644 --- a/x-pack/plugins/apm/public/components/alerting/ui_components/alert_details_app_section/index.tsx +++ b/x-pack/plugins/apm/public/components/alerting/ui_components/alert_details_app_section/index.tsx @@ -21,6 +21,7 @@ import React, { useEffect, useMemo } from 'react'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { getPaddedAlertTimeRange } from '@kbn/observability-get-padded-alert-time-range-util'; import { EuiCallOut } from '@elastic/eui'; +import { CoreStart } from '@kbn/core/public'; import { SERVICE_ENVIRONMENT } from '../../../../../common/es_fields/apm'; import { ChartPointerEventContextProvider } from '../../../../context/chart_pointer_event/chart_pointer_event_context'; import { TimeRangeMetadataContextProvider } from '../../../../context/time_range_metadata/time_range_metadata_context'; @@ -35,6 +36,7 @@ import { SERVICE_NAME, TRANSACTION_TYPE, } from './types'; +import { createCallApmApi } from '../../../../services/rest/create_call_apm_api'; export function AlertDetailsAppSection({ rule, @@ -42,6 +44,12 @@ export function AlertDetailsAppSection({ timeZone, setAlertSummaryFields, }: AlertDetailsAppSectionProps) { + const alertRuleTypeId = alert.fields[ALERT_RULE_TYPE_ID]; + const alertEvaluationValue = alert.fields[ALERT_EVALUATION_VALUE]; + const alertEvaluationThreshold = alert.fields[ALERT_EVALUATION_THRESHOLD]; + const environment = alert.fields[SERVICE_ENVIRONMENT]; + const serviceName = String(alert.fields[SERVICE_NAME]); + useEffect(() => { const alertSummaryFields = [ { @@ -52,8 +60,8 @@ export function AlertDetailsAppSection({ /> ), value: formatAlertEvaluationValue( - alert?.fields[ALERT_RULE_TYPE_ID], - alert?.fields[ALERT_EVALUATION_VALUE] + alertRuleTypeId, + alertEvaluationValue ), }, { @@ -64,8 +72,8 @@ export function AlertDetailsAppSection({ /> ), value: formatAlertEvaluationValue( - alert?.fields[ALERT_RULE_TYPE_ID], - alert?.fields[ALERT_EVALUATION_THRESHOLD] + alertRuleTypeId, + alertEvaluationThreshold ), }, { @@ -75,7 +83,7 @@ export function AlertDetailsAppSection({ defaultMessage="Service environment" /> ), - value: alert?.fields[SERVICE_ENVIRONMENT], + value: environment, }, { label: ( @@ -84,20 +92,27 @@ export function AlertDetailsAppSection({ defaultMessage="Service name" /> ), - value: alert?.fields[SERVICE_NAME], + value: serviceName, }, ]; setAlertSummaryFields(alertSummaryFields); - }, [alert?.fields, setAlertSummaryFields]); + }, [ + alertRuleTypeId, + alertEvaluationValue, + alertEvaluationThreshold, + environment, + serviceName, + setAlertSummaryFields, + ]); - const { - services: { uiSettings }, - } = useKibana(); + const { services } = useKibana(); + + useEffect(() => { + createCallApmApi(services as CoreStart); + }, [services]); const params = rule.params; - const environment = alert.fields[SERVICE_ENVIRONMENT]; const latencyAggregationType = getAggsTypeFromRule(params.aggregationType); - const serviceName = String(alert.fields[SERVICE_NAME]); const timeRange = getPaddedAlertTimeRange( alert.fields[ALERT_START]!, alert.fields[ALERT_END] @@ -141,7 +156,7 @@ export function AlertDetailsAppSection({ end={to} kuery="" useSpanName={false} - uiSettings={uiSettings!} + uiSettings={services.uiSettings!} > diff --git a/x-pack/plugins/apm/public/components/app/dependency_operation_detail_view/index.tsx b/x-pack/plugins/apm/public/components/app/dependency_operation_detail_view/index.tsx index 9aeff02dff4f3..858d80e645ae4 100644 --- a/x-pack/plugins/apm/public/components/app/dependency_operation_detail_view/index.tsx +++ b/x-pack/plugins/apm/public/components/app/dependency_operation_detail_view/index.tsx @@ -9,7 +9,6 @@ import { i18n } from '@kbn/i18n'; import { omit, orderBy } from 'lodash'; import React, { useEffect, useMemo, useRef } from 'react'; import { useHistory } from 'react-router-dom'; -import type { DependencySpan } from '../../../../server/routes/dependencies/get_top_dependency_spans'; import { ChartPointerEventContextProvider } from '../../../context/chart_pointer_event/chart_pointer_event_context'; import { useApmParams } from '../../../hooks/use_apm_params'; import { useApmRouter } from '../../../hooks/use_apm_router'; @@ -17,13 +16,12 @@ import { useDependencyDetailOperationsBreadcrumb } from '../../../hooks/use_depe import { FETCH_STATUS, useFetcher } from '../../../hooks/use_fetcher'; import { useTimeRange } from '../../../hooks/use_time_range'; import { DependencyMetricCharts } from '../../shared/dependency_metric_charts'; -import { DetailViewHeader } from './detail_view_header'; import { ResettingHeightRetainer } from '../../shared/height_retainer/resetting_height_container'; import { push, replace } from '../../shared/links/url_helpers'; -import { SortFunction } from '../../shared/managed_table'; import { useWaterfallFetcher } from '../transaction_details/use_waterfall_fetcher'; import { WaterfallWithSummary } from '../transaction_details/waterfall_with_summary'; import { DependencyOperationDistributionChart } from './dependency_operation_distribution_chart'; +import { DetailViewHeader } from './detail_view_header'; import { maybeRedirectToAvailableSpanSample } from './maybe_redirect_to_available_span_sample'; export function DependencyOperationDetailView() { @@ -86,25 +84,15 @@ export function DependencyOperationDetailView() { ] ); - const getSortedSamples: SortFunction = ( - items, - localSortField, - localSortDirection - ) => { - return orderBy(items, localSortField, localSortDirection); - }; - const samples = useMemo(() => { return ( - getSortedSamples( - spanFetch.data?.spans ?? [], - sortField, - sortDirection - ).map((span) => ({ - spanId: span.spanId, - traceId: span.traceId, - transactionId: span.transactionId, - })) || [] + orderBy(spanFetch.data?.spans ?? [], sortField, sortDirection).map( + (span) => ({ + spanId: span.spanId, + traceId: span.traceId, + transactionId: span.transactionId, + }) + ) || [] ); }, [spanFetch.data?.spans, sortField, sortDirection]); diff --git a/x-pack/plugins/apm/public/components/app/error_group_details/index.tsx b/x-pack/plugins/apm/public/components/app/error_group_details/index.tsx index e0133ba6a6695..7f0f2bda106ba 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_details/index.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_details/index.tsx @@ -166,7 +166,7 @@ export function ErrorGroupDetails() { [environment, kuery, serviceName, start, end, groupId] ); - const { errorDistributionData, status: errorDistributionStatus } = + const { errorDistributionData, errorDistributionStatus } = useErrorGroupDistributionFetcher({ serviceName, groupId, diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/error_group_list.stories.tsx b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/error_group_list.stories.tsx index c61a37fa86e5e..d1183c91cb3e4 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/error_group_list.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/error_group_list.stories.tsx @@ -4,14 +4,13 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - +import { CoreStart } from '@kbn/core/public'; import { Meta, Story } from '@storybook/react'; import React, { ComponentProps } from 'react'; -import { MemoryRouter } from 'react-router-dom'; -import { MockApmPluginContextWrapper } from '../../../../context/apm_plugin/mock_apm_plugin_context'; -import { MockUrlParamsContextProvider } from '../../../../context/url_params_context/mock_url_params_context_provider'; - import { ErrorGroupList } from '.'; +import { ApmPluginContextValue } from '../../../../context/apm_plugin/apm_plugin_context'; +import { MockApmPluginStorybook } from '../../../../context/apm_plugin/mock_apm_plugin_storybook'; +import { FETCH_STATUS } from '../../../../hooks/use_fetcher'; type Args = ComponentProps; @@ -19,19 +18,86 @@ const stories: Meta = { title: 'app/ErrorGroupOverview/ErrorGroupList', component: ErrorGroupList, decorators: [ - (StoryComponent) => { + (StoryComponent, { args }) => { + const coreMock = { + http: { + get: async (endpoint: string) => { + switch (endpoint) { + case `/internal/apm/services/test service/errors/groups/main_statistics`: + return { + errorGroups: [ + { + name: 'net/http: abort Handler', + occurrences: 14, + culprit: 'Main.func2', + groupId: '83a653297ec29afed264d7b60d5cda7b', + lastSeen: 1634833121434, + handled: false, + type: 'errorString', + }, + { + name: 'POST /api/orders (500)', + occurrences: 5, + culprit: 'logrusMiddleware', + groupId: '7a640436a9be648fd708703d1ac84650', + lastSeen: 1634833121434, + handled: false, + type: 'OpError', + }, + { + name: 'write tcp 10.36.2.24:3000->10.36.1.14:34232: write: connection reset by peer', + occurrences: 4, + culprit: 'apiHandlers.getProductCustomers', + groupId: '95ca0e312c109aa11e298bcf07f1445b', + lastSeen: 1634833121434, + handled: false, + type: 'OpError', + }, + { + name: 'write tcp 10.36.0.21:3000->10.36.1.252:57070: write: connection reset by peer', + occurrences: 3, + culprit: 'apiHandlers.getCustomers', + groupId: '4053d7e33d2b716c819bd96d9d6121a2', + lastSeen: 1634833121434, + handled: false, + type: 'OpError', + }, + { + name: 'write tcp 10.36.0.21:3000->10.36.0.88:33926: write: broken pipe', + occurrences: 2, + culprit: 'apiHandlers.getOrders', + groupId: '94f4ca8ec8c02e5318cf03f46ae4c1f3', + lastSeen: 1634833121434, + handled: false, + type: 'OpError', + }, + ], + maxCountExceeded: false, + }; + default: + return { + errorGroups: [], + maxCountExceeded: false, + }; + } + }, + }, + } as unknown as CoreStart; + return ( - - - - - - - + + ); }, ], @@ -42,60 +108,14 @@ export const Example: Story = (args) => { return ; }; Example.args = { - mainStatistics: [ - { - name: 'net/http: abort Handler', - occurrences: 14, - culprit: 'Main.func2', - groupId: '83a653297ec29afed264d7b60d5cda7b', - lastSeen: 1634833121434, - handled: false, - type: 'errorString', - }, - { - name: 'POST /api/orders (500)', - occurrences: 5, - culprit: 'logrusMiddleware', - groupId: '7a640436a9be648fd708703d1ac84650', - lastSeen: 1634833121434, - handled: false, - type: 'OpError', - }, - { - name: 'write tcp 10.36.2.24:3000->10.36.1.14:34232: write: connection reset by peer', - occurrences: 4, - culprit: 'apiHandlers.getProductCustomers', - groupId: '95ca0e312c109aa11e298bcf07f1445b', - lastSeen: 1634833121434, - handled: false, - type: 'OpError', - }, - { - name: 'write tcp 10.36.0.21:3000->10.36.1.252:57070: write: connection reset by peer', - occurrences: 3, - culprit: 'apiHandlers.getCustomers', - groupId: '4053d7e33d2b716c819bd96d9d6121a2', - lastSeen: 1634833121434, - handled: false, - type: 'OpError', - }, - { - name: 'write tcp 10.36.0.21:3000->10.36.0.88:33926: write: broken pipe', - occurrences: 2, - culprit: 'apiHandlers.getOrders', - groupId: '94f4ca8ec8c02e5318cf03f46ae4c1f3', - lastSeen: 1634833121434, - handled: false, - type: 'OpError', - }, - ], serviceName: 'test service', + initialPageSize: 5, }; export const EmptyState: Story = (args) => { return ; }; EmptyState.args = { - mainStatistics: [], - serviceName: 'test service', + serviceName: 'foo', + initialPageSize: 5, }; diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/index.tsx b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/index.tsx index 819b75a44c7b1..3fbc22b845d33 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/index.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/index.tsx @@ -13,11 +13,11 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { euiStyled } from '@kbn/kibana-react-plugin/common'; -import React, { useMemo } from 'react'; +import React, { useMemo, useState } from 'react'; +import { isPending } from '../../../../hooks/use_fetcher'; import { NOT_AVAILABLE_LABEL } from '../../../../../common/i18n'; -import { asInteger } from '../../../../../common/utils/formatters'; -import { useApmParams } from '../../../../hooks/use_apm_params'; -import { APIReturnType } from '../../../../services/rest/create_call_apm_api'; +import { asBigNumber } from '../../../../../common/utils/formatters'; +import { useAnyOfApmParams } from '../../../../hooks/use_apm_params'; import { truncate, unit } from '../../../../utils/style'; import { ChartType, @@ -26,9 +26,17 @@ import { import { SparkPlot } from '../../../shared/charts/spark_plot'; import { ErrorDetailLink } from '../../../shared/links/apm/error_detail_link'; import { ErrorOverviewLink } from '../../../shared/links/apm/error_overview_link'; -import { ITableColumn, ManagedTable } from '../../../shared/managed_table'; +import { + ITableColumn, + ManagedTable, + TableOptions, +} from '../../../shared/managed_table'; import { TimestampTooltip } from '../../../shared/timestamp_tooltip'; import { isTimeComparison } from '../../../shared/time_comparison/get_comparison_options'; +import { + ErrorGroupItem, + useErrorGroupListData, +} from './use_error_group_list_data'; const GroupIdLink = euiStyled(ErrorDetailLink)` font-family: ${({ theme }) => theme.eui.euiCodeFontFamily}; @@ -44,7 +52,6 @@ const ErrorLink = euiStyled(ErrorOverviewLink)` const MessageLink = euiStyled(ErrorDetailLink)` font-family: ${({ theme }) => theme.eui.euiCodeFontFamily}; - font-size: ${({ theme }) => theme.eui.euiFontSizeM}; ${truncate('100%')}; `; @@ -52,79 +59,98 @@ const Culprit = euiStyled.div` font-family: ${({ theme }) => theme.eui.euiCodeFontFamily}; `; -type ErrorGroupItem = - APIReturnType<'GET /internal/apm/services/{serviceName}/errors/groups/main_statistics'>['errorGroups'][0]; -type ErrorGroupDetailedStatistics = - APIReturnType<'POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics'>; - interface Props { - mainStatistics: ErrorGroupItem[]; serviceName: string; - detailedStatisticsLoading: boolean; - detailedStatistics: ErrorGroupDetailedStatistics; - initialSortField: string; - initialSortDirection: 'asc' | 'desc'; + isCompactMode?: boolean; + initialPageSize: number; comparisonEnabled?: boolean; - isLoading: boolean; + saveTableOptionsToUrl?: boolean; + showPerPageOptions?: boolean; } -function ErrorGroupList({ - mainStatistics, +const defaultSorting = { + field: 'occurrences' as const, + direction: 'desc' as const, +}; + +export function ErrorGroupList({ serviceName, - detailedStatisticsLoading, - detailedStatistics, + isCompactMode = false, + initialPageSize, comparisonEnabled, - initialSortField, - initialSortDirection, - isLoading, + saveTableOptionsToUrl, + showPerPageOptions = true, }: Props) { - const { query } = useApmParams('/services/{serviceName}/errors'); + const { query } = useAnyOfApmParams( + '/services/{serviceName}/overview', + '/services/{serviceName}/errors' + ); const { offset } = query; + + const [renderedItems, setRenderedItems] = useState([]); + + const [sorting, setSorting] = + useState['sort']>(defaultSorting); + + const { + setDebouncedSearchQuery, + mainStatistics, + mainStatisticsStatus, + detailedStatistics, + detailedStatisticsStatus, + } = useErrorGroupListData({ renderedItems, sorting }); + + const isMainStatsLoading = isPending(mainStatisticsStatus); + const isDetailedStatsLoading = isPending(detailedStatisticsStatus); + const columns = useMemo(() => { - return [ - { - name: ( - <> - {i18n.translate('xpack.apm.errorsTable.groupIdColumnLabel', { - defaultMessage: 'Group ID', - })}{' '} - - - ), - field: 'groupId', - sortable: false, - width: `${unit * 6}px`, - render: (_, { groupId }) => { - return ( - - {groupId.slice(0, 5) || NOT_AVAILABLE_LABEL} - - ); - }, + const groupIdColumn: ITableColumn = { + name: ( + <> + {i18n.translate('xpack.apm.errorsTable.groupIdColumnLabel', { + defaultMessage: 'Group ID', + })}{' '} + + + ), + field: 'groupId', + sortable: false, + width: `${unit * 6}px`, + render: (_, { groupId }) => { + return ( + + {groupId.slice(0, 5) || NOT_AVAILABLE_LABEL} + + ); }, + }; + + return [ + ...(isCompactMode ? [] : [groupIdColumn]), { name: i18n.translate('xpack.apm.errorsTable.typeColumnLabel', { defaultMessage: 'Type', }), field: 'type', + width: `${unit * 10}px`, sortable: false, render: (_, { type }) => { return ( @@ -150,7 +176,7 @@ function ErrorGroupList({ ), field: 'message', sortable: false, - width: '50%', + width: '60%', render: (_, item) => { return ( @@ -165,37 +191,46 @@ function ErrorGroupList({ {item.name || NOT_AVAILABLE_LABEL} -
- - {item.culprit || NOT_AVAILABLE_LABEL} - + {isCompactMode ? null : ( + <> +
+ + {item.culprit || NOT_AVAILABLE_LABEL} + + + )}
); }, }, - { - name: '', - field: 'handled', - sortable: false, - align: RIGHT_ALIGNMENT, - render: (_, { handled }) => - handled === false && ( - - {i18n.translate('xpack.apm.errorsTable.unhandledLabel', { - defaultMessage: 'Unhandled', - })} - - ), - }, + ...(isCompactMode + ? [] + : [ + { + name: '', + field: 'handled', + sortable: false, + align: RIGHT_ALIGNMENT, + render: (_, { handled }) => + handled === false && ( + + {i18n.translate('xpack.apm.errorsTable.unhandledLabel', { + defaultMessage: 'Unhandled', + })} + + ), + } as ITableColumn, + ]), { field: 'lastSeen', sortable: true, name: i18n.translate('xpack.apm.errorsTable.lastSeenColumnLabel', { defaultMessage: 'Last seen', }), + width: `${unit * 6}px`, align: RIGHT_ALIGNMENT, render: (_, { lastSeen }) => lastSeen ? ( @@ -212,6 +247,7 @@ function ErrorGroupList({ sortable: true, dataType: 'number', align: RIGHT_ALIGNMENT, + width: `${unit * 12}px`, render: (_, { occurrences, groupId }) => { const currentPeriodTimeseries = detailedStatistics?.currentPeriod?.[groupId]?.timeseries; @@ -224,14 +260,14 @@ function ErrorGroupList({ >; }, [ + isCompactMode, serviceName, query, - detailedStatistics, + detailedStatistics?.currentPeriod, + detailedStatistics?.previousPeriod, + isDetailedStatsLoading, comparisonEnabled, - detailedStatisticsLoading, offset, ]); + const tableSearchBar = useMemo(() => { + return { + fieldsToSearch: ['name', 'groupId', 'culprit', 'type'] as Array< + keyof ErrorGroupItem + >, + maxCountExceeded: mainStatistics.maxCountExceeded, + onChangeSearchQuery: setDebouncedSearchQuery, + placeholder: i18n.translate( + 'xpack.apm.errorsTable.filterErrorsPlaceholder', + { defaultMessage: 'Search errors by message, type or culprit' } + ), + }; + }, [mainStatistics.maxCountExceeded, setDebouncedSearchQuery]); + return ( ); } - -export { ErrorGroupList }; diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/use_error_group_list_data.tsx b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/use_error_group_list_data.tsx new file mode 100644 index 0000000000000..3e3c4d3ea829e --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/use_error_group_list_data.tsx @@ -0,0 +1,149 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { v4 as uuidv4 } from 'uuid'; +import { useFetcher } from '../../../../hooks/use_fetcher'; +import { useApmServiceContext } from '../../../../context/apm_service/use_apm_service_context'; +import { useTimeRange } from '../../../../hooks/use_time_range'; +import { useStateDebounced } from '../../../../hooks/use_debounce'; +import { APIReturnType } from '../../../../services/rest/create_call_apm_api'; +import { TableOptions } from '../../../shared/managed_table'; +import { useAnyOfApmParams } from '../../../../hooks/use_apm_params'; +import { isTimeComparison } from '../../../shared/time_comparison/get_comparison_options'; + +type MainStatistics = + APIReturnType<'GET /internal/apm/services/{serviceName}/errors/groups/main_statistics'>; +type DetailedStatistics = + APIReturnType<'POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics'>; + +export type ErrorGroupItem = MainStatistics['errorGroups'][0]; + +const INITIAL_MAIN_STATISTICS: MainStatistics & { requestId: string } = { + requestId: '', + errorGroups: [], + maxCountExceeded: false, +}; + +const INITIAL_STATE_DETAILED_STATISTICS: DetailedStatistics = { + currentPeriod: {}, + previousPeriod: {}, +}; + +export function useErrorGroupListData({ + renderedItems, + sorting, +}: { + renderedItems: ErrorGroupItem[]; + sorting: TableOptions['sort']; +}) { + const { serviceName } = useApmServiceContext(); + const [searchQuery, setDebouncedSearchQuery] = useStateDebounced(''); + + const { + query: { + environment, + kuery, + rangeFrom, + rangeTo, + offset, + comparisonEnabled, + }, + } = useAnyOfApmParams( + '/services/{serviceName}/overview', + '/services/{serviceName}/errors' + ); + + const { start, end } = useTimeRange({ rangeFrom, rangeTo }); + + const { + data: mainStatistics = INITIAL_MAIN_STATISTICS, + status: mainStatisticsStatus, + } = useFetcher( + (callApmApi) => { + if (start && end) { + return callApmApi( + 'GET /internal/apm/services/{serviceName}/errors/groups/main_statistics', + { + params: { + path: { serviceName }, + query: { + environment, + kuery, + start, + end, + sortField: sorting.field, + sortDirection: sorting.direction, + searchQuery, + }, + }, + } + ).then((response) => { + return { + ...response, + requestId: uuidv4(), + }; + }); + } + }, + [ + sorting.direction, + sorting.field, + start, + end, + serviceName, + environment, + kuery, + searchQuery, + ] + ); + + const { + data: detailedStatistics = INITIAL_STATE_DETAILED_STATISTICS, + status: detailedStatisticsStatus, + } = useFetcher( + (callApmApi) => { + if (mainStatistics.requestId && renderedItems.length && start && end) { + return callApmApi( + 'POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics', + { + params: { + path: { serviceName }, + query: { + environment, + kuery, + start, + end, + numBuckets: 20, + offset: + comparisonEnabled && isTimeComparison(offset) + ? offset + : undefined, + }, + body: { + groupIds: JSON.stringify( + renderedItems.map(({ groupId }) => groupId).sort() + ), + }, + }, + } + ); + } + }, + // only fetches agg results when main statistics are ready + // eslint-disable-next-line react-hooks/exhaustive-deps + [mainStatistics.requestId, renderedItems, comparisonEnabled, offset], + { preservePreviousData: false } + ); + + return { + setDebouncedSearchQuery, + mainStatistics, + mainStatisticsStatus, + detailedStatistics, + detailedStatisticsStatus, + }; +} diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx b/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx index d6450ad4def57..f391e73012b40 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx @@ -13,166 +13,29 @@ import { EuiTitle, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { orderBy } from 'lodash'; import React from 'react'; -import { v4 as uuidv4 } from 'uuid'; import { useApmServiceContext } from '../../../context/apm_service/use_apm_service_context'; import { ChartPointerEventContextProvider } from '../../../context/chart_pointer_event/chart_pointer_event_context'; import { useApmParams } from '../../../hooks/use_apm_params'; import { useErrorGroupDistributionFetcher } from '../../../hooks/use_error_group_distribution_fetcher'; -import { - FETCH_STATUS, - isPending, - useFetcher, -} from '../../../hooks/use_fetcher'; -import { useTimeRange } from '../../../hooks/use_time_range'; -import { APIReturnType } from '../../../services/rest/create_call_apm_api'; import { FailedTransactionRateChart } from '../../shared/charts/failed_transaction_rate_chart'; -import { isTimeComparison } from '../../shared/time_comparison/get_comparison_options'; import { ErrorDistribution } from '../error_group_details/distribution'; import { ErrorGroupList } from './error_group_list'; -type ErrorGroupMainStatistics = - APIReturnType<'GET /internal/apm/services/{serviceName}/errors/groups/main_statistics'>; -type ErrorGroupDetailedStatistics = - APIReturnType<'POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics'>; - -const INITIAL_STATE_MAIN_STATISTICS: { - errorGroupMainStatistics: ErrorGroupMainStatistics['errorGroups']; - requestId?: string; - currentPageGroupIds: ErrorGroupMainStatistics['errorGroups']; -} = { - errorGroupMainStatistics: [], - requestId: undefined, - currentPageGroupIds: [], -}; - -const INITIAL_STATE_DETAILED_STATISTICS: ErrorGroupDetailedStatistics = { - currentPeriod: {}, - previousPeriod: {}, -}; - export function ErrorGroupOverview() { const { serviceName } = useApmServiceContext(); const { - query: { - environment, - kuery, - sortField = 'occurrences', - sortDirection = 'desc', - rangeFrom, - rangeTo, - offset, - comparisonEnabled, - page = 0, - pageSize = 25, - }, + query: { environment, kuery, comparisonEnabled }, } = useApmParams('/services/{serviceName}/errors'); - const { start, end } = useTimeRange({ rangeFrom, rangeTo }); - const { errorDistributionData, status } = useErrorGroupDistributionFetcher({ - serviceName, - groupId: undefined, - environment, - kuery, - }); - - const { - data: errorGroupListData = INITIAL_STATE_MAIN_STATISTICS, - status: errorGroupListDataStatus, - } = useFetcher( - (callApmApi) => { - const normalizedSortDirection = sortDirection === 'asc' ? 'asc' : 'desc'; - - if (start && end) { - return callApmApi( - 'GET /internal/apm/services/{serviceName}/errors/groups/main_statistics', - { - params: { - path: { - serviceName, - }, - query: { - environment, - kuery, - start, - end, - sortField, - sortDirection: normalizedSortDirection, - }, - }, - } - ).then((response) => { - const currentPageGroupIds = orderBy( - response.errorGroups, - sortField, - sortDirection - ) - .slice(page * pageSize, (page + 1) * pageSize) - .map(({ groupId }) => groupId) - .sort(); - - return { - // Everytime the main statistics is refetched, updates the requestId making the comparison API to be refetched. - requestId: uuidv4(), - errorGroupMainStatistics: response.errorGroups, - currentPageGroupIds, - }; - }); - } - }, - [ + const { errorDistributionData, errorDistributionStatus } = + useErrorGroupDistributionFetcher({ + serviceName, + groupId: undefined, environment, kuery, - serviceName, - start, - end, - sortField, - sortDirection, - page, - pageSize, - ] - ); - - const { requestId, errorGroupMainStatistics, currentPageGroupIds } = - errorGroupListData; - - const { - data: errorGroupDetailedStatistics = INITIAL_STATE_DETAILED_STATISTICS, - status: errorGroupDetailedStatisticsStatus, - } = useFetcher( - (callApmApi) => { - if (requestId && currentPageGroupIds.length && start && end) { - return callApmApi( - 'POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics', - { - params: { - path: { serviceName }, - query: { - environment, - kuery, - start, - end, - numBuckets: 20, - offset: - comparisonEnabled && isTimeComparison(offset) - ? offset - : undefined, - }, - body: { - groupIds: JSON.stringify(currentPageGroupIds), - }, - }, - } - ); - } - }, - // only fetches agg results when requestId changes - // eslint-disable-next-line react-hooks/exhaustive-deps - [requestId], - { preservePreviousData: false } - ); + }); return ( @@ -182,7 +45,7 @@ export function ErrorGroupOverview() { diff --git a/x-pack/plugins/apm/public/components/app/mobile/errors_and_crashes_group_details/error_group_details/index.tsx b/x-pack/plugins/apm/public/components/app/mobile/errors_and_crashes_group_details/error_group_details/index.tsx index ea03b6cc58ac8..b59f0064349bd 100644 --- a/x-pack/plugins/apm/public/components/app/mobile/errors_and_crashes_group_details/error_group_details/index.tsx +++ b/x-pack/plugins/apm/public/components/app/mobile/errors_and_crashes_group_details/error_group_details/index.tsx @@ -180,13 +180,15 @@ export function ErrorGroupDetails() { [environment, kueryWithMobileFilters, serviceName, start, end, groupId] ); - const { errorDistributionData, status: errorDistributionStatus } = - useErrorGroupDistributionFetcher({ - serviceName, - groupId, - environment, - kuery: kueryWithMobileFilters, - }); + const { + errorDistributionData, + errorDistributionStatus: errorDistributionStatus, + } = useErrorGroupDistributionFetcher({ + serviceName, + groupId, + environment, + kuery: kueryWithMobileFilters, + }); useEffect(() => { const selectedSample = errorSamplesData?.errorSampleIds.find( diff --git a/x-pack/plugins/apm/public/components/app/mobile/errors_and_crashes_overview/errors_overview.tsx b/x-pack/plugins/apm/public/components/app/mobile/errors_and_crashes_overview/errors_overview.tsx index 67214733bece4..1675932b26063 100644 --- a/x-pack/plugins/apm/public/components/app/mobile/errors_and_crashes_overview/errors_overview.tsx +++ b/x-pack/plugins/apm/public/components/app/mobile/errors_and_crashes_overview/errors_overview.tsx @@ -85,12 +85,13 @@ export function MobileErrorsOverview() { kuery, }); const { start, end } = useTimeRange({ rangeFrom, rangeTo }); - const { errorDistributionData, status } = useErrorGroupDistributionFetcher({ - serviceName, - groupId: undefined, - environment, - kuery: kueryWithMobileFilters, - }); + const { errorDistributionData, errorDistributionStatus: status } = + useErrorGroupDistributionFetcher({ + serviceName, + groupId: undefined, + environment, + kuery: kueryWithMobileFilters, + }); const { data: errorGroupListData = INITIAL_STATE_MAIN_STATISTICS, status: errorGroupListDataStatus, diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx index 1073a459cecbc..55bde1c8fcf2b 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx @@ -5,22 +5,20 @@ * 2.0. */ -import { - EuiCallOut, - EuiEmptyPrompt, - EuiFlexGroup, - EuiFlexItem, - EuiText, -} from '@elastic/eui'; +import { EuiEmptyPrompt, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; -import React from 'react'; +import React, { useCallback, useMemo, useState } from 'react'; import { v4 as uuidv4 } from 'uuid'; +import { APIReturnType } from '../../../services/rest/create_call_apm_api'; +import { useStateDebounced } from '../../../hooks/use_debounce'; import { ApmDocumentType } from '../../../../common/document_type'; -import { ServiceInventoryFieldName } from '../../../../common/service_inventory'; +import { + ServiceInventoryFieldName, + ServiceListItem, +} from '../../../../common/service_inventory'; import { useAnomalyDetectionJobsContext } from '../../../context/anomaly_detection_jobs/use_anomaly_detection_jobs_context'; import { useApmParams } from '../../../hooks/use_apm_params'; -import { FETCH_STATUS, isPending } from '../../../hooks/use_fetcher'; +import { FETCH_STATUS } from '../../../hooks/use_fetcher'; import { useLocalStorage } from '../../../hooks/use_local_storage'; import { usePreferredDataSourceAndBucketSize } from '../../../hooks/use_preferred_data_source_and_bucket_size'; import { useProgressiveFetcher } from '../../../hooks/use_progressive_fetcher'; @@ -30,17 +28,19 @@ import { SearchBar } from '../../shared/search_bar/search_bar'; import { isTimeComparison } from '../../shared/time_comparison/get_comparison_options'; import { ServiceList } from './service_list'; import { orderServiceItems } from './service_list/order_service_items'; +import { SortFunction } from '../../shared/managed_table'; + +type MainStatisticsApiResponse = APIReturnType<'GET /internal/apm/services'>; -const initialData = { +const INITIAL_PAGE_SIZE = 25; +const INITIAL_DATA: MainStatisticsApiResponse & { requestId: string } = { requestId: '', items: [], - hasHistoricalData: true, - hasLegacyData: false, + serviceOverflowCount: 0, + maxCountExceeded: false, }; -const INITIAL_PAGE_SIZE = 25; - -function useServicesMainStatisticsFetcher() { +function useServicesMainStatisticsFetcher(searchQuery: string | undefined) { const { query: { rangeFrom, @@ -67,7 +67,7 @@ function useServicesMainStatisticsFetcher() { const shouldUseDurationSummary = !!preferred?.source?.hasDurationSummaryField; - const mainStatisticsFetch = useProgressiveFetcher( + const { data = INITIAL_DATA, status } = useProgressiveFetcher( (callApmApi) => { if (preferred) { return callApmApi('GET /internal/apm/services', { @@ -81,6 +81,7 @@ function useServicesMainStatisticsFetcher() { useDurationSummary: shouldUseDurationSummary, documentType: preferred.source.documentType, rollupInterval: preferred.source.rollupInterval, + searchQuery, }, }, }).then((mainStatisticsData) => { @@ -99,7 +100,8 @@ function useServicesMainStatisticsFetcher() { end, serviceGroup, preferred, - // not used, but needed to update the requestId to call the details statistics API when table is options are updated + searchQuery, + // not used, but needed to update the requestId to call the details statistics API when table options are updated page, pageSize, sortField, @@ -107,23 +109,15 @@ function useServicesMainStatisticsFetcher() { ] ); - return { - mainStatisticsFetch, - }; + return { mainStatisticsData: data, mainStatisticsStatus: status }; } function useServicesDetailedStatisticsFetcher({ mainStatisticsFetch, - initialSortField, - initialSortDirection, - tiebreakerField, + renderedItems, }: { - mainStatisticsFetch: ReturnType< - typeof useServicesMainStatisticsFetcher - >['mainStatisticsFetch']; - initialSortField: ServiceInventoryFieldName; - initialSortDirection: 'asc' | 'desc'; - tiebreakerField: ServiceInventoryFieldName; + mainStatisticsFetch: ReturnType; + renderedItems: ServiceListItem[]; }) { const { query: { @@ -133,10 +127,6 @@ function useServicesDetailedStatisticsFetcher({ kuery, offset, comparisonEnabled, - page = 0, - pageSize = INITIAL_PAGE_SIZE, - sortDirection = initialSortDirection, - sortField = initialSortField, }, } = useApmParams('/services'); @@ -150,22 +140,17 @@ function useServicesDetailedStatisticsFetcher({ numBuckets: 20, }); - const { data: mainStatisticsData = initialData } = mainStatisticsFetch; - - const currentPageItems = orderServiceItems({ - items: mainStatisticsData.items, - primarySortField: sortField as ServiceInventoryFieldName, - sortDirection, - tiebreakerField, - }).slice(page * pageSize, (page + 1) * pageSize); + const { mainStatisticsData, mainStatisticsStatus } = mainStatisticsFetch; const comparisonFetch = useProgressiveFetcher( (callApmApi) => { + const serviceNames = renderedItems.map(({ serviceName }) => serviceName); + if ( start && end && - currentPageItems.length && - mainStatisticsFetch.status === FETCH_STATUS.SUCCESS && + serviceNames.length > 0 && + mainStatisticsStatus === FETCH_STATUS.SUCCESS && dataSourceOptions ) { return callApmApi('POST /internal/apm/services/detailed_statistics', { @@ -184,12 +169,8 @@ function useServicesDetailedStatisticsFetcher({ bucketSizeInSeconds: dataSourceOptions.bucketSizeInSeconds, }, body: { - serviceNames: JSON.stringify( - currentPageItems - .map(({ serviceName }) => serviceName) - // Service name is sorted to guarantee the same order every time this API is called so the result can be cached. - .sort() - ), + // Service name is sorted to guarantee the same order every time this API is called so the result can be cached. + serviceNames: JSON.stringify(serviceNames.sort()), }, }, }); @@ -197,7 +178,7 @@ function useServicesDetailedStatisticsFetcher({ }, // only fetches detailed statistics when requestId is invalidated by main statistics api call or offset is changed // eslint-disable-next-line react-hooks/exhaustive-deps - [mainStatisticsData.requestId, offset, comparisonEnabled], + [mainStatisticsData.requestId, renderedItems, offset, comparisonEnabled], { preservePreviousData: false } ); @@ -205,21 +186,21 @@ function useServicesDetailedStatisticsFetcher({ } export function ServiceInventory() { - const { mainStatisticsFetch } = useServicesMainStatisticsFetcher(); + const [debouncedSearchQuery, setDebouncedSearchQuery] = useStateDebounced(''); - const mainStatisticsItems = mainStatisticsFetch.data?.items ?? []; + const [renderedItems, setRenderedItems] = useState([]); - const displayHealthStatus = mainStatisticsItems.some( + const mainStatisticsFetch = + useServicesMainStatisticsFetcher(debouncedSearchQuery); + const { mainStatisticsData, mainStatisticsStatus } = mainStatisticsFetch; + + const displayHealthStatus = mainStatisticsData.items.some( (item) => 'healthStatus' in item ); - const hasKibanaUiLimitRestrictedData = - mainStatisticsFetch.data?.maxServiceCountExceeded; - - const serviceOverflowCount = - mainStatisticsFetch.data?.serviceOverflowCount ?? 0; + const serviceOverflowCount = mainStatisticsData?.serviceOverflowCount ?? 0; - const displayAlerts = mainStatisticsItems.some( + const displayAlerts = mainStatisticsData.items.some( (item) => ServiceInventoryFieldName.AlertsCount in item ); @@ -233,9 +214,7 @@ export function ServiceInventory() { const { comparisonFetch } = useServicesDetailedStatisticsFetcher({ mainStatisticsFetch, - initialSortField, - initialSortDirection, - tiebreakerField, + renderedItems, }); const { anomalyDetectionSetupState } = useAnomalyDetectionJobsContext(); @@ -249,23 +228,20 @@ export function ServiceInventory() { !userHasDismissedCallout && shouldDisplayMlCallout(anomalyDetectionSetupState); - const isLoading = isPending(mainStatisticsFetch.status); - - const isFailure = mainStatisticsFetch.status === FETCH_STATUS.FAILURE; - const noItemsMessage = ( - - {i18n.translate('xpack.apm.servicesTable.notFoundLabel', { - defaultMessage: 'No services found', - })} -
- } - titleSize="s" - /> - ); - - const items = mainStatisticsItems; + const noItemsMessage = useMemo(() => { + return ( + + {i18n.translate('xpack.apm.servicesTable.notFoundLabel', { + defaultMessage: 'No services found', + })} +
+ } + titleSize="s" + /> + ); + }, []); const mlCallout = ( @@ -277,27 +253,16 @@ export function ServiceInventory() { ); - const kibanaUiServiceLimitCallout = ( - - - - - - - + const sortFn: SortFunction = useCallback( + (itemsToSort, sortField, sortDirection) => { + return orderServiceItems({ + items: itemsToSort, + primarySortField: sortField, + sortDirection, + tiebreakerField, + }); + }, + [tiebreakerField] ); return ( @@ -305,12 +270,10 @@ export function ServiceInventory() { {displayMlCallout && mlCallout} - {hasKibanaUiLimitRestrictedData && kibanaUiServiceLimitCallout} { - return orderServiceItems({ - items: itemsToSort, - primarySortField: sortField, - sortDirection, - tiebreakerField, - }); - }} + sortFn={sortFn} comparisonData={comparisonFetch?.data} noItemsMessage={noItemsMessage} initialPageSize={INITIAL_PAGE_SIZE} serviceOverflowCount={serviceOverflowCount} + onChangeSearchQuery={setDebouncedSearchQuery} + maxCountExceeded={mainStatisticsData?.maxCountExceeded ?? false} + onChangeRenderedItems={setRenderedItems} /> diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/service_list/index.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/index.tsx index 4d3186c784447..08e7a840b5dfb 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/service_list/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/index.tsx @@ -17,7 +17,13 @@ import { import { i18n } from '@kbn/i18n'; import { ALERT_STATUS_ACTIVE } from '@kbn/rule-data-utils'; import { TypeOf } from '@kbn/typed-react-router-config'; -import React, { useCallback, useMemo } from 'react'; +import { omit } from 'lodash'; +import React, { useMemo } from 'react'; +import { + FETCH_STATUS, + isFailure, + isPending, +} from '../../../../hooks/use_fetcher'; import { ServiceHealthStatus } from '../../../../../common/service_health_status'; import { ServiceInventoryFieldName, @@ -44,7 +50,12 @@ import { import { EnvironmentBadge } from '../../../shared/environment_badge'; import { ServiceLink } from '../../../shared/links/apm/service_link'; import { ListMetric } from '../../../shared/list_metric'; -import { ITableColumn, ManagedTable } from '../../../shared/managed_table'; +import { + ITableColumn, + ManagedTable, + SortFunction, + TableSearchBar, +} from '../../../shared/managed_table'; import { HealthBadge } from './health_badge'; type ServicesDetailedStatisticsAPIResponse = @@ -273,32 +284,28 @@ export function getServiceColumns({ } interface Props { + status: FETCH_STATUS; items: ServiceListItem[]; comparisonDataLoading: boolean; comparisonData?: ServicesDetailedStatisticsAPIResponse; noItemsMessage?: React.ReactNode; - isLoading: boolean; - isFailure?: boolean; displayHealthStatus: boolean; displayAlerts: boolean; initialSortField: ServiceInventoryFieldName; initialPageSize: number; initialSortDirection: 'asc' | 'desc'; - sortFn: ( - sortItems: ServiceListItem[], - sortField: ServiceInventoryFieldName, - sortDirection: 'asc' | 'desc' - ) => ServiceListItem[]; - + sortFn: SortFunction; serviceOverflowCount: number; + maxCountExceeded: boolean; + onChangeSearchQuery: (searchQuery: string) => void; + onChangeRenderedItems: (renderedItems: ServiceListItem[]) => void; } export function ServiceList({ + status, items, noItemsMessage, comparisonDataLoading, comparisonData, - isLoading, - isFailure, displayHealthStatus, displayAlerts, initialSortField, @@ -306,67 +313,59 @@ export function ServiceList({ initialPageSize, sortFn, serviceOverflowCount, + maxCountExceeded, + onChangeSearchQuery, + onChangeRenderedItems, }: Props) { const breakpoints = useBreakpoints(); const { link } = useApmRouter(); - const showTransactionTypeColumn = items.some( ({ transactionType }) => transactionType && !isDefaultTransactionType(transactionType) ); - const { - // removes pagination and sort instructions from the query so it won't be passed down to next route - query: { - page, - pageSize, - sortDirection: direction, - sortField: field, - ...query - }, - } = useApmParams('/services'); - + const { query } = useApmParams('/services'); const { kuery } = query; - const { fallbackToTransactions } = useFallbackToTransactionsFetcher({ kuery, }); - const serviceColumns = useMemo( - () => - getServiceColumns({ - query, - showTransactionTypeColumn, - comparisonDataLoading, - comparisonData, - breakpoints, - showHealthStatusColumn: displayHealthStatus, - showAlertsColumn: displayAlerts, - link, - serviceOverflowCount, - }), - [ - query, + const serviceColumns = useMemo(() => { + return getServiceColumns({ + // removes pagination and sort instructions from the query so it won't be passed down to next route + query: omit(query, 'page', 'pageSize', 'sortDirection', 'sortField'), showTransactionTypeColumn, comparisonDataLoading, comparisonData, breakpoints, - displayHealthStatus, - displayAlerts, + showHealthStatusColumn: displayHealthStatus, + showAlertsColumn: displayAlerts, link, serviceOverflowCount, - ] - ); + }); + }, [ + query, + showTransactionTypeColumn, + comparisonDataLoading, + comparisonData, + breakpoints, + displayHealthStatus, + displayAlerts, + link, + serviceOverflowCount, + ]); - const handleSort = useCallback( - (itemsToSort, sortField, sortDirection) => - sortFn( - itemsToSort, - sortField as ServiceInventoryFieldName, - sortDirection + const tableSearchBar: TableSearchBar = useMemo(() => { + return { + fieldsToSearch: ['serviceName'], + maxCountExceeded, + onChangeSearchQuery, + placeholder: i18n.translate( + 'xpack.apm.servicesTable.filterServicesPlaceholder', + { defaultMessage: 'Search services by name' } ), - [sortFn] - ); + }; + }, [maxCountExceeded, onChangeSearchQuery]); return ( @@ -381,6 +380,24 @@ export function ServiceList({ )} + + {maxCountExceeded && ( + + + + + + )} + + - isLoading={isLoading} - error={isFailure} + isLoading={isPending(status)} + error={isFailure(status)} columns={serviceColumns} items={items} noItemsMessage={noItemsMessage} initialSortField={initialSortField} initialSortDirection={initialSortDirection} initialPageSize={initialPageSize} - sortFn={handleSort} + sortFn={sortFn} + onChangeRenderedItems={onChangeRenderedItems} + tableSearchBar={tableSearchBar} /> diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/service_list/order_service_items.ts b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/order_service_items.ts index 89dade9d8d0cd..17c018e272ee8 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/service_list/order_service_items.ts +++ b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/order_service_items.ts @@ -49,7 +49,7 @@ export function orderServiceItems({ sortDirection, }: { items: ServiceListItem[]; - primarySortField: ServiceInventoryFieldName; + primarySortField: string; tiebreakerField: ServiceInventoryFieldName; sortDirection: 'asc' | 'desc'; }): ServiceListItem[] { diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/service_list/service_list.stories.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/service_list.stories.tsx index 515aadaf11b52..7f81dfcc0b3b1 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/service_list/service_list.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/service_list.stories.tsx @@ -8,6 +8,7 @@ import { CoreStart } from '@kbn/core/public'; import { Meta, Story } from '@storybook/react'; import React, { ComponentProps } from 'react'; +import { FETCH_STATUS } from '../../../../hooks/use_fetcher'; import { ServiceList } from '.'; import { ServiceHealthStatus } from '../../../../../common/service_health_status'; import { ServiceInventoryFieldName } from '../../../../../common/service_inventory'; @@ -48,11 +49,11 @@ const stories: Meta = { }; export default stories; -export const Example: Story = (args) => { +export const ServiceListWithItems: Story = (args) => { return ; }; -Example.args = { - isLoading: false, +ServiceListWithItems.args = { + status: FETCH_STATUS.SUCCESS, items, displayHealthStatus: true, initialSortField: ServiceInventoryFieldName.HealthStatus, @@ -61,11 +62,11 @@ Example.args = { sortFn: (sortItems) => sortItems, }; -export const EmptyState: Story = (args) => { +export const ServiceListEmptyState: Story = (args) => { return ; }; -EmptyState.args = { - isLoading: false, +ServiceListEmptyState.args = { + status: FETCH_STATUS.SUCCESS, items: [], displayHealthStatus: true, initialSortField: ServiceInventoryFieldName.HealthStatus, @@ -78,7 +79,7 @@ export const WithHealthWarnings: Story = (args) => { return ; }; WithHealthWarnings.args = { - isLoading: false, + status: FETCH_STATUS.SUCCESS, initialPageSize: 25, items: items.map((item) => ({ ...item, @@ -87,12 +88,12 @@ WithHealthWarnings.args = { sortFn: (sortItems) => sortItems, }; -export const WithOverflowBucket: Story = (args) => { +export const ServiceListWithOverflowBucket: Story = (args) => { return ; }; -WithOverflowBucket.args = { - isLoading: false, +ServiceListWithOverflowBucket.args = { + status: FETCH_STATUS.SUCCESS, items: overflowItems, displayHealthStatus: false, initialSortField: ServiceInventoryFieldName.HealthStatus, diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/service_list/service_list.test.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/service_list.test.tsx index 74856cbca3b11..04659b6b211bc 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/service_list/service_list.test.tsx +++ b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/service_list.test.tsx @@ -15,7 +15,7 @@ import { apmRouter } from '../../../routing/apm_route_config'; import * as timeSeriesColor from '../../../shared/charts/helper/get_timeseries_color'; import * as stories from './service_list.stories'; -const { Example, EmptyState } = composeStories(stories); +const { ServiceListEmptyState, ServiceListWithItems } = composeStories(stories); const query = { rangeFrom: 'now-15m', @@ -56,13 +56,13 @@ describe('ServiceList', () => { }); it('renders empty state', async () => { - render(); + render(); expect(await screen.findByRole('table')).toBeInTheDocument(); }); it('renders with data', async () => { - render(); + render(); expect(await screen.findByRole('table')).toBeInTheDocument(); }); diff --git a/x-pack/plugins/apm/public/components/app/service_overview/index.tsx b/x-pack/plugins/apm/public/components/app/service_overview/index.tsx index 55972ede6e560..4b2ab0ad6c3a8 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/index.tsx @@ -139,6 +139,7 @@ export function ServiceOverview() { start={start} end={end} showPerPageOptions={false} + numberOfTransactionsPerPage={5} /> diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx index 81e5509ca6239..499729b31ae3b 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx @@ -5,180 +5,20 @@ * 2.0. */ -import { - EuiBasicTable, - EuiFlexGroup, - EuiFlexItem, - EuiTitle, -} from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { orderBy } from 'lodash'; -import React, { useState } from 'react'; -import { v4 as uuidv4 } from 'uuid'; -import { isTimeComparison } from '../../../shared/time_comparison/get_comparison_options'; -import { FETCH_STATUS, useFetcher } from '../../../../hooks/use_fetcher'; -import { APIReturnType } from '../../../../services/rest/create_call_apm_api'; -import { ErrorOverviewLink } from '../../../shared/links/apm/error_overview_link'; -import { OverviewTableContainer } from '../../../shared/overview_table_container'; -import { getColumns } from '../../../shared/errors_table/get_columns'; +import React from 'react'; import { useApmParams } from '../../../../hooks/use_apm_params'; -import { useTimeRange } from '../../../../hooks/use_time_range'; +import { ErrorOverviewLink } from '../../../shared/links/apm/error_overview_link'; +import { ErrorGroupList } from '../../error_group_overview/error_group_list'; interface Props { serviceName: string; } -type ErrorGroupMainStatistics = - APIReturnType<'GET /internal/apm/services/{serviceName}/errors/groups/main_statistics'>; -type ErrorGroupDetailedStatistics = - APIReturnType<'POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics'>; - -type SortDirection = 'asc' | 'desc'; -type SortField = 'name' | 'lastSeen' | 'occurrences'; - -const PAGE_SIZE = 5; -const DEFAULT_SORT = { - direction: 'desc' as const, - field: 'occurrences' as const, -}; - -const INITIAL_STATE_MAIN_STATISTICS: { - items: ErrorGroupMainStatistics['errorGroups']; - totalItems: number; - requestId?: string; -} = { - items: [], - totalItems: 0, - requestId: undefined, -}; - -const INITIAL_STATE_DETAILED_STATISTICS: ErrorGroupDetailedStatistics = { - currentPeriod: {}, - previousPeriod: {}, -}; export function ServiceOverviewErrorsTable({ serviceName }: Props) { - const [tableOptions, setTableOptions] = useState<{ - pageIndex: number; - sort: { - direction: SortDirection; - field: SortField; - }; - }>({ - pageIndex: 0, - sort: DEFAULT_SORT, - }); - const { query } = useApmParams('/services/{serviceName}/overview'); - const { environment, kuery, rangeFrom, rangeTo, offset, comparisonEnabled } = - query; - - const { start, end } = useTimeRange({ rangeFrom, rangeTo }); - - const { pageIndex, sort } = tableOptions; - const { direction, field } = sort; - - const { data = INITIAL_STATE_MAIN_STATISTICS, status } = useFetcher( - (callApmApi) => { - if (!start || !end) { - return; - } - return callApmApi( - 'GET /internal/apm/services/{serviceName}/errors/groups/main_statistics', - { - params: { - path: { serviceName }, - query: { - environment, - kuery, - start, - end, - }, - }, - } - ).then((response) => { - const currentPageErrorGroups = orderBy( - response.errorGroups, - field, - direction - ).slice(pageIndex * PAGE_SIZE, (pageIndex + 1) * PAGE_SIZE); - - return { - // Everytime the main statistics is refetched, updates the requestId making the comparison API to be refetched. - requestId: uuidv4(), - items: currentPageErrorGroups, - totalItems: response.errorGroups.length, - }; - }); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [ - environment, - kuery, - start, - end, - serviceName, - pageIndex, - direction, - field, - // not used, but needed to trigger an update when offset is changed either manually by user or when time range is changed - offset, - // not used, but needed to trigger an update when comparison feature is disabled/enabled by user - comparisonEnabled, - ] - ); - - const { requestId, items, totalItems } = data; - - const { - data: errorGroupDetailedStatistics = INITIAL_STATE_DETAILED_STATISTICS, - status: errorGroupDetailedStatisticsStatus, - } = useFetcher( - (callApmApi) => { - if (requestId && items.length && start && end) { - return callApmApi( - 'POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics', - { - params: { - path: { serviceName }, - query: { - environment, - kuery, - start, - end, - numBuckets: 20, - offset: - comparisonEnabled && isTimeComparison(offset) - ? offset - : undefined, - }, - body: { - groupIds: JSON.stringify( - items.map(({ groupId: groupId }) => groupId).sort() - ), - }, - }, - } - ); - } - }, - // only fetches agg results when requestId changes - // eslint-disable-next-line react-hooks/exhaustive-deps - [requestId], - { preservePreviousData: false } - ); - - const errorGroupDetailedStatisticsLoading = - errorGroupDetailedStatisticsStatus === FETCH_STATUS.LOADING; - - const columns = getColumns({ - serviceName, - errorGroupDetailedStatisticsLoading, - errorGroupDetailedStatistics, - comparisonEnabled, - query, - }); - return ( - - { - setTableOptions({ - pageIndex: newTableOptions.page?.index ?? 0, - sort: newTableOptions.sort - ? { - field: newTableOptions.sort.field as SortField, - direction: newTableOptions.sort.direction, - } - : DEFAULT_SORT, - }); - }} - sorting={{ - enableAllColumns: true, - sort, - }} - /> - + ); diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx index ab6d66ab2130d..f9c084f89018f 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx @@ -6,7 +6,6 @@ */ import { EuiFlexItem, EuiPanel } from '@elastic/eui'; -import { orderBy } from 'lodash'; import React, { useState } from 'react'; import { v4 as uuidv4 } from 'uuid'; import { isTimeComparison } from '../../shared/time_comparison/get_comparison_options'; @@ -25,6 +24,7 @@ import { TableOptions, } from './service_overview_instances_table'; import { LatencyAggregationType } from '../../../../common/latency_aggregation_types'; +import { InstancesSortField } from '../../../../common/instances'; interface ServiceOverviewInstancesChartAndTableProps { chartHeight: number; @@ -48,14 +48,6 @@ const INITIAL_STATE_DETAILED_STATISTICS: ApiResponseDetailedStats = { previousPeriod: {}, }; -export type SortField = - | 'serviceNodeName' - | 'latency' - | 'throughput' - | 'errorRate' - | 'cpuUsage' - | 'memoryUsage'; - export type SortDirection = 'asc' | 'desc'; export const PAGE_SIZE = 5; const DEFAULT_SORT = { @@ -122,6 +114,8 @@ export function ServiceOverviewInstancesChartAndTable({ comparisonEnabled && isTimeComparison(offset) ? offset : undefined, + sortField: tableOptions.sort.field, + sortDirection: tableOptions.sort.direction, }, }, } @@ -152,6 +146,7 @@ export function ServiceOverviewInstancesChartAndTable({ offset, // not used, but needed to trigger an update when comparison feature is disabled/enabled by user comparisonEnabled, + tableOptions.sort, ] ); @@ -162,19 +157,10 @@ export function ServiceOverviewInstancesChartAndTable({ currentPeriodItemsCount, } = mainStatsData; - const currentPeriodOrderedItems = orderBy( - // need top-level sortable fields for the managed table - currentPeriodItems.map((item) => ({ - ...item, - latency: item.latency ?? 0, - throughput: item.throughput ?? 0, - errorRate: item.errorRate ?? 0, - cpuUsage: item.cpuUsage ?? 0, - memoryUsage: item.memoryUsage ?? 0, - })), - field, - direction - ).slice(pageIndex * PAGE_SIZE, (pageIndex + 1) * PAGE_SIZE); + const currentPageItems = currentPeriodItems.slice( + pageIndex * PAGE_SIZE, + (pageIndex + 1) * PAGE_SIZE + ); const { data: detailedStatsData = INITIAL_STATE_DETAILED_STATISTICS, @@ -208,7 +194,7 @@ export function ServiceOverviewInstancesChartAndTable({ numBuckets: 20, transactionType, serviceNodeIds: JSON.stringify( - currentPeriodOrderedItems.map((item) => item.serviceNodeName) + currentPageItems.map((item) => item.serviceNodeName) ), offset: comparisonEnabled && isTimeComparison(offset) @@ -238,7 +224,7 @@ export function ServiceOverviewInstancesChartAndTable({ { const currentPeriodTimestamp = detailedStatsData?.currentPeriod?.[serviceNodeName]?.cpuUsage; @@ -241,7 +240,6 @@ export function getColumns({ /> ); }, - sortable: true, }, { field: 'memoryUsage', @@ -250,6 +248,7 @@ export function getColumns({ { defaultMessage: 'Memory usage (avg.)' } ), align: RIGHT_ALIGNMENT, + sortable: true, render: (_, { serviceNodeName, memoryUsage }) => { const currentPeriodTimestamp = detailedStatsData?.currentPeriod?.[serviceNodeName]?.memoryUsage; @@ -277,7 +276,6 @@ export function getColumns({ /> ); }, - sortable: true, }, { width: '40px', @@ -292,7 +290,10 @@ export function getColumns({ anchorPosition="leftCenter" button={ diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/index.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/index.tsx index 5fad00dfa34ff..5e1a466864960 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/index.tsx @@ -13,13 +13,11 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { ReactNode, useEffect, useState } from 'react'; -import { useApmServiceContext } from '../../../../context/apm_service/use_apm_service_context'; import { FETCH_STATUS } from '../../../../hooks/use_fetcher'; import { APIReturnType } from '../../../../services/rest/create_call_apm_api'; import { PAGE_SIZE, SortDirection, - SortField, } from '../service_overview_instances_chart_and_table'; import { OverviewTableContainer } from '../../../shared/overview_table_container'; import { getColumns } from './get_columns'; @@ -27,6 +25,7 @@ import { InstanceDetails } from './intance_details'; import { useApmParams } from '../../../../hooks/use_apm_params'; import { useBreakpoints } from '../../../../hooks/use_breakpoints'; import { LatencyAggregationType } from '../../../../../common/latency_aggregation_types'; +import { InstancesSortField } from '../../../../../common/instances'; type ServiceInstanceMainStatistics = APIReturnType<'GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics'>; @@ -39,7 +38,7 @@ export interface TableOptions { pageIndex: number; sort: { direction: SortDirection; - field: SortField; + field: InstancesSortField; }; } @@ -70,8 +69,6 @@ export function ServiceOverviewInstancesTable({ isLoading, isNotInitiated, }: Props) { - const { agentName } = useApmServiceContext(); - const { query: { kuery, latencyAggregationType, comparisonEnabled, offset }, } = useApmParams('/services/{serviceName}'); @@ -122,7 +119,6 @@ export function ServiceOverviewInstancesTable({ const shouldShowSparkPlots = !isXl; const columns = getColumns({ - agentName, serviceName, kuery, latencyAggregationType: latencyAggregationType as LatencyAggregationType, @@ -154,7 +150,9 @@ export function ServiceOverviewInstancesTable({

{i18n.translate('xpack.apm.serviceOverview.instancesTableTitle', { - defaultMessage: 'Instances', + defaultMessage: + 'Top {count} {count, plural, one {instance} other {instances}}', + values: { count: mainStatsItemCount }, })}

diff --git a/x-pack/plugins/apm/public/components/app/settings/custom_link/index.test.tsx b/x-pack/plugins/apm/public/components/app/settings/custom_link/index.test.tsx index 40f8f5ad1db25..37bf4c83c1960 100644 --- a/x-pack/plugins/apm/public/components/app/settings/custom_link/index.test.tsx +++ b/x-pack/plugins/apm/public/components/app/settings/custom_link/index.test.tsx @@ -112,7 +112,7 @@ describe('CustomLink', () => { expect(createButton.disabled).toBeFalsy(); }); - it('enables edit button on custom link table when user has writte privileges', () => { + it('enables edit button on custom link table when user has write privileges', () => { const mockContext = getMockAPMContext({ canSave: true }); const { getAllByText } = render( diff --git a/x-pack/plugins/apm/public/components/app/transaction_overview/index.tsx b/x-pack/plugins/apm/public/components/app/transaction_overview/index.tsx index 372138c1273a9..73f5e40aa2e2a 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_overview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_overview/index.tsx @@ -91,7 +91,7 @@ export function TransactionOverview() { - } - onChange={[Function]} - pagination={ - Object { - "pageIndex": 0, - "pageSize": 25, - "pageSizeOptions": Array [ - 10, - 25, - 50, - ], - "showPerPageOptions": true, - "totalItemCount": 3, - } - } - responsive={true} - sorting={ - Object { - "sort": Object { - "direction": "asc", - "field": "name", - }, - } - } - tableLayout="fixed" -/> -`; - -exports[`ManagedTable should render when specifying initial values 1`] = ` - - } - onChange={[Function]} - pagination={ - Object { - "pageIndex": 1, - "pageSize": 2, - "pageSizeOptions": Array [ - 10, - 25, - 50, - ], - "showPerPageOptions": false, - "totalItemCount": 3, - } - } - responsive={true} - sorting={ - Object { - "sort": Object { - "direction": "desc", - "field": "age", - }, - } - } - tableLayout="fixed" -/> -`; diff --git a/x-pack/plugins/apm/public/components/shared/managed_table/index.tsx b/x-pack/plugins/apm/public/components/shared/managed_table/index.tsx index 88d9e88c5e7ba..7d6307d32ffb8 100644 --- a/x-pack/plugins/apm/public/components/shared/managed_table/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/managed_table/index.tsx @@ -7,11 +7,30 @@ import { i18n } from '@kbn/i18n'; import { EuiBasicTable, EuiBasicTableColumn } from '@elastic/eui'; -import { orderBy } from 'lodash'; -import React, { ReactNode, useCallback, useMemo } from 'react'; +import { isEmpty, merge, orderBy } from 'lodash'; +import React, { + ReactNode, + useCallback, + useEffect, + useMemo, + useState, +} from 'react'; import { useHistory } from 'react-router-dom'; +import { apmEnableTableSearchBar } from '@kbn/observability-plugin/common'; import { useLegacyUrlParams } from '../../../context/url_params_context/use_url_params'; import { fromQuery, toQuery } from '../links/url_helpers'; +import { + getItemsFilteredBySearchQuery, + TableSearchBar, +} from '../table_search_bar/table_search_bar'; +import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; + +type SortDirection = 'asc' | 'desc'; + +export interface TableOptions { + page: { index: number; size: number }; + sort: { direction: SortDirection; field: keyof T }; +} // TODO: this should really be imported from EUI export interface ITableColumn { @@ -26,143 +45,274 @@ export interface ITableColumn { render?: (value: any, item: T) => unknown; } -interface Props { - items: T[]; - columns: Array>; - initialPageSize: number; - initialPageIndex?: number; - initialSortField?: ITableColumn['field']; - initialSortDirection?: 'asc' | 'desc'; - showPerPageOptions?: boolean; - noItemsMessage?: React.ReactNode; - sortItems?: boolean; - sortFn?: SortFunction; - pagination?: boolean; - isLoading?: boolean; - error?: boolean; - tableLayout?: 'auto' | 'fixed'; +export interface TableSearchBar { + isEnabled?: boolean; + fieldsToSearch: Array; + maxCountExceeded: boolean; + placeholder: string; + onChangeSearchQuery: (searchQuery: string) => void; } const PAGE_SIZE_OPTIONS = [10, 25, 50]; -function defaultSortFn( +function defaultSortFn( items: T[], - sortField: string, - sortDirection: 'asc' | 'desc' + sortField: keyof T, + sortDirection: SortDirection ) { - return orderBy(items, sortField, sortDirection); + return orderBy(items, sortField, sortDirection) as T[]; } export type SortFunction = ( items: T[], - sortField: string, - sortDirection: 'asc' | 'desc' + sortField: keyof T, + sortDirection: SortDirection ) => T[]; -function UnoptimizedManagedTable(props: Props) { +export const shouldfetchServer = ({ + maxCountExceeded, + newSearchQuery, + oldSearchQuery, +}: { + maxCountExceeded: boolean; + newSearchQuery: string; + oldSearchQuery: string; +}) => maxCountExceeded || !newSearchQuery.includes(oldSearchQuery); + +function UnoptimizedManagedTable(props: { + items: T[]; + columns: Array>; + noItemsMessage?: React.ReactNode; + isLoading?: boolean; + error?: boolean; + + // pagination + pagination?: boolean; + initialPageSize: number; + initialPageIndex?: number; + initialSortField?: string; + initialSortDirection?: SortDirection; + showPerPageOptions?: boolean; + + // onChange handlers + onChangeRenderedItems?: (renderedItems: T[]) => void; + onChangeSorting?: (sorting: TableOptions['sort']) => void; + + // sorting + sortItems?: boolean; + sortFn?: SortFunction; + + tableLayout?: 'auto' | 'fixed'; + tableSearchBar?: TableSearchBar; + saveTableOptionsToUrl?: boolean; +}) { + const [searchQuery, setSearchQuery] = useState(''); const history = useHistory(); + const { core } = useApmPluginContext(); + const isTableSearchBarEnabled = core.uiSettings.get( + apmEnableTableSearchBar, + false + ); + const { items, columns, + noItemsMessage, + isLoading = false, + error = false, + + // pagination + pagination = true, initialPageIndex = 0, - initialPageSize, + initialPageSize = 10, initialSortField = props.columns[0]?.field || '', initialSortDirection = 'asc', showPerPageOptions = true, - noItemsMessage, + + // onChange handlers + onChangeRenderedItems = () => {}, + onChangeSorting = () => {}, + + // sorting sortItems = true, sortFn = defaultSortFn, - pagination = true, - isLoading = false, - error = false, + + saveTableOptionsToUrl = true, tableLayout, + tableSearchBar = { + isEnabled: false, + fieldsToSearch: [], + maxCountExceeded: false, + placeholder: 'Search...', + onChangeSearchQuery: () => {}, + }, } = props; const { urlParams: { - page = initialPageIndex, - pageSize = initialPageSize, - sortField = initialSortField, - sortDirection = initialSortDirection, + page: urlPageIndex = initialPageIndex, + pageSize: urlPageSize = initialPageSize, + sortField: urlSortField = initialSortField, + sortDirection: urlSortDirection = initialSortDirection, }, } = useLegacyUrlParams(); - const renderedItems = useMemo(() => { - const sortedItems = sortItems - ? sortFn(items, sortField, sortDirection as 'asc' | 'desc') - : items; - - return sortedItems.slice(page * pageSize, (page + 1) * pageSize); - }, [page, pageSize, sortField, sortDirection, items, sortItems, sortFn]); - - const sort = useMemo(() => { - return { + const getStateFromUrl = useCallback( + (): TableOptions => ({ + page: { index: urlPageIndex, size: urlPageSize }, sort: { - field: sortField as keyof T, - direction: sortDirection as 'asc' | 'desc', + field: urlSortField as keyof T, + direction: urlSortDirection as SortDirection, }, - }; - }, [sortField, sortDirection]); + }), + [urlPageIndex, urlPageSize, urlSortField, urlSortDirection] + ); + + // initialise table options state from url params + const [tableOptions, setTableOptions] = useState(getStateFromUrl()); + // update table options state when url params change + useEffect(() => setTableOptions(getStateFromUrl()), [getStateFromUrl]); + + // update table options state when `onTableChange` is invoked and persist to url const onTableChange = useCallback( - (options: { - page: { index: number; size: number }; - sort?: { field: keyof T; direction: 'asc' | 'desc' }; - }) => { - history.push({ - ...history.location, - search: fromQuery({ - ...toQuery(history.location.search), - page: options.page.index, - pageSize: options.page.size, - sortField: options.sort?.field, - sortDirection: options.sort?.direction, - }), - }); + (newTableOptions: Partial>) => { + setTableOptions((oldTableOptions) => + merge({}, oldTableOptions, newTableOptions) + ); + + if (saveTableOptionsToUrl) { + history.push({ + ...history.location, + search: fromQuery({ + ...toQuery(history.location.search), + page: newTableOptions.page?.index, + pageSize: newTableOptions.page?.size, + sortField: newTableOptions.sort?.field, + sortDirection: newTableOptions.sort?.direction, + }), + }); + } }, - [history] + [history, saveTableOptionsToUrl, setTableOptions] + ); + + const filteredItems = useMemo(() => { + return isEmpty(searchQuery) + ? items + : getItemsFilteredBySearchQuery({ + items, + fieldsToSearch: tableSearchBar.fieldsToSearch, + searchQuery, + }); + }, [items, searchQuery, tableSearchBar.fieldsToSearch]); + + const renderedItems = useMemo(() => { + const sortedItems = sortItems + ? sortFn( + filteredItems, + tableOptions.sort.field as keyof T, + tableOptions.sort.direction + ) + : filteredItems; + + return sortedItems.slice( + tableOptions.page.index * tableOptions.page.size, + (tableOptions.page.index + 1) * tableOptions.page.size + ); + }, [ + sortItems, + sortFn, + filteredItems, + tableOptions.sort.field, + tableOptions.sort.direction, + tableOptions.page.index, + tableOptions.page.size, + ]); + + useEffect(() => { + onChangeRenderedItems(renderedItems); + }, [onChangeRenderedItems, renderedItems]); + + const sorting = useMemo( + () => ({ sort: tableOptions.sort as TableOptions['sort'] }), + [tableOptions.sort] ); + useEffect(() => onChangeSorting(sorting.sort), [onChangeSorting, sorting]); + const paginationProps = useMemo(() => { if (!pagination) { return; } return { showPerPageOptions, - totalItemCount: items.length, - pageIndex: page, - pageSize, + totalItemCount: filteredItems.length, + pageIndex: tableOptions.page.index, + pageSize: tableOptions.page.size, pageSizeOptions: PAGE_SIZE_OPTIONS, }; - }, [showPerPageOptions, items, page, pageSize, pagination]); + }, [ + pagination, + showPerPageOptions, + filteredItems.length, + tableOptions.page.index, + tableOptions.page.size, + ]); - const showNoItemsMessage = useMemo(() => { - return isLoading - ? i18n.translate('xpack.apm.managedTable.loadingDescription', { - defaultMessage: 'Loading…', + const onChangeSearchQuery = useCallback( + (value: string) => { + setSearchQuery(value); + if ( + shouldfetchServer({ + maxCountExceeded: tableSearchBar.maxCountExceeded, + newSearchQuery: value, + oldSearchQuery: searchQuery, }) - : noItemsMessage; - }, [isLoading, noItemsMessage]); + ) { + tableSearchBar.onChangeSearchQuery(value); + } + }, + [searchQuery, tableSearchBar] + ); + + const isSearchBarEnabled = + isTableSearchBarEnabled && (tableSearchBar.isEnabled ?? true); return ( - // @ts-expect-error TS thinks pagination should be non-nullable, but it's not - >} // EuiBasicTableColumn is stricter than ITableColumn - sorting={sort} - onChange={onTableChange} - {...(paginationProps ? { pagination: paginationProps } : {})} - /> + <> + {isSearchBarEnabled ? ( + + ) : null} + + + loading={isLoading} + tableLayout={tableLayout} + error={ + error + ? i18n.translate('xpack.apm.managedTable.errorMessage', { + defaultMessage: 'Failed to fetch', + }) + : '' + } + noItemsMessage={ + isLoading + ? i18n.translate('xpack.apm.managedTable.loadingDescription', { + defaultMessage: 'Loading…', + }) + : noItemsMessage + } + items={renderedItems} + columns={columns as unknown as Array>} // EuiBasicTableColumn is stricter than ITableColumn + sorting={sorting} + onChange={onTableChange} + {...(paginationProps ? { pagination: paginationProps } : {})} + /> + ); } diff --git a/x-pack/plugins/apm/public/components/shared/managed_table/managed_table.test.tsx b/x-pack/plugins/apm/public/components/shared/managed_table/managed_table.test.tsx index a43d78887ec9f..5bc6199aba22d 100644 --- a/x-pack/plugins/apm/public/components/shared/managed_table/managed_table.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/managed_table/managed_table.test.tsx @@ -5,56 +5,62 @@ * 2.0. */ -import { shallow } from 'enzyme'; -import React from 'react'; -import { ITableColumn, UnoptimizedManagedTable } from '.'; - -interface Person { - name: string; - age: number; -} +import { shouldfetchServer } from '.'; describe('ManagedTable', () => { - const people: Person[] = [ - { name: 'Jess', age: 29 }, - { name: 'Becky', age: 43 }, - { name: 'Thomas', age: 31 }, - ]; - const columns: Array> = [ - { - field: 'name', - name: 'Name', - sortable: true, - render: (name) => `Name: ${name}`, - }, - { field: 'age', name: 'Age', render: (age) => `Age: ${age}` }, - ]; + describe('shouldfetchServer', () => { + it('returns true if maxCountExceeded is true', () => { + const result = shouldfetchServer({ + maxCountExceeded: true, + newSearchQuery: 'apple', + oldSearchQuery: 'banana', + }); + expect(result).toBeTruthy(); + }); - it('should render a page-full of items, with defaults', () => { - expect( - shallow( - - columns={columns} - items={people} - initialPageSize={25} - /> - ) - ).toMatchSnapshot(); - }); + it('returns true if newSearchQuery does not include oldSearchQuery', () => { + const result = shouldfetchServer({ + maxCountExceeded: false, + newSearchQuery: 'grape', + oldSearchQuery: 'banana', + }); + expect(result).toBeTruthy(); + }); + + it('returns false if maxCountExceeded is false and newSearchQuery includes oldSearchQuery', () => { + const result = shouldfetchServer({ + maxCountExceeded: false, + newSearchQuery: 'banana', + oldSearchQuery: 'ban', + }); + expect(result).toBeFalsy(); + }); + + it('returns true if maxCountExceeded is true even if newSearchQuery includes oldSearchQuery', () => { + const result = shouldfetchServer({ + maxCountExceeded: true, + newSearchQuery: 'banana', + oldSearchQuery: 'ban', + }); + expect(result).toBeTruthy(); + }); + + it('returns true if maxCountExceeded is true and newSearchQuery is empty', () => { + const result = shouldfetchServer({ + maxCountExceeded: true, + newSearchQuery: '', + oldSearchQuery: 'banana', + }); + expect(result).toBeTruthy(); + }); - it('should render when specifying initial values', () => { - expect( - shallow( - - columns={columns} - items={people} - initialSortField="age" - initialSortDirection="desc" - initialPageIndex={1} - initialPageSize={2} - showPerPageOptions={false} - /> - ) - ).toMatchSnapshot(); + it('returns false if maxCountExceeded is false and both search queries are empty', () => { + const result = shouldfetchServer({ + maxCountExceeded: false, + newSearchQuery: '', + oldSearchQuery: '', + }); + expect(result).toBeFalsy(); + }); }); }); diff --git a/x-pack/plugins/apm/public/components/shared/service_icons/index.test.tsx b/x-pack/plugins/apm/public/components/shared/service_icons/index.test.tsx index cec958da0eb70..de17d0ccf6d4b 100644 --- a/x-pack/plugins/apm/public/components/shared/service_icons/index.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/service_icons/index.test.tsx @@ -52,6 +52,14 @@ function Wrapper({ children }: { children?: ReactNode }) { } describe('ServiceIcons', () => { + beforeAll(() => { + // Mocks console.warn so it won't polute tests output when testing the api throwing error + jest.spyOn(console, 'warn').mockImplementation(() => null); + }); + + afterAll(() => { + jest.restoreAllMocks(); + }); describe('icons', () => { it('Shows loading spinner while fetching data', () => { jest.spyOn(fetcherHook, 'useFetcher').mockReturnValue({ diff --git a/x-pack/plugins/apm/public/components/shared/table_search_bar/table_search_bar.test.ts b/x-pack/plugins/apm/public/components/shared/table_search_bar/table_search_bar.test.ts new file mode 100644 index 0000000000000..ebbd5031c6380 --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/table_search_bar/table_search_bar.test.ts @@ -0,0 +1,67 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { getItemsFilteredBySearchQuery } from './table_search_bar'; + +describe('getItemsFilteredBySearchQuery', () => { + const sampleItems = [ + { name: 'Apple', category: 'Fruit' }, + { name: 'Banana', category: 'Fruit' }, + { name: 'Carrot', category: 'Vegetable' }, + ]; + + it('should filter items based on full match', () => { + const result = getItemsFilteredBySearchQuery({ + items: sampleItems, + fieldsToSearch: ['name'], + searchQuery: 'Banana', + }); + expect(result).toEqual([{ name: 'Banana', category: 'Fruit' }]); + }); + + it('should filter items based on partial match', () => { + const result = getItemsFilteredBySearchQuery({ + items: sampleItems, + fieldsToSearch: ['name'], + searchQuery: 'car', + }); + expect(result).toEqual([{ name: 'Carrot', category: 'Vegetable' }]); + }); + + it('should be case-insensitive', () => { + const result = getItemsFilteredBySearchQuery({ + items: sampleItems, + fieldsToSearch: ['category'], + searchQuery: 'fruit', + }); + expect(result).toEqual([ + { name: 'Apple', category: 'Fruit' }, + { name: 'Banana', category: 'Fruit' }, + ]); + }); + + it('should handle undefined field values', () => { + const itemsWithUndefined = [ + { name: 'Apple', category: 'Fruit' }, + { name: 'Banana', category: undefined }, + ]; + const result = getItemsFilteredBySearchQuery({ + items: itemsWithUndefined, + fieldsToSearch: ['category'], + searchQuery: 'fruit', + }); + expect(result).toEqual([{ name: 'Apple', category: 'Fruit' }]); + }); + + it('should return an empty array if no match is found', () => { + const result = getItemsFilteredBySearchQuery({ + items: sampleItems, + fieldsToSearch: ['name'], + searchQuery: 'Grapes', + }); + expect(result).toEqual([]); + }); +}); diff --git a/x-pack/plugins/apm/public/components/shared/table_search_bar/table_search_bar.tsx b/x-pack/plugins/apm/public/components/shared/table_search_bar/table_search_bar.tsx new file mode 100644 index 0000000000000..7ff7322c98354 --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/table_search_bar/table_search_bar.tsx @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { EuiFieldSearch } from '@elastic/eui'; +import React from 'react'; + +interface Props { + placeholder: string; + searchQuery: string; + onChangeSearchQuery: (value: string) => void; +} + +export function TableSearchBar({ + placeholder, + searchQuery, + onChangeSearchQuery, +}: Props) { + return ( + { + onChangeSearchQuery(e.target.value); + }} + /> + ); +} + +export function getItemsFilteredBySearchQuery({ + items, + fieldsToSearch, + searchQuery, +}: { + items: T[]; + fieldsToSearch: P[]; + searchQuery: string; +}) { + return items.filter((item) => { + return fieldsToSearch.some((field) => { + const fieldValue = item[field] as unknown as string | undefined; + return fieldValue?.toLowerCase().includes(searchQuery.toLowerCase()); + }); + }); +} diff --git a/x-pack/plugins/apm/public/components/shared/transactions_table/get_columns.tsx b/x-pack/plugins/apm/public/components/shared/transactions_table/get_columns.tsx index 32329b81a1edb..083fd1e42f5f4 100644 --- a/x-pack/plugins/apm/public/components/shared/transactions_table/get_columns.tsx +++ b/x-pack/plugins/apm/public/components/shared/transactions_table/get_columns.tsx @@ -7,7 +7,6 @@ import { EuiBadge, - EuiBasicTableColumn, EuiFlexGroup, EuiFlexItem, EuiIcon, @@ -42,6 +41,7 @@ import { TRANSACTION_TYPE, } from '../../../../common/es_fields/apm'; import { fieldValuePairToKql } from '../../../../common/utils/field_value_pair_to_kql'; +import { ITableColumn } from '../managed_table'; type TransactionGroupMainStatistics = APIReturnType<'GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics'>; @@ -55,8 +55,8 @@ type TransactionGroupDetailedStatistics = export function getColumns({ serviceName, latencyAggregationType, - transactionGroupDetailedStatisticsLoading, - transactionGroupDetailedStatistics, + detailedStatisticsLoading, + detailedStatistics, comparisonEnabled, shouldShowSparkPlots = true, showAlertsColumn, @@ -67,8 +67,8 @@ export function getColumns({ }: { serviceName: string; latencyAggregationType?: LatencyAggregationType; - transactionGroupDetailedStatisticsLoading: boolean; - transactionGroupDetailedStatistics?: TransactionGroupDetailedStatistics; + detailedStatisticsLoading: boolean; + detailedStatistics?: TransactionGroupDetailedStatistics; comparisonEnabled?: boolean; shouldShowSparkPlots?: boolean; showAlertsColumn: boolean; @@ -76,7 +76,7 @@ export function getColumns({ transactionOverflowCount: number; link: any; query: TypeOf['query']; -}): Array> { +}): Array> { return [ ...(showAlertsColumn ? [ @@ -128,7 +128,7 @@ export function getColumns({ ); }, - } as EuiBasicTableColumn, + } as ITableColumn, ] : []), { @@ -162,20 +162,18 @@ export function getColumns({ align: RIGHT_ALIGNMENT, render: (_, { latency, name }) => { const currentTimeseries = - transactionGroupDetailedStatistics?.currentPeriod?.[name]?.latency; + detailedStatistics?.currentPeriod?.[name]?.latency; const previousTimeseries = - transactionGroupDetailedStatistics?.previousPeriod?.[name]?.latency; - + detailedStatistics?.previousPeriod?.[name]?.latency; const { currentPeriodColor, previousPeriodColor } = getTimeSeriesColor( ChartType.LATENCY_AVG ); - return ( { const currentTimeseries = - transactionGroupDetailedStatistics?.currentPeriod?.[name]?.throughput; + detailedStatistics?.currentPeriod?.[name]?.throughput; const previousTimeseries = - transactionGroupDetailedStatistics?.previousPeriod?.[name] - ?.throughput; - + detailedStatistics?.previousPeriod?.[name]?.throughput; const { currentPeriodColor, previousPeriodColor } = getTimeSeriesColor( ChartType.THROUGHPUT ); - return ( { const currentTimeseries = - transactionGroupDetailedStatistics?.currentPeriod?.[name]?.errorRate; + detailedStatistics?.currentPeriod?.[name]?.errorRate; const previousTimeseries = - transactionGroupDetailedStatistics?.previousPeriod?.[name]?.errorRate; - + detailedStatistics?.previousPeriod?.[name]?.errorRate; const { currentPeriodColor, previousPeriodColor } = getTimeSeriesColor( ChartType.FAILED_TRANSACTION_RATE ); - return ( { const currentImpact = - transactionGroupDetailedStatistics?.currentPeriod?.[name]?.impact ?? - 0; + detailedStatistics?.currentPeriod?.[name]?.impact ?? 0; const previousImpact = - transactionGroupDetailedStatistics?.previousPeriod?.[name]?.impact; + detailedStatistics?.previousPeriod?.[name]?.impact; return ( diff --git a/x-pack/plugins/apm/public/components/shared/transactions_table/index.tsx b/x-pack/plugins/apm/public/components/shared/transactions_table/index.tsx index bd0e4f242cf39..e4553dfee073a 100644 --- a/x-pack/plugins/apm/public/components/shared/transactions_table/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/transactions_table/index.tsx @@ -5,19 +5,12 @@ * 2.0. */ -import { - EuiBasicTable, - EuiCallOut, - EuiFlexGroup, - EuiFlexItem, - EuiTitle, -} from '@elastic/eui'; +import { EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { v4 as uuidv4 } from 'uuid'; import { FormattedMessage } from '@kbn/i18n-react'; -import { orderBy } from 'lodash'; +import { compact } from 'lodash'; import React, { useMemo, useState } from 'react'; -import { useHistory } from 'react-router-dom'; -import { v4 as uuidv4 } from 'uuid'; import { ApmDocumentType } from '../../../../common/document_type'; import { getLatencyAggregationType, @@ -27,6 +20,7 @@ import { useApmServiceContext } from '../../../context/apm_service/use_apm_servi import { useAnyOfApmParams } from '../../../hooks/use_apm_params'; import { useApmRouter } from '../../../hooks/use_apm_router'; import { useBreakpoints } from '../../../hooks/use_breakpoints'; +import { useStateDebounced } from '../../../hooks/use_debounce'; import { FETCH_STATUS, isPending, @@ -35,7 +29,7 @@ import { import { usePreferredDataSourceAndBucketSize } from '../../../hooks/use_preferred_data_source_and_bucket_size'; import { APIReturnType } from '../../../services/rest/create_call_apm_api'; import { TransactionOverviewLink } from '../links/apm/transaction_overview_link'; -import { fromQuery, toQuery } from '../links/url_helpers'; +import { ManagedTable, TableSearchBar } from '../managed_table'; import { OverviewTableContainer } from '../overview_table_container'; import { isTimeComparison } from '../time_comparison/get_comparison_options'; import { getColumns } from './get_columns'; @@ -43,29 +37,12 @@ import { getColumns } from './get_columns'; type ApiResponse = APIReturnType<'GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics'>; -interface InitialState { - requestId: string; - mainStatisticsData: ApiResponse & { - transactionGroupsTotalItems: number; - }; -} - -const INITIAL_STATE: InitialState = { +const INITIAL_STATE: ApiResponse & { requestId: string } = { requestId: '', - mainStatisticsData: { - transactionGroups: [], - maxTransactionGroupsExceeded: false, - transactionOverflowCount: 0, - transactionGroupsTotalItems: 0, - hasActiveAlerts: false, - }, -}; - -type SortField = 'name' | 'latency' | 'throughput' | 'errorRate' | 'impact'; -type SortDirection = 'asc' | 'desc'; -const DEFAULT_SORT = { - direction: 'desc' as const, - field: 'impact' as const, + transactionGroups: [], + maxCountExceeded: false, + transactionOverflowCount: 0, + hasActiveAlerts: false, }; interface Props { @@ -88,7 +65,7 @@ export function TransactionsTable({ hideViewTransactionsLink = false, hideTitle = false, isSingleColumn = true, - numberOfTransactionsPerPage = 5, + numberOfTransactionsPerPage = 10, showPerPageOptions = true, showMaxTransactionGroupsExceededWarning = false, environment, @@ -97,7 +74,6 @@ export function TransactionsTable({ end, saveTableOptionsToUrl = false, }: Props) { - const history = useHistory(); const { link } = useApmRouter(); const { @@ -106,10 +82,6 @@ export function TransactionsTable({ comparisonEnabled, offset, latencyAggregationType: latencyAggregationTypeFromQuery, - page: urlPage = 0, - pageSize: urlPageSize = numberOfTransactionsPerPage, - sortField: urlSortField = 'impact', - sortDirection: urlSortDirection = 'desc', }, } = useAnyOfApmParams( '/services/{serviceName}/transactions', @@ -122,192 +94,75 @@ export function TransactionsTable({ latencyAggregationTypeFromQuery ); - const [tableOptions, setTableOptions] = useState<{ - page: { index: number; size: number }; - sort: { direction: SortDirection; field: SortField }; - }>({ - page: { index: urlPage, size: urlPageSize }, - sort: { - field: urlSortField as SortField, - direction: urlSortDirection as SortDirection, - }, - }); - // SparkPlots should be hidden if we're in two-column view and size XL (1200px) const { isXl } = useBreakpoints(); const shouldShowSparkPlots = isSingleColumn || !isXl; - - const { page, sort } = tableOptions; - const { direction, field } = sort; - const { index, size } = page; - const { transactionType, serviceName } = useApmServiceContext(); + const [searchQuery, setSearchQueryDebounced] = useStateDebounced(''); - const preferred = usePreferredDataSourceAndBucketSize({ - start, + const [renderedItems, setRenderedItems] = useState< + ApiResponse['transactionGroups'] + >([]); + + const { + mainStatistics, + mainStatisticsStatus, + detailedStatistics, + detailedStatisticsStatus, + } = useTableData({ + comparisonEnabled, + currentPageItems: renderedItems, end, + environment, kuery, - numBuckets: 20, - type: ApmDocumentType.TransactionMetric, + latencyAggregationType, + offset, + searchQuery, + serviceName, + start, + transactionType, }); - const shouldUseDurationSummary = - latencyAggregationType === 'avg' && - preferred?.source?.hasDurationSummaryField; - - const { data = INITIAL_STATE, status } = useFetcher( - (callApmApi) => { - if (!latencyAggregationType || !transactionType || !preferred) { - return Promise.resolve(undefined); - } - return callApmApi( - 'GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics', - { - params: { - path: { serviceName }, - query: { - environment, - kuery, - start, - end, - transactionType, - useDurationSummary: !!shouldUseDurationSummary, - latencyAggregationType: - latencyAggregationType as LatencyAggregationType, - documentType: preferred.source.documentType, - rollupInterval: preferred.source.rollupInterval, - }, - }, - } - ).then((response) => { - const currentPageTransactionGroups = orderBy( - response.transactionGroups, - [field], - [direction] - ).slice(index * size, (index + 1) * size); - - return { - // Everytime the main statistics is refetched, updates the requestId making the detailed API to be refetched. - requestId: uuidv4(), - mainStatisticsData: { - ...response, - transactionGroups: currentPageTransactionGroups, - transactionGroupsTotalItems: response.transactionGroups.length, - }, - }; - }); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [ - environment, - kuery, + const columns = useMemo(() => { + return getColumns({ serviceName, - start, - end, - transactionType, - latencyAggregationType, - index, - size, - direction, - field, - // not used, but needed to trigger an update when offset is changed either manually by user or when time range is changed - offset, - // not used, but needed to trigger an update when comparison feature is disabled/enabled by user + latencyAggregationType: latencyAggregationType as LatencyAggregationType, + detailedStatisticsLoading: isPending(detailedStatisticsStatus), + detailedStatistics, comparisonEnabled, - preferred, - ] - ); - - const { - requestId, - mainStatisticsData: { - transactionGroups, - maxTransactionGroupsExceeded, - transactionOverflowCount, - transactionGroupsTotalItems, - hasActiveAlerts, - }, - } = data; - - const { - data: transactionGroupDetailedStatistics, - status: transactionGroupDetailedStatisticsStatus, - } = useFetcher( - (callApmApi) => { - if ( - transactionGroupsTotalItems && - start && - end && - transactionType && - latencyAggregationType && - preferred - ) { - return callApmApi( - 'GET /internal/apm/services/{serviceName}/transactions/groups/detailed_statistics', - { - params: { - path: { serviceName }, - query: { - environment, - kuery, - start, - end, - bucketSizeInSeconds: preferred.bucketSizeInSeconds, - transactionType, - documentType: preferred.source.documentType, - rollupInterval: preferred.source.rollupInterval, - useDurationSummary: !!shouldUseDurationSummary, - latencyAggregationType: - latencyAggregationType as LatencyAggregationType, - transactionNames: JSON.stringify( - transactionGroups.map(({ name }) => name).sort() - ), - offset: - comparisonEnabled && isTimeComparison(offset) - ? offset - : undefined, - }, - }, - } - ); - } - }, - // only fetches detailed statistics when requestId is invalidated by main statistics api call - // eslint-disable-next-line react-hooks/exhaustive-deps - [requestId], - { preservePreviousData: false } - ); - - const columns = getColumns({ - serviceName, - latencyAggregationType: latencyAggregationType as LatencyAggregationType, - transactionGroupDetailedStatisticsLoading: isPending( - transactionGroupDetailedStatisticsStatus - ), - transactionGroupDetailedStatistics, + shouldShowSparkPlots, + offset, + transactionOverflowCount: mainStatistics.transactionOverflowCount, + showAlertsColumn: mainStatistics.hasActiveAlerts, + link, + query, + }); + }, [ comparisonEnabled, - shouldShowSparkPlots, - offset, - transactionOverflowCount, - showAlertsColumn: hasActiveAlerts, + detailedStatistics, + detailedStatisticsStatus, + latencyAggregationType, link, + mainStatistics.hasActiveAlerts, + mainStatistics.transactionOverflowCount, + offset, query, - }); - - const pagination = useMemo( - () => ({ - pageIndex: index, - pageSize: size, - totalItemCount: transactionGroupsTotalItems, - showPerPageOptions, - }), - [index, size, transactionGroupsTotalItems, showPerPageOptions] - ); + serviceName, + shouldShowSparkPlots, + ]); - const sorting = useMemo( - () => ({ sort: { field, direction } }), - [field, direction] - ); + const tableSearchBar: TableSearchBar = + useMemo(() => { + return { + fieldsToSearch: ['name'], + maxCountExceeded: mainStatistics.maxCountExceeded, + onChangeSearchQuery: setSearchQueryDebounced, + placeholder: i18n.translate( + 'xpack.apm.transactionsTable.tableSearch.placeholder', + { defaultMessage: 'Search transactions by name' } + ), + }; + }, [mainStatistics.maxCountExceeded, setSearchQueryDebounced]); return ( )} - {showMaxTransactionGroupsExceededWarning && maxTransactionGroupsExceeded && ( - - -

- -

-
-
- )} + {showMaxTransactionGroupsExceededWarning && + mainStatistics.maxCountExceeded && ( + + +

+ +

+
+
+ )} - - + - { - setTableOptions({ - page: { - index: newTableOptions.page?.index ?? 0, - size: - newTableOptions.page?.size ?? numberOfTransactionsPerPage, - }, - sort: newTableOptions.sort - ? { - field: newTableOptions.sort.field as SortField, - direction: newTableOptions.sort.direction, - } - : DEFAULT_SORT, - }); - if (saveTableOptionsToUrl) { - history.push({ - ...history.location, - search: fromQuery({ - ...toQuery(history.location.search), - page: newTableOptions.page?.index, - pageSize: newTableOptions.page?.size, - sortField: newTableOptions.sort?.field, - sortDirection: newTableOptions.sort?.direction, - }), - }); - } - }} - /> - - + items={mainStatistics.transactionGroups} + columns={columns} + initialSortField="impact" + initialSortDirection="desc" + initialPageSize={numberOfTransactionsPerPage} + isLoading={mainStatisticsStatus === FETCH_STATUS.LOADING} + tableSearchBar={tableSearchBar} + showPerPageOptions={showPerPageOptions} + onChangeRenderedItems={setRenderedItems} + saveTableOptionsToUrl={saveTableOptionsToUrl} + /> +
); } + +function useTableData({ + comparisonEnabled, + currentPageItems, + end, + environment, + kuery, + latencyAggregationType, + offset, + searchQuery, + serviceName, + start, + transactionType, +}: { + comparisonEnabled: boolean | undefined; + currentPageItems: ApiResponse['transactionGroups']; + end: string; + environment: string; + kuery: string; + latencyAggregationType: LatencyAggregationType | undefined; + offset: string | undefined; + searchQuery: string; + serviceName: string; + start: string; + transactionType: string | undefined; +}) { + const preferredDataSource = usePreferredDataSourceAndBucketSize({ + start, + end, + kuery, + numBuckets: 20, + type: ApmDocumentType.TransactionMetric, + }); + + const shouldUseDurationSummary = + latencyAggregationType === 'avg' && + preferredDataSource?.source?.hasDurationSummaryField; + + const { data: mainStatistics = INITIAL_STATE, status: mainStatisticsStatus } = + useFetcher( + (callApmApi) => { + if ( + !latencyAggregationType || + !transactionType || + !preferredDataSource + ) { + return Promise.resolve(undefined); + } + return callApmApi( + 'GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics', + { + params: { + path: { serviceName }, + query: { + environment, + kuery, + start, + end, + transactionType, + useDurationSummary: !!shouldUseDurationSummary, + latencyAggregationType: + latencyAggregationType as LatencyAggregationType, + documentType: preferredDataSource.source.documentType, + rollupInterval: preferredDataSource.source.rollupInterval, + searchQuery, + }, + }, + } + ).then((mainStatisticsData) => { + return { requestId: uuidv4(), ...mainStatisticsData }; + }); + }, + [ + searchQuery, + end, + environment, + kuery, + latencyAggregationType, + preferredDataSource, + serviceName, + shouldUseDurationSummary, + start, + transactionType, + ] + ); + + const { data: detailedStatistics, status: detailedStatisticsStatus } = + useFetcher( + (callApmApi) => { + const transactionNames = compact( + currentPageItems.map(({ name }) => name) + ); + if ( + start && + end && + transactionType && + latencyAggregationType && + preferredDataSource && + transactionNames.length > 0 + ) { + return callApmApi( + 'GET /internal/apm/services/{serviceName}/transactions/groups/detailed_statistics', + { + params: { + path: { serviceName }, + query: { + environment, + kuery, + start, + end, + bucketSizeInSeconds: preferredDataSource.bucketSizeInSeconds, + transactionType, + documentType: preferredDataSource.source.documentType, + rollupInterval: preferredDataSource.source.rollupInterval, + useDurationSummary: !!shouldUseDurationSummary, + latencyAggregationType: + latencyAggregationType as LatencyAggregationType, + transactionNames: JSON.stringify(transactionNames.sort()), + offset: + comparisonEnabled && isTimeComparison(offset) + ? offset + : undefined, + }, + }, + } + ); + } + }, + // only fetches detailed statistics when `currentPageItems` is updated. + // eslint-disable-next-line react-hooks/exhaustive-deps + [mainStatistics.requestId, currentPageItems, offset, comparisonEnabled], + { preservePreviousData: false } + ); + + return { + mainStatistics, + mainStatisticsStatus, + detailedStatistics, + detailedStatisticsStatus, + }; +} diff --git a/x-pack/plugins/apm/public/hooks/use_debounce.test.tsx b/x-pack/plugins/apm/public/hooks/use_debounce.test.tsx new file mode 100644 index 0000000000000..6701024eea9e9 --- /dev/null +++ b/x-pack/plugins/apm/public/hooks/use_debounce.test.tsx @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { renderHook, act } from '@testing-library/react-hooks'; +import { useStateDebounced } from './use_debounce'; // Replace 'your-module' with the actual module path + +describe('useStateDebounced', () => { + jest.useFakeTimers(); + beforeAll(() => { + // Mocks console.error so it won't polute tests output when testing the api throwing error + jest.spyOn(console, 'error').mockImplementation(() => null); + }); + + afterAll(() => { + jest.restoreAllMocks(); + }); + + it('returns the initial value and a debounced setter function', () => { + const { result } = renderHook(() => useStateDebounced('initialValue', 300)); + + const [debouncedValue, setValueDebounced] = result.current; + + expect(debouncedValue).toBe('initialValue'); + expect(typeof setValueDebounced).toBe('function'); + }); + + it('updates debounced value after a delay when setter function is called', () => { + const { result } = renderHook(() => useStateDebounced('initialValue')); + + act(() => { + result.current[1]('updatedValue'); + }); + expect(result.current[0]).toBe('initialValue'); + jest.advanceTimersByTime(300); + expect(result.current[0]).toBe('updatedValue'); + }); + + it('cancels previous debounced updates when new ones occur', () => { + const { result } = renderHook(() => useStateDebounced('initialValue', 400)); + + act(() => { + result.current[1]('updatedValue'); + }); + jest.advanceTimersByTime(150); + expect(result.current[0]).toBe('initialValue'); + act(() => { + result.current[1]('newUpdatedValue'); + }); + jest.advanceTimersByTime(400); + expect(result.current[0]).toBe('newUpdatedValue'); + }); +}); diff --git a/x-pack/plugins/apm/public/hooks/use_debounce.tsx b/x-pack/plugins/apm/public/hooks/use_debounce.tsx new file mode 100644 index 0000000000000..1aa2276e901b2 --- /dev/null +++ b/x-pack/plugins/apm/public/hooks/use_debounce.tsx @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { debounce } from 'lodash'; +import { useCallback, useState } from 'react'; + +export function useStateDebounced( + initialValue: T, + debounceDelay: number = 300 +) { + const [debouncedValue, setValue] = useState(initialValue); + + // eslint-disable-next-line react-hooks/exhaustive-deps + const setValueDebounced = useCallback(debounce(setValue, debounceDelay), [ + setValue, + debounceDelay, + ]); + + return [debouncedValue, setValueDebounced] as const; +} diff --git a/x-pack/plugins/apm/public/hooks/use_error_group_distribution_fetcher.tsx b/x-pack/plugins/apm/public/hooks/use_error_group_distribution_fetcher.tsx index bc8a2056cb41c..66e4fa63ce620 100644 --- a/x-pack/plugins/apm/public/hooks/use_error_group_distribution_fetcher.tsx +++ b/x-pack/plugins/apm/public/hooks/use_error_group_distribution_fetcher.tsx @@ -65,5 +65,8 @@ export function useErrorGroupDistributionFetcher({ ] ); - return { errorDistributionData: data, status }; + return { + errorDistributionData: data, + errorDistributionStatus: status, + }; } diff --git a/x-pack/plugins/apm/public/hooks/use_fetcher.tsx b/x-pack/plugins/apm/public/hooks/use_fetcher.tsx index df4da04651228..cfa65e001def7 100644 --- a/x-pack/plugins/apm/public/hooks/use_fetcher.tsx +++ b/x-pack/plugins/apm/public/hooks/use_fetcher.tsx @@ -30,6 +30,12 @@ export const isPending = (fetchStatus: FETCH_STATUS) => fetchStatus === FETCH_STATUS.LOADING || fetchStatus === FETCH_STATUS.NOT_INITIATED; +export const isFailure = (fetchStatus: FETCH_STATUS) => + fetchStatus === FETCH_STATUS.FAILURE; + +export const isSuccess = (fetchStatus: FETCH_STATUS) => + fetchStatus === FETCH_STATUS.SUCCESS; + export interface FetcherResult { data?: Data; status: FETCH_STATUS; diff --git a/x-pack/plugins/apm/public/hooks/use_preferred_data_source_and_bucket_size.ts b/x-pack/plugins/apm/public/hooks/use_preferred_data_source_and_bucket_size.ts index be99a537de011..348d84883ba87 100644 --- a/x-pack/plugins/apm/public/hooks/use_preferred_data_source_and_bucket_size.ts +++ b/x-pack/plugins/apm/public/hooks/use_preferred_data_source_and_bucket_size.ts @@ -18,6 +18,7 @@ import { useTimeRangeMetadata } from '../context/time_range_metadata/use_time_ra * @param {number} numBuckets - The number of buckets. Should be 20 for SparkPlots or 100 for Other charts. */ + export function usePreferredDataSourceAndBucketSize< TDocumentType extends | ApmDocumentType.ServiceTransactionMetric diff --git a/x-pack/plugins/apm/server/lib/anomaly_detection/anomaly_search.ts b/x-pack/plugins/apm/server/lib/anomaly_detection/anomaly_search.ts index 0017e94863828..4192d35d796f3 100644 --- a/x-pack/plugins/apm/server/lib/anomaly_detection/anomaly_search.ts +++ b/x-pack/plugins/apm/server/lib/anomaly_detection/anomaly_search.ts @@ -8,6 +8,9 @@ import type { ESSearchRequest, ESSearchResponse } from '@kbn/es-types'; import { MlClient } from '../helpers/get_ml_client'; +export const ML_SERVICE_NAME_FIELD = 'partition_field_value'; +export const ML_TRANSACTION_TYPE_FIELD = 'by_field_value'; + interface SharedFields { job_id: string; bucket_span: number; @@ -44,9 +47,9 @@ type AnomalyDocument = MlRecord | MlModelPlot; export async function anomalySearch( mlAnomalySearch: Required['mlSystem']['mlAnomalySearch'], - params: TParams + params: TParams, + jobsIds = [] // pass an empty array of job ids to anomaly search so any validation is skipped ): Promise> { - const response = await mlAnomalySearch(params, []); - + const response = await mlAnomalySearch(params, jobsIds); return response as unknown as ESSearchResponse; } diff --git a/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_group_main_statistics.ts b/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_group_main_statistics.ts index 182fe0a1cdd8a..6c8d878502b7a 100644 --- a/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_group_main_statistics.ts +++ b/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_group_main_statistics.ts @@ -10,6 +10,7 @@ import { kqlQuery, rangeQuery, termQuery, + wildcardQuery, } from '@kbn/observability-plugin/server'; import { ERROR_CULPRIT, @@ -17,6 +18,7 @@ import { ERROR_EXC_MESSAGE, ERROR_EXC_TYPE, ERROR_GROUP_ID, + ERROR_GROUP_NAME, ERROR_LOG_MESSAGE, SERVICE_NAME, TRANSACTION_NAME, @@ -28,15 +30,18 @@ import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm import { ApmDocumentType } from '../../../../common/document_type'; import { RollupInterval } from '../../../../common/rollup'; -export type ErrorGroupMainStatisticsResponse = Array<{ - groupId: string; - name: string; - lastSeen: number; - occurrences: number; - culprit: string | undefined; - handled: boolean | undefined; - type: string | undefined; -}>; +export interface ErrorGroupMainStatisticsResponse { + errorGroups: Array<{ + groupId: string; + name: string; + lastSeen: number; + occurrences: number; + culprit: string | undefined; + handled: boolean | undefined; + type: string | undefined; + }>; + maxCountExceeded: boolean; +} export async function getErrorGroupMainStatistics({ kuery, @@ -50,6 +55,7 @@ export async function getErrorGroupMainStatistics({ maxNumberOfErrorGroups = 500, transactionName, transactionType, + searchQuery, }: { kuery: string; serviceName: string; @@ -62,6 +68,7 @@ export async function getErrorGroupMainStatistics({ maxNumberOfErrorGroups?: number; transactionName?: string; transactionType?: string; + searchQuery?: string; }): Promise { // sort buckets by last occurrence of error const sortByLatestOccurrence = sortField === 'lastSeen'; @@ -72,6 +79,19 @@ export async function getErrorGroupMainStatistics({ ? { [maxTimestampAggKey]: sortDirection } : { _count: sortDirection }; + const shouldQuery = searchQuery + ? { + should: [ + ERROR_LOG_MESSAGE, + ERROR_EXC_MESSAGE, + ERROR_GROUP_NAME, + ERROR_EXC_TYPE, + ERROR_CULPRIT, + ].flatMap((field) => wildcardQuery(field, searchQuery)), + minimum_should_match: 1, + } + : {}; + const response = await apmEventClient.search( 'get_error_group_main_statistics', { @@ -96,6 +116,7 @@ export async function getErrorGroupMainStatistics({ ...environmentQuery(environment), ...kqlQuery(kuery), ], + ...shouldQuery, }, }, aggs: { @@ -133,7 +154,10 @@ export async function getErrorGroupMainStatistics({ } ); - return ( + const maxCountExceeded = + (response.aggregations?.error_groups.sum_other_doc_count ?? 0) > 0; + + const errorGroups = response.aggregations?.error_groups.buckets.map((bucket) => { return { groupId: bucket.key as string, @@ -147,6 +171,10 @@ export async function getErrorGroupMainStatistics({ bucket.sample.hits.hits[0]._source.error.exception?.[0].handled, type: bucket.sample.hits.hits[0]._source.error.exception?.[0].type, }; - }) ?? [] - ); + }) ?? []; + + return { + errorGroups, + maxCountExceeded, + }; } diff --git a/x-pack/plugins/apm/server/routes/errors/route.ts b/x-pack/plugins/apm/server/routes/errors/route.ts index a3e11887f1caf..a76ab1df8a9b1 100644 --- a/x-pack/plugins/apm/server/routes/errors/route.ts +++ b/x-pack/plugins/apm/server/routes/errors/route.ts @@ -47,6 +47,7 @@ const errorsMainStatisticsRoute = createApmServerRoute({ t.partial({ sortField: t.string, sortDirection: t.union([t.literal('asc'), t.literal('desc')]), + searchQuery: t.string, }), environmentRt, kueryRt, @@ -54,16 +55,21 @@ const errorsMainStatisticsRoute = createApmServerRoute({ ]), }), options: { tags: ['access:apm'] }, - handler: async ( - resources - ): Promise<{ errorGroups: ErrorGroupMainStatisticsResponse }> => { + handler: async (resources): Promise => { const { params } = resources; const apmEventClient = await getApmEventClient(resources); const { serviceName } = params.path; - const { environment, kuery, sortField, sortDirection, start, end } = - params.query; + const { + environment, + kuery, + sortField, + sortDirection, + start, + end, + searchQuery, + } = params.query; - const errorGroups = await getErrorGroupMainStatistics({ + return await getErrorGroupMainStatistics({ environment, kuery, serviceName, @@ -72,9 +78,8 @@ const errorsMainStatisticsRoute = createApmServerRoute({ apmEventClient, start, end, + searchQuery, }); - - return { errorGroups }; }, }); @@ -97,11 +102,7 @@ const errorsMainStatisticsByTransactionNameRoute = createApmServerRoute({ ]), }), options: { tags: ['access:apm'] }, - handler: async ( - resources - ): Promise<{ - errorGroups: ErrorGroupMainStatisticsResponse; - }> => { + handler: async (resources): Promise => { const { params } = resources; const apmEventClient = await getApmEventClient(resources); const { serviceName } = params.path; @@ -115,7 +116,7 @@ const errorsMainStatisticsByTransactionNameRoute = createApmServerRoute({ maxNumberOfErrorGroups, } = params.query; - const errorGroups = await getErrorGroupMainStatistics({ + return await getErrorGroupMainStatistics({ environment, kuery, serviceName, @@ -126,8 +127,6 @@ const errorsMainStatisticsByTransactionNameRoute = createApmServerRoute({ transactionName, transactionType, }); - - return { errorGroups }; }, }); diff --git a/x-pack/plugins/apm/server/routes/service_map/get_service_anomalies.ts b/x-pack/plugins/apm/server/routes/service_map/get_service_anomalies.ts index d46c43d258166..eb0fb5ed62e05 100644 --- a/x-pack/plugins/apm/server/routes/service_map/get_service_anomalies.ts +++ b/x-pack/plugins/apm/server/routes/service_map/get_service_anomalies.ts @@ -8,9 +8,8 @@ import Boom from '@hapi/boom'; import { sortBy, uniqBy } from 'lodash'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import type { ESSearchResponse } from '@kbn/es-types'; import type { MlAnomalyDetectors } from '@kbn/ml-plugin/server'; -import { rangeQuery } from '@kbn/observability-plugin/server'; +import { rangeQuery, wildcardQuery } from '@kbn/observability-plugin/server'; import { getSeverity, ML_ERRORS } from '../../../common/anomaly_detection'; import { ENVIRONMENT_ALL } from '../../../common/environment_filter_values'; import { getServiceHealthStatus } from '../../../common/service_health_status'; @@ -20,6 +19,11 @@ import { getMlJobsWithAPMGroup } from '../../lib/anomaly_detection/get_ml_jobs_w import { MlClient } from '../../lib/helpers/get_ml_client'; import { apmMlAnomalyQuery } from '../../lib/anomaly_detection/apm_ml_anomaly_query'; import { AnomalyDetectorType } from '../../../common/anomaly_detection/apm_ml_detectors'; +import { + anomalySearch, + ML_SERVICE_NAME_FIELD, + ML_TRANSACTION_TYPE_FIELD, +} from '../../lib/anomaly_detection/anomaly_search'; export const DEFAULT_ANOMALIES: ServiceAnomaliesResponse = { mlJobIds: [], @@ -34,11 +38,13 @@ export async function getServiceAnomalies({ environment, start, end, + searchQuery, }: { mlClient?: MlClient; environment: string; start: number; end: number; + searchQuery?: string; }) { return withApmSpan('get_service_anomalies', async () => { if (!mlClient) { @@ -65,6 +71,7 @@ export async function getServiceAnomalies({ by_field_value: defaultTransactionTypes, }, }, + ...wildcardQuery(ML_SERVICE_NAME_FIELD, searchQuery), ] as estypes.QueryDslQueryContainer[], }, }, @@ -73,7 +80,7 @@ export async function getServiceAnomalies({ composite: { size: 5000, sources: [ - { serviceName: { terms: { field: 'partition_field_value' } } }, + { serviceName: { terms: { field: ML_SERVICE_NAME_FIELD } } }, { jobId: { terms: { field: 'job_id' } } }, ] as Array< Record @@ -84,7 +91,7 @@ export async function getServiceAnomalies({ top_metrics: { metrics: [ { field: 'actual' }, - { field: 'by_field_value' }, + { field: ML_TRANSACTION_TYPE_FIELD }, { field: 'result_type' }, { field: 'record_score' }, ], @@ -100,20 +107,16 @@ export async function getServiceAnomalies({ }; const [anomalyResponse, jobIds] = await Promise.all([ - // pass an empty array of job ids to anomaly search - // so any validation is skipped withApmSpan('ml_anomaly_search', () => - mlClient.mlSystem.mlAnomalySearch(params, []) + anomalySearch(mlClient.mlSystem.mlAnomalySearch, params) ), getMLJobIds(mlClient.anomalyDetectors, environment), ]); - const typedAnomalyResponse: ESSearchResponse = - anomalyResponse as any; const relevantBuckets = uniqBy( sortBy( // make sure we only return data for jobs that are available in this space - typedAnomalyResponse.aggregations?.services.buckets.filter((bucket) => + anomalyResponse.aggregations?.services.buckets.filter((bucket) => jobIds.includes(bucket.key.jobId as string) ) ?? [], // sort by job ID in case there are multiple jobs for one service to diff --git a/x-pack/plugins/apm/server/routes/services/get_service_instances/detailed_statistics.ts b/x-pack/plugins/apm/server/routes/services/get_service_instances/detailed_statistics.ts index 28401dd0b46b5..95f56520b8ab2 100644 --- a/x-pack/plugins/apm/server/routes/services/get_service_instances/detailed_statistics.ts +++ b/x-pack/plugins/apm/server/routes/services/get_service_instances/detailed_statistics.ts @@ -51,11 +51,11 @@ async function getServiceInstancesDetailedStatistics( const [transactionStats, systemMetricStats = []] = await Promise.all([ getServiceInstancesTransactionStatistics({ ...params, - isComparisonSearch: true, + includeTimeseries: true, }), getServiceInstancesSystemMetricStatistics({ ...params, - isComparisonSearch: true, + includeTimeseries: true, }), ]); diff --git a/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_system_metric_statistics.ts b/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_system_metric_statistics.ts index b2925af05946a..775246e5a578d 100644 --- a/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_system_metric_statistics.ts +++ b/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_system_metric_statistics.ts @@ -52,7 +52,7 @@ export async function getServiceInstancesSystemMetricStatistics< end, serviceNodeIds, numBuckets, - isComparisonSearch, + includeTimeseries, offset, }: { apmEventClient: APMEventClient; @@ -64,7 +64,7 @@ export async function getServiceInstancesSystemMetricStatistics< environment: string; kuery: string; size?: number; - isComparisonSearch: T; + includeTimeseries: T; offset?: string; }): Promise>> { const { startWithOffset, endWithOffset } = getOffsetInMs({ @@ -85,7 +85,7 @@ export async function getServiceInstancesSystemMetricStatistics< agg: TParams ) { return { - ...(isComparisonSearch + ...(includeTimeseries ? { avg: { avg: agg }, timeseries: { @@ -136,7 +136,7 @@ export async function getServiceInstancesSystemMetricStatistics< ...rangeQuery(startWithOffset, endWithOffset), ...environmentQuery(environment), ...kqlQuery(kuery), - ...(isComparisonSearch && serviceNodeIds + ...(serviceNodeIds?.length ? [{ terms: { [SERVICE_NODE_NAME]: serviceNodeIds } }] : []), { @@ -158,7 +158,7 @@ export async function getServiceInstancesSystemMetricStatistics< field: SERVICE_NODE_NAME, missing: SERVICE_NODE_NAME_MISSING, ...(size ? { size } : {}), - ...(isComparisonSearch ? { include: serviceNodeIds } : {}), + ...(serviceNodeIds?.length ? { include: serviceNodeIds } : {}), }, aggs: subAggs, }, @@ -179,7 +179,7 @@ export async function getServiceInstancesSystemMetricStatistics< : 'memory_usage_system'; const cpuUsage = - // Timeseries is available when isComparisonSearch is true + // Timeseries is available when includeTimeseries is true 'timeseries' in serviceNodeBucket.cpu_usage ? serviceNodeBucket.cpu_usage.timeseries.buckets.map( (dateBucket) => ({ @@ -191,7 +191,7 @@ export async function getServiceInstancesSystemMetricStatistics< const memoryUsageValue = serviceNodeBucket[memoryMetricsKey]; const memoryUsage = - // Timeseries is available when isComparisonSearch is true + // Timeseries is available when includeTimeseries is true 'timeseries' in memoryUsageValue ? memoryUsageValue.timeseries.buckets.map((dateBucket) => ({ x: dateBucket.key, diff --git a/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_transaction_statistics.ts b/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_transaction_statistics.ts index ab687382e767b..db9392fba1b4b 100644 --- a/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_transaction_statistics.ts +++ b/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_transaction_statistics.ts @@ -63,7 +63,7 @@ export async function getServiceInstancesTransactionStatistics< end, serviceNodeIds, numBuckets, - isComparisonSearch, + includeTimeseries, offset, }: { latencyAggregationType: LatencyAggregationType; @@ -73,7 +73,7 @@ export async function getServiceInstancesTransactionStatistics< searchAggregatedTransactions: boolean; start: number; end: number; - isComparisonSearch: T; + includeTimeseries: T; serviceNodeIds?: string[]; environment: string; kuery: string; @@ -123,7 +123,7 @@ export async function getServiceInstancesTransactionStatistics< ...getBackwardCompatibleDocumentTypeFilter( searchAggregatedTransactions ), - ...(isComparisonSearch && serviceNodeIds + ...(serviceNodeIds?.length ? [{ terms: { [SERVICE_NODE_NAME]: serviceNodeIds } }] : []), ], @@ -136,9 +136,9 @@ export async function getServiceInstancesTransactionStatistics< field: SERVICE_NODE_NAME, missing: SERVICE_NODE_NAME_MISSING, ...(size ? { size } : {}), - ...(isComparisonSearch ? { include: serviceNodeIds } : {}), + ...(serviceNodeIds?.length ? { include: serviceNodeIds } : {}), }, - aggs: isComparisonSearch + aggs: includeTimeseries ? { timeseries: { date_histogram: { @@ -174,7 +174,7 @@ export async function getServiceInstancesTransactionStatistics< const { doc_count: count, key } = serviceNodeBucket; const serviceNodeName = String(key); - // Timeseries is returned when isComparisonSearch is true + // Timeseries is returned when includeTimeseries is true if ('timeseries' in serviceNodeBucket) { const { timeseries } = serviceNodeBucket; return { diff --git a/x-pack/plugins/apm/server/routes/services/get_service_instances/main_statistics.ts b/x-pack/plugins/apm/server/routes/services/get_service_instances/main_statistics.ts index 16a9499979561..bf567aa98c84c 100644 --- a/x-pack/plugins/apm/server/routes/services/get_service_instances/main_statistics.ts +++ b/x-pack/plugins/apm/server/routes/services/get_service_instances/main_statistics.ts @@ -5,10 +5,11 @@ * 2.0. */ +import { keyBy, orderBy } from 'lodash'; +import { InstancesSortField } from '../../../../common/instances'; import { LatencyAggregationType } from '../../../../common/latency_aggregation_types'; -import { joinByKey } from '../../../../common/utils/join_by_key'; -import { withApmSpan } from '../../../utils/with_apm_span'; import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; +import { withApmSpan } from '../../../utils/with_apm_span'; import { getServiceInstancesSystemMetricStatistics } from './get_service_instances_system_metric_statistics'; import { getServiceInstancesTransactionStatistics } from './get_service_instances_transaction_statistics'; @@ -24,6 +25,8 @@ interface ServiceInstanceMainStatisticsParams { start: number; end: number; offset?: string; + sortField: InstancesSortField; + sortDirection: 'asc' | 'desc'; } export type ServiceInstanceMainStatisticsResponse = Array<{ @@ -35,31 +38,39 @@ export type ServiceInstanceMainStatisticsResponse = Array<{ memoryUsage?: number | null; }>; -export async function getServiceInstancesMainStatistics( - params: Omit -): Promise { +export async function getServiceInstancesMainStatistics({ + sortDirection, + sortField, + ...params +}: Omit< + ServiceInstanceMainStatisticsParams, + 'size' +>): Promise { return withApmSpan('get_service_instances_main_statistics', async () => { const paramsForSubQueries = { ...params, - size: 50, + size: 1000, }; - const [transactionStats, systemMetricStats] = await Promise.all([ - getServiceInstancesTransactionStatistics({ - ...paramsForSubQueries, - isComparisonSearch: false, - }), - getServiceInstancesSystemMetricStatistics({ - ...paramsForSubQueries, - isComparisonSearch: false, - }), - ]); + const transactionStats = await getServiceInstancesTransactionStatistics({ + ...paramsForSubQueries, + includeTimeseries: false, + }); + const serviceNodeIds = transactionStats.map((item) => item.serviceNodeName); + const systemMetricStats = await getServiceInstancesSystemMetricStatistics({ + ...paramsForSubQueries, + includeTimeseries: false, + serviceNodeIds, + }); - const stats = joinByKey( - [...transactionStats, ...systemMetricStats], - 'serviceNodeName' - ); + const systemMetricStatsMap = keyBy(systemMetricStats, 'serviceNodeName'); + const stats = transactionStats.length + ? transactionStats.map((item) => ({ + ...item, + ...(systemMetricStatsMap[item.serviceNodeName] || {}), + })) + : systemMetricStats; - return stats; + return orderBy(stats, sortField, sortDirection).slice(0, 100); }); } diff --git a/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups.ts b/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups.ts index 84ec4da4829e8..a44a557e2b4de 100644 --- a/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups.ts +++ b/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups.ts @@ -5,7 +5,11 @@ * 2.0. */ -import { kqlQuery, rangeQuery } from '@kbn/observability-plugin/server'; +import { + kqlQuery, + rangeQuery, + wildcardQuery, +} from '@kbn/observability-plugin/server'; import { ApmTransactionDocumentType } from '../../../common/document_type'; import { SERVICE_NAME, @@ -43,7 +47,7 @@ export interface TransactionGroups { export interface ServiceTransactionGroupsResponse { transactionGroups: TransactionGroups[]; - maxTransactionGroupsExceeded: boolean; + maxCountExceeded: boolean; transactionOverflowCount: number; hasActiveAlerts: boolean; } @@ -60,6 +64,7 @@ export async function getServiceTransactionGroups({ documentType, rollupInterval, useDurationSummary, + searchQuery, }: { environment: string; kuery: string; @@ -72,6 +77,7 @@ export async function getServiceTransactionGroups({ documentType: ApmTransactionDocumentType; rollupInterval: RollupInterval; useDurationSummary: boolean; + searchQuery?: string; }): Promise { const field = getDurationFieldForTransactions( documentType, @@ -107,6 +113,7 @@ export async function getServiceTransactionGroups({ ...rangeQuery(start, end), ...environmentQuery(environment), ...kqlQuery(kuery), + ...wildcardQuery(TRANSACTION_NAME, searchQuery), ], }, }, @@ -169,7 +176,7 @@ export async function getServiceTransactionGroups({ ...transactionGroup, transactionType, })), - maxTransactionGroupsExceeded: + maxCountExceeded: (response.aggregations?.transaction_groups.sum_other_doc_count ?? 0) > 0, transactionOverflowCount: response.aggregations?.transaction_overflow_count.value ?? 0, diff --git a/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups_alerts.ts b/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups_alerts.ts index 9ad556df126ba..178c5e186c316 100644 --- a/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups_alerts.ts +++ b/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups_alerts.ts @@ -9,6 +9,7 @@ import { kqlQuery, termQuery, rangeQuery, + wildcardQuery, } from '@kbn/observability-plugin/server'; import { ALERT_RULE_PRODUCER, @@ -47,6 +48,7 @@ export async function getServiceTransactionGroupsAlerts({ start, end, environment, + searchQuery, }: { apmAlertsClient: ApmAlertsClient; kuery?: string; @@ -56,6 +58,7 @@ export async function getServiceTransactionGroupsAlerts({ start: number; end: number; environment?: string; + searchQuery?: string; }): Promise { const ALERT_RULE_PARAMETERS_AGGREGATION_TYPE = `${ALERT_RULE_PARAMETERS}.aggregationType`; @@ -72,6 +75,7 @@ export async function getServiceTransactionGroupsAlerts({ ...termQuery(SERVICE_NAME, serviceName), ...termQuery(TRANSACTION_TYPE, transactionType), ...environmentQuery(environment), + ...wildcardQuery(TRANSACTION_NAME, searchQuery), ], must: [ { diff --git a/x-pack/plugins/apm/server/routes/services/get_services/get_health_statuses.ts b/x-pack/plugins/apm/server/routes/services/get_services/get_health_statuses.ts index 0b8a252da9a76..f2dbeb8410bbe 100644 --- a/x-pack/plugins/apm/server/routes/services/get_services/get_health_statuses.ts +++ b/x-pack/plugins/apm/server/routes/services/get_services/get_health_statuses.ts @@ -18,6 +18,7 @@ interface AggregationParams { mlClient?: MlClient; start: number; end: number; + searchQuery: string | undefined; } export type ServiceHealthStatusesResponse = Array<{ @@ -30,6 +31,7 @@ export async function getHealthStatuses({ mlClient, start, end, + searchQuery, }: AggregationParams): Promise { if (!mlClient) { return []; @@ -40,6 +42,7 @@ export async function getHealthStatuses({ environment, start, end, + searchQuery, }); return anomalies.serviceAnomalies.map((anomalyStats) => { diff --git a/x-pack/plugins/apm/server/routes/services/get_services/get_service_alerts.ts b/x-pack/plugins/apm/server/routes/services/get_services/get_service_alerts.ts index e47d9b61124cc..0fc76f803c440 100644 --- a/x-pack/plugins/apm/server/routes/services/get_services/get_service_alerts.ts +++ b/x-pack/plugins/apm/server/routes/services/get_services/get_service_alerts.ts @@ -9,6 +9,7 @@ import { kqlQuery, termQuery, rangeQuery, + wildcardQuery, } from '@kbn/observability-plugin/server'; import { ALERT_RULE_PRODUCER, @@ -37,6 +38,7 @@ export async function getServicesAlerts({ start, end, environment, + searchQuery, }: { apmAlertsClient: ApmAlertsClient; kuery?: string; @@ -46,6 +48,7 @@ export async function getServicesAlerts({ start: number; end: number; environment?: string; + searchQuery?: string; }): Promise { const params = { size: 0, @@ -59,6 +62,7 @@ export async function getServicesAlerts({ ...kqlQuery(kuery), ...serviceGroupWithOverflowQuery(serviceGroup), ...termQuery(SERVICE_NAME, serviceName), + ...wildcardQuery(SERVICE_NAME, searchQuery), ...environmentQuery(environment), ], }, diff --git a/x-pack/plugins/apm/server/routes/services/get_services/get_service_transaction_stats.ts b/x-pack/plugins/apm/server/routes/services/get_services/get_service_transaction_stats.ts index 7fbeb1cc9d24c..a79e17c32c04b 100644 --- a/x-pack/plugins/apm/server/routes/services/get_services/get_service_transaction_stats.ts +++ b/x-pack/plugins/apm/server/routes/services/get_services/get_service_transaction_stats.ts @@ -5,7 +5,11 @@ * 2.0. */ -import { kqlQuery, rangeQuery } from '@kbn/observability-plugin/server'; +import { + kqlQuery, + rangeQuery, + wildcardQuery, +} from '@kbn/observability-plugin/server'; import { ApmDocumentType } from '../../../../common/document_type'; import { AGENT_NAME, @@ -45,6 +49,7 @@ interface AggregationParams { | ApmDocumentType.TransactionEvent; rollupInterval: RollupInterval; useDurationSummary: boolean; + searchQuery: string | undefined; } export interface ServiceTransactionStatsResponse { @@ -72,6 +77,7 @@ export async function getServiceTransactionStats({ documentType, rollupInterval, useDurationSummary, + searchQuery, }: AggregationParams): Promise { const outcomes = getOutcomeAggregation(documentType); @@ -108,6 +114,7 @@ export async function getServiceTransactionStats({ ...environmentQuery(environment), ...kqlQuery(kuery), ...serviceGroupWithOverflowQuery(serviceGroup), + ...wildcardQuery(SERVICE_NAME, searchQuery), ], }, }, diff --git a/x-pack/plugins/apm/server/routes/services/get_services/get_services_items.ts b/x-pack/plugins/apm/server/routes/services/get_services/get_services_items.ts index c36754e4cf50f..e57e8e9d20235 100644 --- a/x-pack/plugins/apm/server/routes/services/get_services/get_services_items.ts +++ b/x-pack/plugins/apm/server/routes/services/get_services/get_services_items.ts @@ -24,7 +24,7 @@ export const MAX_NUMBER_OF_SERVICES = 1_000; export interface ServicesItemsResponse { items: MergedServiceStat[]; - maxServiceCountExceeded: boolean; + maxCountExceeded: boolean; serviceOverflowCount: number; } @@ -42,6 +42,7 @@ export async function getServicesItems({ documentType, rollupInterval, useDurationSummary, + searchQuery, }: { environment: string; kuery: string; @@ -56,6 +57,7 @@ export async function getServicesItems({ documentType: ApmServiceTransactionDocumentType; rollupInterval: RollupInterval; useDurationSummary: boolean; + searchQuery?: string; }): Promise { return withApmSpan('get_services_items', async () => { const commonParams = { @@ -69,11 +71,12 @@ export async function getServicesItems({ documentType, rollupInterval, useDurationSummary, + searchQuery, }; const [ { serviceStats, serviceOverflowCount }, - { services: servicesWithoutTransactions, maxServiceCountExceeded }, + { services: servicesWithoutTransactions, maxCountExceeded }, healthStatuses, alertCounts, ] = await Promise.all([ @@ -103,7 +106,7 @@ export async function getServicesItems({ healthStatuses, alertCounts, }) ?? [], - maxServiceCountExceeded, + maxCountExceeded, serviceOverflowCount, }; }); diff --git a/x-pack/plugins/apm/server/routes/services/get_services/get_services_without_transactions.ts b/x-pack/plugins/apm/server/routes/services/get_services/get_services_without_transactions.ts index 0eedb8494f21b..0ddae57603fe1 100644 --- a/x-pack/plugins/apm/server/routes/services/get_services/get_services_without_transactions.ts +++ b/x-pack/plugins/apm/server/routes/services/get_services/get_services_without_transactions.ts @@ -5,7 +5,11 @@ * 2.0. */ -import { kqlQuery, rangeQuery } from '@kbn/observability-plugin/server'; +import { + kqlQuery, + rangeQuery, + wildcardQuery, +} from '@kbn/observability-plugin/server'; import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { AgentName } from '../../../../typings/es_schemas/ui/fields/agent'; import { @@ -27,7 +31,7 @@ export interface ServicesWithoutTransactionsResponse { environments: string[]; agentName: AgentName; }>; - maxServiceCountExceeded: boolean; + maxCountExceeded: boolean; } export async function getServicesWithoutTransactions({ @@ -41,6 +45,7 @@ export async function getServicesWithoutTransactions({ randomSampler, documentType, rollupInterval, + searchQuery, }: { apmEventClient: APMEventClient; environment: string; @@ -52,6 +57,7 @@ export async function getServicesWithoutTransactions({ randomSampler: RandomSampler; documentType: ApmDocumentType; rollupInterval: RollupInterval; + searchQuery: string | undefined; }): Promise { const isServiceTransactionMetric = documentType === ApmDocumentType.ServiceTransactionMetric; @@ -83,6 +89,7 @@ export async function getServicesWithoutTransactions({ ...environmentQuery(environment), ...kqlQuery(kuery), ...serviceGroupWithOverflowQuery(serviceGroup), + ...wildcardQuery(SERVICE_NAME, searchQuery), ], }, }, @@ -116,6 +123,9 @@ export async function getServicesWithoutTransactions({ } ); + const maxCountExceeded = + (response.aggregations?.sample.services.sum_other_doc_count ?? 0) > 0; + return { services: response.aggregations?.sample.services.buckets.map((bucket) => { @@ -127,7 +137,6 @@ export async function getServicesWithoutTransactions({ agentName: bucket.latest.top[0].metrics[AGENT_NAME] as AgentName, }; }) ?? [], - maxServiceCountExceeded: - (response.aggregations?.sample.services.sum_other_doc_count ?? 0) > 0, + maxCountExceeded, }; } diff --git a/x-pack/plugins/apm/server/routes/services/route.ts b/x-pack/plugins/apm/server/routes/services/route.ts index 0a51a3e88379f..550cab6e76249 100644 --- a/x-pack/plugins/apm/server/routes/services/route.ts +++ b/x-pack/plugins/apm/server/routes/services/route.ts @@ -24,6 +24,7 @@ import { mergeWith, uniq } from 'lodash'; import { ML_ERRORS } from '../../../common/anomaly_detection'; import { ServiceAnomalyTimeseries } from '../../../common/anomaly_detection/service_anomaly_timeseries'; import { offsetRt } from '../../../common/comparison_rt'; +import { instancesSortFieldRt } from '../../../common/instances'; import { latencyAggregationTypeRt } from '../../../common/latency_aggregation_types'; import { offsetPreviousPeriodCoordinates } from '../../../common/utils/offset_previous_period_coordinate'; import { getAnomalyTimeseries } from '../../lib/anomaly_detection/get_anomaly_timeseries'; @@ -107,7 +108,10 @@ const servicesRoute = createApmServerRoute({ endpoint: 'GET /internal/apm/services', params: t.type({ query: t.intersection([ - t.partial({ serviceGroup: t.string }), + t.partial({ + searchQuery: t.string, + serviceGroup: t.string, + }), t.intersection([ probabilityRt, t.intersection([ @@ -133,6 +137,7 @@ const servicesRoute = createApmServerRoute({ } = resources; const { + searchQuery, environment, kuery, start, @@ -175,6 +180,7 @@ const servicesRoute = createApmServerRoute({ documentType, rollupInterval, useDurationSummary, + searchQuery, }); }, }); @@ -613,6 +619,8 @@ const serviceInstancesMainStatisticsRoute = createApmServerRoute({ t.type({ latencyAggregationType: latencyAggregationTypeRt, transactionType: t.string, + sortField: instancesSortFieldRt, + sortDirection: t.union([t.literal('asc'), t.literal('desc')]), }), offsetRt, environmentRt, @@ -638,6 +646,8 @@ const serviceInstancesMainStatisticsRoute = createApmServerRoute({ offset, start, end, + sortField, + sortDirection, } = params.query; const searchAggregatedTransactions = await getSearchTransactionsEvents({ @@ -648,33 +658,24 @@ const serviceInstancesMainStatisticsRoute = createApmServerRoute({ end, }); + const commonParams = { + environment, + kuery, + latencyAggregationType, + serviceName, + apmEventClient, + transactionType, + searchAggregatedTransactions, + start, + end, + sortField, + sortDirection, + }; + const [currentPeriod, previousPeriod] = await Promise.all([ - getServiceInstancesMainStatistics({ - environment, - kuery, - latencyAggregationType, - serviceName, - apmEventClient, - transactionType, - searchAggregatedTransactions, - start, - end, - }), + getServiceInstancesMainStatistics(commonParams), ...(offset - ? [ - getServiceInstancesMainStatistics({ - environment, - kuery, - latencyAggregationType, - serviceName, - apmEventClient, - transactionType, - searchAggregatedTransactions, - start, - end, - offset, - }), - ] + ? [getServiceInstancesMainStatistics({ ...commonParams, offset })] : []), ]); diff --git a/x-pack/plugins/apm/server/routes/settings/custom_link/helper.ts b/x-pack/plugins/apm/server/routes/settings/custom_link/helper.ts index 62082b2236dec..55cdaebf26791 100644 --- a/x-pack/plugins/apm/server/routes/settings/custom_link/helper.ts +++ b/x-pack/plugins/apm/server/routes/settings/custom_link/helper.ts @@ -40,8 +40,8 @@ export function toESFormat(customLink: CustomLink): CustomLinkES { return { label, url, ...ESFilters }; } -export function splitFilterValueByComma(filterValue: Filter['value']) { - return filterValue +export function splitFilterValueByComma(searchQuery: Filter['value']) { + return searchQuery .split(',') .map((v) => v.trim()) .filter((v) => v); diff --git a/x-pack/plugins/apm/server/routes/transactions/route.ts b/x-pack/plugins/apm/server/routes/transactions/route.ts index 888cb82820cc1..0796062227b08 100644 --- a/x-pack/plugins/apm/server/routes/transactions/route.ts +++ b/x-pack/plugins/apm/server/routes/transactions/route.ts @@ -73,10 +73,11 @@ const transactionGroupsMainStatisticsRoute = createApmServerRoute({ params: t.type({ path: t.type({ serviceName: t.string }), query: t.intersection([ + t.partial({ searchQuery: t.string }), environmentRt, - kueryRt, rangeRt, t.type({ + kuery: t.string, useDurationSummary: toBooleanRt, transactionType: t.string, latencyAggregationType: latencyAggregationTypeRt, @@ -106,6 +107,7 @@ const transactionGroupsMainStatisticsRoute = createApmServerRoute({ documentType, rollupInterval, useDurationSummary, + searchQuery, }, } = params; @@ -117,6 +119,7 @@ const transactionGroupsMainStatisticsRoute = createApmServerRoute({ latencyAggregationType, start, end, + searchQuery, }; const [serviceTransactionGroups, serviceTransactionGroupsAlerts] = @@ -134,11 +137,8 @@ const transactionGroupsMainStatisticsRoute = createApmServerRoute({ }), ]); - const { - transactionGroups, - maxTransactionGroupsExceeded, - transactionOverflowCount, - } = serviceTransactionGroups; + const { transactionGroups, maxCountExceeded, transactionOverflowCount } = + serviceTransactionGroups; const transactionGroupsWithAlerts = joinByKey( [...transactionGroups, ...serviceTransactionGroupsAlerts], @@ -147,7 +147,7 @@ const transactionGroupsMainStatisticsRoute = createApmServerRoute({ return { transactionGroups: transactionGroupsWithAlerts, - maxTransactionGroupsExceeded, + maxCountExceeded, transactionOverflowCount, hasActiveAlerts: !!serviceTransactionGroupsAlerts.length, }; diff --git a/x-pack/plugins/cases/public/components/all_cases/columns_popover.test.tsx b/x-pack/plugins/cases/public/components/all_cases/columns_popover.test.tsx index c6278187d960c..27f94319ecbcf 100644 --- a/x-pack/plugins/cases/public/components/all_cases/columns_popover.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/columns_popover.test.tsx @@ -8,6 +8,7 @@ import React from 'react'; import { screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { waitForEuiPopoverOpen } from '@elastic/eui/lib/test/rtl'; import type { AppMockRenderer } from '../../common/mock'; import { createAppMockRenderer } from '../../common/mock'; @@ -34,6 +35,8 @@ describe('ColumnsPopover', () => { userEvent.click(await screen.findByTestId('column-selection-popover-button')); + await waitForEuiPopoverOpen(); + expect(await screen.findByTestId('column-selection-popover')).toBeInTheDocument(); selectedColumns.forEach(({ field, name, isChecked }) => { @@ -132,6 +135,7 @@ describe('ColumnsPopover', () => { ); userEvent.click(await screen.findByTestId('column-selection-popover-button')); + await waitForEuiPopoverOpen(); userEvent.paste(await screen.findByTestId('column-selection-popover-search'), 'Title'); expect(await screen.findByTestId('column-selection-switch-title')).toBeInTheDocument(); @@ -150,9 +154,12 @@ describe('ColumnsPopover', () => { ); userEvent.click(await screen.findByTestId('column-selection-popover-button')); + await waitForEuiPopoverOpen(); userEvent.paste(await screen.findByTestId('column-selection-popover-search'), 'Category'); - expect(onSelectedColumnsChange).not.toHaveBeenCalled(); + await waitFor(() => { + expect(onSelectedColumnsChange).not.toHaveBeenCalled(); + }); }); it('searching for text hides the drag and drop icons', async () => { @@ -177,6 +184,9 @@ describe('ColumnsPopover', () => { ); userEvent.click(await screen.findByTestId('column-selection-popover-button')); + + await waitForEuiPopoverOpen(); + userEvent.paste(await screen.findByTestId('column-selection-popover-search'), 'Foobar'); expect(await screen.findByTestId('column-selection-popover-show-all-button')).toBeDisabled(); diff --git a/x-pack/plugins/cases/public/components/create/owner_selector.test.tsx b/x-pack/plugins/cases/public/components/create/owner_selector.test.tsx index cd9515edbd28c..94ce019498078 100644 --- a/x-pack/plugins/cases/public/components/create/owner_selector.test.tsx +++ b/x-pack/plugins/cases/public/components/create/owner_selector.test.tsx @@ -18,7 +18,8 @@ import type { FormProps } from './schema'; import { schema } from './schema'; import { waitForComponentToPaint } from '../../common/test_utils'; -describe('Case Owner Selection', () => { +// FLAKY: https://github.com/elastic/kibana/issues/175570 +describe.skip('Case Owner Selection', () => { let globalForm: FormHook; const MockHookWrapperComponent: React.FC = ({ children }) => { diff --git a/x-pack/plugins/cases/public/components/user_actions/property_actions/alert_property_actions.test.tsx b/x-pack/plugins/cases/public/components/user_actions/property_actions/alert_property_actions.test.tsx index ae0d7e39d5e1b..63c7ea95d8d9a 100644 --- a/x-pack/plugins/cases/public/components/user_actions/property_actions/alert_property_actions.test.tsx +++ b/x-pack/plugins/cases/public/components/user_actions/property_actions/alert_property_actions.test.tsx @@ -17,7 +17,8 @@ import { } from '../../../common/mock'; import { AlertPropertyActions } from './alert_property_actions'; -describe('AlertPropertyActions', () => { +// FLAKY: https://github.com/elastic/kibana/issues/174667 +describe.skip('AlertPropertyActions', () => { let appMock: AppMockRenderer; const props = { diff --git a/x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.tsx b/x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.tsx index b2a79710d09a2..f0d5d64edab67 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.tsx @@ -16,7 +16,7 @@ import { useFetchDetectionRulesAlertsStatus } from '../common/api/use_fetch_dete import { useFetchDetectionRulesByTags } from '../common/api/use_fetch_detection_rules_by_tags'; import { RuleResponse } from '../common/types'; import { useKibana } from '../common/hooks/use_kibana'; -import { showSuccessToast } from './take_action'; +import { showCreateDetectionRuleSuccessToast } from './take_action'; import { DETECTION_ENGINE_ALERTS_KEY, DETECTION_ENGINE_RULES_KEY } from '../common/constants'; const RULES_PAGE_PATH = '/rules/management'; @@ -61,7 +61,7 @@ export const DetectionRuleCounter = ({ tags, createRuleFn }: DetectionRuleCounte setIsCreateRuleLoading(true); const ruleResponse = await createRuleFn(http); setIsCreateRuleLoading(false); - showSuccessToast(notifications, http, ruleResponse); + showCreateDetectionRuleSuccessToast(notifications, http, ruleResponse); // Triggering a refetch of rules and alerts to update the UI queryClient.invalidateQueries([DETECTION_ENGINE_RULES_KEY]); queryClient.invalidateQueries([DETECTION_ENGINE_ALERTS_KEY]); diff --git a/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx b/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx index f72a4f7114be3..caf7f34651997 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx @@ -19,7 +19,7 @@ import { import { toMountPoint } from '@kbn/kibana-react-plugin/public'; import type { HttpSetup, NotificationsStart } from '@kbn/core/public'; import { FormattedMessage } from '@kbn/i18n-react'; -import { useQueryClient } from '@tanstack/react-query'; +import { QueryClient, useQueryClient } from '@tanstack/react-query'; import type { RuleResponse } from '../common/types'; import { CREATE_RULE_ACTION_SUBJ, TAKE_ACTION_SUBJ } from './test_subjects'; import { useKibana } from '../common/hooks/use_kibana'; @@ -28,10 +28,12 @@ import { DETECTION_ENGINE_ALERTS_KEY, DETECTION_ENGINE_RULES_KEY } from '../comm const RULE_PAGE_PATH = '/app/security/rules/id/'; interface TakeActionProps { - createRuleFn: (http: HttpSetup) => Promise; + createRuleFn?: (http: HttpSetup) => Promise; + enableBenchmarkRuleFn?: () => Promise; + disableBenchmarkRuleFn?: () => Promise; } -export const showSuccessToast = ( +export const showCreateDetectionRuleSuccessToast = ( notifications: NotificationsStart, http: HttpSetup, ruleResponse: RuleResponse @@ -76,11 +78,64 @@ export const showSuccessToast = ( }); }; +export const showChangeBenchmarkRuleStatesSuccessToast = ( + notifications: NotificationsStart, + isBenchmarkRuleMuted: boolean +) => { + return notifications.toasts.addSuccess({ + toastLifeTimeMs: 10000, + color: 'success', + iconType: '', + 'data-test-subj': 'csp:toast-success-rule-state-change', + text: toMountPoint( +
+ + {isBenchmarkRuleMuted ? ( + <> + + + + + + + + ) : ( + <> + + + + + + + + )} + +
+ ), + }); +}; + /* * This component is used to create a detection rule from Flyout. * It accepts a createRuleFn parameter which is used to create a rule in a generic way. */ -export const TakeAction = ({ createRuleFn }: TakeActionProps) => { +export const TakeAction = ({ + createRuleFn, + enableBenchmarkRuleFn, + disableBenchmarkRuleFn, +}: TakeActionProps) => { const queryClient = useQueryClient(); const [isPopoverOpen, setPopoverOpen] = useState(false); const [isLoading, setIsLoading] = useState(false); @@ -105,6 +160,44 @@ export const TakeAction = ({ createRuleFn }: TakeActionProps) => { ); + const actionsItems = []; + + if (createRuleFn) + actionsItems.push( + + ); + if (enableBenchmarkRuleFn) + actionsItems.push( + + ); + if (disableBenchmarkRuleFn) + actionsItems.push( + + ); return ( { anchorPosition="downLeft" data-test-subj={TAKE_ACTION_SUBJ} > - { - closePopover(); - setIsLoading(true); - const ruleResponse = await createRuleFn(http); - setIsLoading(false); - showSuccessToast(notifications, http, ruleResponse); - // Triggering a refetch of rules and alerts to update the UI - queryClient.invalidateQueries([DETECTION_ENGINE_RULES_KEY]); - queryClient.invalidateQueries([DETECTION_ENGINE_ALERTS_KEY]); - }} - data-test-subj={CREATE_RULE_ACTION_SUBJ} - > - - , - ]} - /> + ); }; + +const CreateDetectionRule = ({ + createRuleFn, + setIsLoading, + closePopover, + notifications, + http, + queryClient, +}: { + createRuleFn: (http: HttpSetup) => Promise; + setIsLoading: (isLoading: boolean) => void; + closePopover: () => void; + notifications: NotificationsStart; + http: HttpSetup; + queryClient: QueryClient; +}) => { + return ( + { + closePopover(); + setIsLoading(true); + const ruleResponse = await createRuleFn(http); + setIsLoading(false); + showCreateDetectionRuleSuccessToast(notifications, http, ruleResponse); + // Triggering a refetch of rules and alerts to update the UI + queryClient.invalidateQueries([DETECTION_ENGINE_RULES_KEY]); + queryClient.invalidateQueries([DETECTION_ENGINE_ALERTS_KEY]); + }} + data-test-subj={CREATE_RULE_ACTION_SUBJ} + > + + + ); +}; + +const EnableBenchmarkRule = ({ + enableBenchmarkRuleFn, + setIsLoading, + closePopover, + notifications, +}: { + enableBenchmarkRuleFn: () => Promise; + setIsLoading: (isLoading: boolean) => void; + closePopover: () => void; + notifications: NotificationsStart; + http: HttpSetup; + queryClient: QueryClient; +}) => { + return ( + { + closePopover(); + setIsLoading(true); + await enableBenchmarkRuleFn(); + setIsLoading(false); + }} + data-test-subj={'enable-benchmark-rule-take-action-button'} + > + + + ); +}; + +const DisableBenchmarkRule = ({ + disableBenchmarkRuleFn, + setIsLoading, + closePopover, + notifications, +}: { + disableBenchmarkRuleFn: () => Promise; + setIsLoading: (isLoading: boolean) => void; + closePopover: () => void; + notifications: NotificationsStart; + http: HttpSetup; + queryClient: QueryClient; +}) => { + return ( + { + closePopover(); + setIsLoading(true); + await disableBenchmarkRuleFn(); + setIsLoading(false); + }} + data-test-subj={'disable-benchmark-rule-take-action-button'} + > + + + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.test.tsx b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.test.tsx index dfc8dac21ea15..421c53726371f 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.test.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.test.tsx @@ -85,6 +85,8 @@ const params = { ruleNumber: undefined, search: '', section: undefined, + sortField: 'metadata.benchmark.rule_number', + sortOrder: 'asc', }, benchmarkId: 'cis_k8s', benchmarkVersion: '1.0.1', diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.tsx b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.tsx index e0017fa7a54e1..7fb1fb3a58f55 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.tsx @@ -77,6 +77,8 @@ export const RulesContainer = () => { search: '', page: 0, perPage: pageSize || 10, + sortField: 'metadata.benchmark.rule_number', + sortOrder: 'asc', }); const { data, status, error } = useFindCspBenchmarkRule( @@ -86,6 +88,8 @@ export const RulesContainer = () => { search: rulesQuery.search, page: 1, perPage: MAX_ITEMS_PER_PAGE, + sortField: 'metadata.benchmark.rule_number', + sortOrder: 'asc', }, params.benchmarkId, params.benchmarkVersion @@ -96,6 +100,8 @@ export const RulesContainer = () => { { page: 1, perPage: MAX_ITEMS_PER_PAGE, + sortField: 'metadata.benchmark.rule_number', + sortOrder: 'asc', }, params.benchmarkId, params.benchmarkVersion diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_flyout.tsx b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_flyout.tsx index 228785e0cb61d..dbfcb6df75a98 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_flyout.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_flyout.tsx @@ -6,7 +6,6 @@ */ import React, { useState } from 'react'; import { - EuiSpacer, EuiFlyout, EuiFlyoutHeader, EuiFlyoutBody, @@ -17,9 +16,9 @@ import { EuiFlexItem, EuiFlexGroup, EuiSwitch, + EuiFlyoutFooter, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; import { CspBenchmarkRuleMetadata } from '../../../common/types/latest'; import { getRuleList } from '../configurations/findings_flyout/rule_tab'; @@ -27,6 +26,9 @@ import { getRemediationList } from '../configurations/findings_flyout/overview_t import * as TEST_SUBJECTS from './test_subjects'; import { useChangeCspRuleState } from './change_csp_rule_state'; import { CspBenchmarkRulesWithStates } from './rules_container'; +import { TakeAction } from '../../components/take_action'; + +export const RULES_FLYOUT_SWITCH_BUTTON = 'rule-flyout-switch-button'; interface RuleFlyoutProps { onClose(): void; @@ -82,27 +84,6 @@ export const RuleFlyout = ({ onClose, rule, refetchRulesStates }: RuleFlyoutProp

{rule.metadata.name}

- - - ) : ( - - ) - } - /> - {tabs.map((item) => ( - {tab === 'overview' && } + {tab === 'overview' && ( + + )} {tab === 'remediation' && ( )} + + + + {isRuleMuted ? ( + + ) : ( + + )} + + + ); }; -const RuleOverviewTab = ({ rule }: { rule: CspBenchmarkRuleMetadata }) => ( +const RuleOverviewTab = ({ + rule, + ruleData, + switchRuleStates, +}: { + rule: CspBenchmarkRuleMetadata; + ruleData: CspBenchmarkRulesWithStates; + switchRuleStates: () => Promise; +}) => ( - + ); + +const ruleState = (rule: CspBenchmarkRulesWithStates, switchRuleStates: () => Promise) => [ + { + title: i18n.translate('xpack.csp.rules.rulesFlyout.ruleState', { + defaultMessage: 'Enabled', + }), + description: ( + <> + + + ), + }, +]; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_benchmark_rules.ts b/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_benchmark_rules.ts index d1a677e4e5182..d580a7719ed0a 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_benchmark_rules.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_benchmark_rules.ts @@ -18,12 +18,12 @@ import { export type RulesQuery = Pick< FindCspBenchmarkRuleRequest, - 'section' | 'search' | 'page' | 'perPage' | 'ruleNumber' + 'section' | 'search' | 'page' | 'perPage' | 'ruleNumber' | 'sortField' | 'sortOrder' >; export type RulesQueryResult = ReturnType; export const useFindCspBenchmarkRule = ( - { search, page, perPage, section, ruleNumber }: RulesQuery, + { search, page, perPage, section, ruleNumber, sortField, sortOrder }: RulesQuery, benchmarkId: string, benchmarkVersion?: string ) => { @@ -32,11 +32,31 @@ export const useFindCspBenchmarkRule = ( return useQuery( [ CSP_BENCHMARK_RULE_SAVED_OBJECT_TYPE, - { section, search, page, perPage, benchmarkId, benchmarkVersion, ruleNumber }, + { + section, + search, + page, + perPage, + benchmarkId, + benchmarkVersion, + ruleNumber, + sortField, + sortOrder, + }, ], () => { return http.get(FIND_CSP_BENCHMARK_RULE_ROUTE_PATH, { - query: { benchmarkId, page, perPage, search, section, benchmarkVersion, ruleNumber }, + query: { + benchmarkId, + page, + perPage, + search, + section, + benchmarkVersion, + ruleNumber, + sortField, + sortOrder, + }, version: '3', }); } diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/utils.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/utils.ts index 0601a4eb25577..2f57dc40ca5f9 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/utils.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/utils.ts @@ -24,7 +24,10 @@ export const getSortedCspBenchmarkRulesTemplates = (cspBenchmarkRules: CspBenchm if (versionA !== null && versionB !== null) { return semverCompare(versionA, versionB); } else { - return String(ruleNumberA).localeCompare(String(ruleNumberB)); + return String(ruleNumberA).localeCompare(String(ruleNumberB), undefined, { + numeric: true, + sensitivity: 'base', + }); } }); }; diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v3.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v3.ts index 6cf4efd5705a0..dff6cd3add966 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v3.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v3.ts @@ -50,7 +50,10 @@ export const findBenchmarkRuleHandler = async ( const sortedCspBenchmarkRules = getSortedCspBenchmarkRulesTemplates(cspBenchmarkRules); return { - items: sortedCspBenchmarkRules, + items: + options.sortField === 'metadata.benchmark.rule_number' + ? sortedCspBenchmarkRules + : cspBenchmarkRules, total: cspCspBenchmarkRulesSo.total, page: options.page, perPage: options.perPage, diff --git a/x-pack/plugins/elastic_assistant/server/__mocks__/request.ts b/x-pack/plugins/elastic_assistant/server/__mocks__/request.ts index 930374567533b..3551ef6b126c3 100644 --- a/x-pack/plugins/elastic_assistant/server/__mocks__/request.ts +++ b/x-pack/plugins/elastic_assistant/server/__mocks__/request.ts @@ -7,9 +7,9 @@ import { httpServerMock } from '@kbn/core/server/mocks'; import { CAPABILITIES, EVALUATE, KNOWLEDGE_BASE } from '../../common/constants'; import { - PostEvaluateBodyInputs, - PostEvaluatePathQueryInputs, -} from '../schemas/evaluate/post_evaluate'; + PostEvaluateRequestBodyInput, + PostEvaluateRequestQueryInput, +} from '@kbn/elastic-assistant-common'; export const requestMock = { create: httpServerMock.createKibanaRequest, @@ -46,8 +46,8 @@ export const getPostEvaluateRequest = ({ body, query, }: { - body: PostEvaluateBodyInputs; - query: PostEvaluatePathQueryInputs; + body: PostEvaluateRequestBodyInput; + query: PostEvaluateRequestQueryInput; }) => requestMock.create({ body, diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/index.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/index.ts new file mode 100644 index 0000000000000..b36081ce4bead --- /dev/null +++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/index.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { AgentExecutor } from './types'; +import { callAgentExecutor } from '../execute_custom_llm_chain'; +import { callOpenAIFunctionsExecutor } from './openai_functions_executor'; + +/** + * To support additional Agent Executors from the UI, add them to this map + * and reference your specific AgentExecutor function + */ +export const AGENT_EXECUTOR_MAP: Record = { + DefaultAgentExecutor: callAgentExecutor, + OpenAIFunctionsExecutor: callOpenAIFunctionsExecutor, +}; diff --git a/x-pack/plugins/elastic_assistant/server/lib/model_evaluator/evaluation.ts b/x-pack/plugins/elastic_assistant/server/lib/model_evaluator/evaluation.ts index 54040d3d1b58e..291aa9d8c2519 100644 --- a/x-pack/plugins/elastic_assistant/server/lib/model_evaluator/evaluation.ts +++ b/x-pack/plugins/elastic_assistant/server/lib/model_evaluator/evaluation.ts @@ -12,8 +12,8 @@ import { chunk as createChunks } from 'lodash/fp'; import { Logger } from '@kbn/core/server'; import { ToolingLog } from '@kbn/tooling-log'; import { LangChainTracer, RunCollectorCallbackHandler } from 'langchain/callbacks'; +import { Dataset } from '@kbn/elastic-assistant-common'; import { AgentExecutorEvaluatorWithMetadata } from '../langchain/executors/types'; -import { Dataset } from '../../schemas/evaluate/post_evaluate'; import { callAgentWithRetry, getMessageFromLangChainResponse } from './utils'; import { ResponseBody } from '../langchain/types'; import { isLangSmithEnabled, writeLangSmithFeedback } from '../../routes/evaluate/utils'; @@ -102,7 +102,6 @@ export const performEvaluation = async ({ const chunk = requestChunks.shift() ?? []; const chunkNumber = totalChunks - requestChunks.length; logger.info(`Prediction request chunk: ${chunkNumber} of ${totalChunks}`); - logger.debug(chunk); // Note, order is kept between chunk and dataset, and is preserved w/ Promise.allSettled const chunkResults = await Promise.allSettled(chunk.map((r) => r.request())); diff --git a/x-pack/plugins/elastic_assistant/server/plugin.ts b/x-pack/plugins/elastic_assistant/server/plugin.ts index bbc2c63381fc9..eec0a08ccb8cd 100755 --- a/x-pack/plugins/elastic_assistant/server/plugin.ts +++ b/x-pack/plugins/elastic_assistant/server/plugin.ts @@ -43,6 +43,7 @@ import { GetRegisteredTools, } from './services/app_context'; import { getCapabilitiesRoute } from './routes/capabilities/get_capabilities_route'; +import { getEvaluateRoute } from './routes/evaluate/get_evaluate'; interface CreateRouteHandlerContextParams { core: CoreSetup; @@ -124,6 +125,7 @@ export class ElasticAssistantPlugin postActionsConnectorExecuteRoute(router, getElserId); // Evaluate postEvaluateRoute(router, getElserId); + getEvaluateRoute(router); // Capabilities getCapabilitiesRoute(router); return { diff --git a/x-pack/plugins/elastic_assistant/server/routes/capabilities/get_capabilities_route.ts b/x-pack/plugins/elastic_assistant/server/routes/capabilities/get_capabilities_route.ts index 105e1676fb808..7c470cdfc2d94 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/capabilities/get_capabilities_route.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/capabilities/get_capabilities_route.ts @@ -8,12 +8,17 @@ import { IKibanaResponse, IRouter } from '@kbn/core/server'; import { transformError } from '@kbn/securitysolution-es-utils'; -import type { GetCapabilitiesResponse } from '@kbn/elastic-assistant-common'; +import { + API_VERSIONS, + GetCapabilitiesResponse, + INTERNAL_API_ACCESS, +} from '@kbn/elastic-assistant-common'; import { CAPABILITIES } from '../../../common/constants'; import { ElasticAssistantRequestHandlerContext } from '../../types'; import { buildResponse } from '../../lib/build_response'; import { DEFAULT_PLUGIN_NAME, getPluginNameFromRequest } from '../helpers'; +import { buildRouteValidationWithZod } from '../../schemas/common'; /** * Get the assistant capabilities for the requesting plugin @@ -23,7 +28,7 @@ import { DEFAULT_PLUGIN_NAME, getPluginNameFromRequest } from '../helpers'; export const getCapabilitiesRoute = (router: IRouter) => { router.versioned .get({ - access: 'internal', + access: INTERNAL_API_ACCESS, path: CAPABILITIES, options: { tags: ['access:elasticAssistant'], @@ -31,8 +36,14 @@ export const getCapabilitiesRoute = (router: IRouter> => { const resp = buildResponse(response); diff --git a/x-pack/plugins/elastic_assistant/server/routes/evaluate/get_evaluate.ts b/x-pack/plugins/elastic_assistant/server/routes/evaluate/get_evaluate.ts new file mode 100644 index 0000000000000..bc9922ef5f35a --- /dev/null +++ b/x-pack/plugins/elastic_assistant/server/routes/evaluate/get_evaluate.ts @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { type IKibanaResponse, IRouter } from '@kbn/core/server'; +import { transformError } from '@kbn/securitysolution-es-utils'; + +import { + API_VERSIONS, + INTERNAL_API_ACCESS, + GetEvaluateResponse, +} from '@kbn/elastic-assistant-common'; +import { buildResponse } from '../../lib/build_response'; +import { ElasticAssistantRequestHandlerContext } from '../../types'; +import { EVALUATE } from '../../../common/constants'; +import { DEFAULT_PLUGIN_NAME, getPluginNameFromRequest } from '../helpers'; +import { buildRouteValidationWithZod } from '../../schemas/common'; +import { AGENT_EXECUTOR_MAP } from '../../lib/langchain/executors'; + +export const getEvaluateRoute = (router: IRouter) => { + router.versioned + .get({ + access: INTERNAL_API_ACCESS, + path: EVALUATE, + options: { + tags: ['access:elasticAssistant'], + }, + }) + .addVersion( + { + version: API_VERSIONS.internal.v1, + validate: { + response: { + 200: { + body: buildRouteValidationWithZod(GetEvaluateResponse), + }, + }, + }, + }, + async (context, request, response): Promise> => { + const assistantContext = await context.elasticAssistant; + const logger = assistantContext.logger; + + // Validate evaluation feature is enabled + const pluginName = getPluginNameFromRequest({ + request, + defaultPluginName: DEFAULT_PLUGIN_NAME, + logger, + }); + const registeredFeatures = assistantContext.getRegisteredFeatures(pluginName); + if (!registeredFeatures.assistantModelEvaluation) { + return response.notFound(); + } + + try { + return response.ok({ body: { agentExecutors: Object.keys(AGENT_EXECUTOR_MAP) } }); + } catch (err) { + logger.error(err); + const error = transformError(err); + + const resp = buildResponse(response); + return resp.error({ + body: { error: error.message }, + statusCode: error.statusCode, + }); + } + } + ); +}; diff --git a/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.test.ts b/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.test.ts index 3ae64f1d89f3b..64ec69fa5e943 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.test.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.test.ts @@ -9,17 +9,17 @@ import { postEvaluateRoute } from './post_evaluate'; import { serverMock } from '../../__mocks__/server'; import { requestContextMock } from '../../__mocks__/request_context'; import { getPostEvaluateRequest } from '../../__mocks__/request'; -import { - PostEvaluateBodyInputs, - PostEvaluatePathQueryInputs, -} from '../../schemas/evaluate/post_evaluate'; +import type { + PostEvaluateRequestBodyInput, + PostEvaluateRequestQueryInput, +} from '@kbn/elastic-assistant-common'; -const defaultBody: PostEvaluateBodyInputs = { +const defaultBody: PostEvaluateRequestBodyInput = { dataset: undefined, evalPrompt: undefined, }; -const defaultQueryParams: PostEvaluatePathQueryInputs = { +const defaultQueryParams: PostEvaluateRequestQueryInput = { agents: 'agents', datasetName: undefined, evaluationType: undefined, diff --git a/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.ts b/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.ts index aa041175b75ee..33d19d6fb61e0 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/evaluate/post_evaluate.ts @@ -5,23 +5,23 @@ * 2.0. */ -import { IRouter, KibanaRequest } from '@kbn/core/server'; +import { type IKibanaResponse, IRouter, KibanaRequest } from '@kbn/core/server'; import { transformError } from '@kbn/securitysolution-es-utils'; import { v4 as uuidv4 } from 'uuid'; +import { + API_VERSIONS, + INTERNAL_API_ACCESS, + PostEvaluateBody, + PostEvaluateRequestQuery, + PostEvaluateResponse, +} from '@kbn/elastic-assistant-common'; import { ESQL_RESOURCE } from '../knowledge_base/constants'; import { buildResponse } from '../../lib/build_response'; -import { buildRouteValidation } from '../../schemas/common'; import { ElasticAssistantRequestHandlerContext, GetElser } from '../../types'; import { EVALUATE } from '../../../common/constants'; -import { PostEvaluateBody, PostEvaluatePathQuery } from '../../schemas/evaluate/post_evaluate'; import { performEvaluation } from '../../lib/model_evaluator/evaluation'; -import { callAgentExecutor } from '../../lib/langchain/execute_custom_llm_chain'; -import { callOpenAIFunctionsExecutor } from '../../lib/langchain/executors/openai_functions_executor'; -import { - AgentExecutor, - AgentExecutorEvaluatorWithMetadata, -} from '../../lib/langchain/executors/types'; +import { AgentExecutorEvaluatorWithMetadata } from '../../lib/langchain/executors/types'; import { ActionsClientLlm } from '../../lib/langchain/llm/actions_client_llm'; import { indexEvaluations, @@ -30,15 +30,8 @@ import { import { fetchLangSmithDataset, getConnectorName, getLangSmithTracer, getLlmType } from './utils'; import { RequestBody } from '../../lib/langchain/types'; import { DEFAULT_PLUGIN_NAME, getPluginNameFromRequest } from '../helpers'; - -/** - * To support additional Agent Executors from the UI, add them to this map - * and reference your specific AgentExecutor function - */ -const AGENT_EXECUTOR_MAP: Record = { - DefaultAgentExecutor: callAgentExecutor, - OpenAIFunctionsExecutor: callOpenAIFunctionsExecutor, -}; +import { buildRouteValidationWithZod } from '../../schemas/common'; +import { AGENT_EXECUTOR_MAP } from '../../lib/langchain/executors'; const DEFAULT_SIZE = 20; @@ -46,200 +39,215 @@ export const postEvaluateRoute = ( router: IRouter, getElser: GetElser ) => { - router.post( - { + router.versioned + .post({ + access: INTERNAL_API_ACCESS, path: EVALUATE, - validate: { - body: buildRouteValidation(PostEvaluateBody), - query: buildRouteValidation(PostEvaluatePathQuery), + options: { + tags: ['access:elasticAssistant'], }, - }, - async (context, request, response) => { - const assistantContext = await context.elasticAssistant; - const logger = assistantContext.logger; - const telemetry = assistantContext.telemetry; - - // Validate evaluation feature is enabled - const pluginName = getPluginNameFromRequest({ - request, - defaultPluginName: DEFAULT_PLUGIN_NAME, - logger, - }); - const registeredFeatures = assistantContext.getRegisteredFeatures(pluginName); - if (!registeredFeatures.assistantModelEvaluation) { - return response.notFound(); - } - - try { - const evaluationId = uuidv4(); - const { - evalModel, - evaluationType, - outputIndex, - datasetName, - projectName = 'default', - runName = evaluationId, - } = request.query; - const { dataset: customDataset = [], evalPrompt } = request.body; - const connectorIds = request.query.models?.split(',') || []; - const agentNames = request.query.agents?.split(',') || []; - - const dataset = - datasetName != null ? await fetchLangSmithDataset(datasetName, logger) : customDataset; - - logger.info('postEvaluateRoute:'); - logger.info(`request.query:\n${JSON.stringify(request.query, null, 2)}`); - logger.info(`request.body:\n${JSON.stringify(request.body, null, 2)}`); - logger.info(`Evaluation ID: ${evaluationId}`); - - const totalExecutions = connectorIds.length * agentNames.length * dataset.length; - logger.info('Creating agents:'); - logger.info(`\tconnectors/models: ${connectorIds.length}`); - logger.info(`\tagents: ${agentNames.length}`); - logger.info(`\tdataset: ${dataset.length}`); - logger.warn(`\ttotal baseline agent executions: ${totalExecutions} `); - if (totalExecutions > 50) { - logger.warn( - `Total baseline agent executions >= 50! This may take a while, and cost some money...` - ); + }) + .addVersion( + { + version: API_VERSIONS.internal.v1, + validate: { + request: { + body: buildRouteValidationWithZod(PostEvaluateBody), + query: buildRouteValidationWithZod(PostEvaluateRequestQuery), + }, + response: { + 200: { + body: buildRouteValidationWithZod(PostEvaluateResponse), + }, + }, + }, + }, + async (context, request, response): Promise> => { + const assistantContext = await context.elasticAssistant; + const logger = assistantContext.logger; + const telemetry = assistantContext.telemetry; + + // Validate evaluation feature is enabled + const pluginName = getPluginNameFromRequest({ + request, + defaultPluginName: DEFAULT_PLUGIN_NAME, + logger, + }); + const registeredFeatures = assistantContext.getRegisteredFeatures(pluginName); + if (!registeredFeatures.assistantModelEvaluation) { + return response.notFound(); } - // Get the actions plugin start contract from the request context for the agents - const actions = (await context.elasticAssistant).actions; + try { + const evaluationId = uuidv4(); + const { + evalModel, + evaluationType, + outputIndex, + datasetName, + projectName = 'default', + runName = evaluationId, + } = request.query; + const { dataset: customDataset = [], evalPrompt } = request.body; + const connectorIds = request.query.models?.split(',') || []; + const agentNames = request.query.agents?.split(',') || []; + + const dataset = + datasetName != null ? await fetchLangSmithDataset(datasetName, logger) : customDataset; + + logger.info('postEvaluateRoute:'); + logger.info(`request.query:\n${JSON.stringify(request.query, null, 2)}`); + logger.info(`request.body:\n${JSON.stringify(request.body, null, 2)}`); + logger.info(`Evaluation ID: ${evaluationId}`); + + const totalExecutions = connectorIds.length * agentNames.length * dataset.length; + logger.info('Creating agents:'); + logger.info(`\tconnectors/models: ${connectorIds.length}`); + logger.info(`\tagents: ${agentNames.length}`); + logger.info(`\tdataset: ${dataset.length}`); + logger.warn(`\ttotal baseline agent executions: ${totalExecutions} `); + if (totalExecutions > 50) { + logger.warn( + `Total baseline agent executions >= 50! This may take a while, and cost some money...` + ); + } + + // Get the actions plugin start contract from the request context for the agents + const actions = (await context.elasticAssistant).actions; + + // Fetch all connectors from the actions plugin, so we can set the appropriate `llmType` on ActionsClientLlm + const actionsClient = await actions.getActionsClientWithRequest(request); + const connectors = await actionsClient.getBulk({ + ids: connectorIds, + throwIfSystemAction: false, + }); - // Fetch all connectors from the actions plugin, so we can set the appropriate `llmType` on ActionsClientLlm - const actionsClient = await actions.getActionsClientWithRequest(request); - const connectors = await actionsClient.getBulk({ - ids: connectorIds, - throwIfSystemAction: false, - }); + // Fetch any tools registered by the request's originating plugin + const assistantTools = (await context.elasticAssistant).getRegisteredTools( + 'securitySolution' + ); - // Fetch any tools registered by the request's originating plugin - const assistantTools = (await context.elasticAssistant).getRegisteredTools( - 'securitySolution' - ); - - // Get a scoped esClient for passing to the agents for retrieval, and - // writing results to the output index - const esClient = (await context.core).elasticsearch.client.asCurrentUser; - - // Default ELSER model - const elserId = await getElser(request, (await context.core).savedObjects.getClient()); - - // Skeleton request from route to pass to the agents - // params will be passed to the actions executor - const skeletonRequest: KibanaRequest = { - ...request, - body: { - alertsIndexPattern: '', - allow: [], - allowReplacement: [], - params: { - subAction: 'invokeAI', - subActionParams: { - messages: [], + // Get a scoped esClient for passing to the agents for retrieval, and + // writing results to the output index + const esClient = (await context.core).elasticsearch.client.asCurrentUser; + + // Default ELSER model + const elserId = await getElser(request, (await context.core).savedObjects.getClient()); + + // Skeleton request from route to pass to the agents + // params will be passed to the actions executor + const skeletonRequest: KibanaRequest = { + ...request, + body: { + alertsIndexPattern: '', + allow: [], + allowReplacement: [], + params: { + subAction: 'invokeAI', + subActionParams: { + messages: [], + }, }, + replacements: {}, + size: DEFAULT_SIZE, + isEnabledKnowledgeBase: true, + isEnabledRAGAlerts: true, }, - replacements: {}, - size: DEFAULT_SIZE, - isEnabledKnowledgeBase: true, - isEnabledRAGAlerts: true, - }, - }; - - // Create an array of executor functions to call in batches - // One for each connector/model + agent combination - // Hoist `langChainMessages` so they can be batched by dataset.input in the evaluator - const agents: AgentExecutorEvaluatorWithMetadata[] = []; - connectorIds.forEach((connectorId) => { - agentNames.forEach((agentName) => { - logger.info(`Creating agent: ${connectorId} + ${agentName}`); - const llmType = getLlmType(connectorId, connectors); - const connectorName = - getConnectorName(connectorId, connectors) ?? '[unknown connector]'; - const detailedRunName = `${runName} - ${connectorName} + ${agentName}`; - agents.push({ - agentEvaluator: (langChainMessages, exampleId) => - AGENT_EXECUTOR_MAP[agentName]({ - actions, - isEnabledKnowledgeBase: true, - assistantTools, - connectorId, - esClient, - elserId, - langChainMessages, - llmType, - logger, - request: skeletonRequest, - kbResource: ESQL_RESOURCE, - telemetry, - traceOptions: { - exampleId, - projectName, - runName: detailedRunName, - evaluationId, - tags: [ - 'security-assistant-prediction', - ...(connectorName != null ? [connectorName] : []), - runName, - ], - tracers: getLangSmithTracer(detailedRunName, exampleId, logger), - }, - }), - metadata: { - connectorName, - runName: detailedRunName, - }, + }; + + // Create an array of executor functions to call in batches + // One for each connector/model + agent combination + // Hoist `langChainMessages` so they can be batched by dataset.input in the evaluator + const agents: AgentExecutorEvaluatorWithMetadata[] = []; + connectorIds.forEach((connectorId) => { + agentNames.forEach((agentName) => { + logger.info(`Creating agent: ${connectorId} + ${agentName}`); + const llmType = getLlmType(connectorId, connectors); + const connectorName = + getConnectorName(connectorId, connectors) ?? '[unknown connector]'; + const detailedRunName = `${runName} - ${connectorName} + ${agentName}`; + agents.push({ + agentEvaluator: (langChainMessages, exampleId) => + AGENT_EXECUTOR_MAP[agentName]({ + actions, + isEnabledKnowledgeBase: true, + assistantTools, + connectorId, + esClient, + elserId, + langChainMessages, + llmType, + logger, + request: skeletonRequest, + kbResource: ESQL_RESOURCE, + telemetry, + traceOptions: { + exampleId, + projectName, + runName: detailedRunName, + evaluationId, + tags: [ + 'security-assistant-prediction', + ...(connectorName != null ? [connectorName] : []), + runName, + ], + tracers: getLangSmithTracer(detailedRunName, exampleId, logger), + }, + }), + metadata: { + connectorName, + runName: detailedRunName, + }, + }); }); }); - }); - logger.info(`Agents created: ${agents.length}`); - - // Evaluator Model is optional to support just running predictions - const evaluatorModel = - evalModel == null || evalModel === '' - ? undefined - : new ActionsClientLlm({ - actions, - connectorId: evalModel, - request: skeletonRequest, - logger, - }); + logger.info(`Agents created: ${agents.length}`); - const { evaluationResults, evaluationSummary } = await performEvaluation({ - agentExecutorEvaluators: agents, - dataset, - evaluationId, - evaluatorModel, - evaluationPrompt: evalPrompt, - evaluationType, - logger, - runName, - }); + // Evaluator Model is optional to support just running predictions + const evaluatorModel = + evalModel == null || evalModel === '' + ? undefined + : new ActionsClientLlm({ + actions, + connectorId: evalModel, + request: skeletonRequest, + logger, + }); + + const { evaluationResults, evaluationSummary } = await performEvaluation({ + agentExecutorEvaluators: agents, + dataset, + evaluationId, + evaluatorModel, + evaluationPrompt: evalPrompt, + evaluationType, + logger, + runName, + }); - logger.info(`Writing evaluation results to index: ${outputIndex}`); - await setupEvaluationIndex({ esClient, index: outputIndex, logger }); - await indexEvaluations({ - esClient, - evaluationResults, - evaluationSummary, - index: outputIndex, - logger, - }); + logger.info(`Writing evaluation results to index: ${outputIndex}`); + await setupEvaluationIndex({ esClient, index: outputIndex, logger }); + await indexEvaluations({ + esClient, + evaluationResults, + evaluationSummary, + index: outputIndex, + logger, + }); - return response.ok({ - body: { evaluationId, success: true }, - }); - } catch (err) { - logger.error(err); - const error = transformError(err); - - const resp = buildResponse(response); - return resp.error({ - body: { success: false, error: error.message }, - statusCode: error.statusCode, - }); + return response.ok({ + body: { evaluationId, success: true }, + }); + } catch (err) { + logger.error(err); + const error = transformError(err); + + const resp = buildResponse(response); + return resp.error({ + body: { success: false, error: error.message }, + statusCode: error.statusCode, + }); + } } - } - ); + ); }; diff --git a/x-pack/plugins/elastic_assistant/server/routes/evaluate/utils.ts b/x-pack/plugins/elastic_assistant/server/routes/evaluate/utils.ts index 550e89667256e..11f8cb9c2f692 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/evaluate/utils.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/evaluate/utils.ts @@ -12,7 +12,7 @@ import type { Logger } from '@kbn/core/server'; import type { Run } from 'langsmith/schemas'; import { ToolingLog } from '@kbn/tooling-log'; import { LangChainTracer } from 'langchain/callbacks'; -import { Dataset } from '../../schemas/evaluate/post_evaluate'; +import { Dataset } from '@kbn/elastic-assistant-common'; /** * Returns the LangChain `llmType` for the given connectorId/connectors diff --git a/x-pack/plugins/elastic_assistant/server/schemas/common.ts b/x-pack/plugins/elastic_assistant/server/schemas/common.ts index 00e97a9326c5e..5e847aef69fc0 100644 --- a/x-pack/plugins/elastic_assistant/server/schemas/common.ts +++ b/x-pack/plugins/elastic_assistant/server/schemas/common.ts @@ -14,6 +14,8 @@ import type { RouteValidationResultFactory, RouteValidationError, } from '@kbn/core/server'; +import type { TypeOf, ZodType } from 'zod'; +import { stringifyZodError } from '@kbn/zod-helpers'; type RequestValidationResult = | { @@ -36,3 +38,14 @@ export const buildRouteValidation = (validatedInput: A) => validationResult.ok(validatedInput) ) ); + +export const buildRouteValidationWithZod = + >(schema: T): RouteValidationFunction => + (inputValue: unknown, validationResult: RouteValidationResultFactory) => { + const decoded = schema.safeParse(inputValue); + if (decoded.success) { + return validationResult.ok(decoded.data); + } else { + return validationResult.badRequest(stringifyZodError(decoded.error)); + } + }; diff --git a/x-pack/plugins/elastic_assistant/server/schemas/evaluate/post_evaluate.ts b/x-pack/plugins/elastic_assistant/server/schemas/evaluate/post_evaluate.ts deleted file mode 100644 index f520bf9bf93b6..0000000000000 --- a/x-pack/plugins/elastic_assistant/server/schemas/evaluate/post_evaluate.ts +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as t from 'io-ts'; - -/** Validates Output Index starts with `.kibana-elastic-ai-assistant-` */ -const outputIndex = new t.Type( - 'OutputIndexPrefixed', - (input): input is string => - typeof input === 'string' && input.startsWith('.kibana-elastic-ai-assistant-'), - (input, context) => - typeof input === 'string' && input.startsWith('.kibana-elastic-ai-assistant-') - ? t.success(input) - : t.failure( - input, - context, - `Type error: Output Index does not start with '.kibana-elastic-ai-assistant-'` - ), - t.identity -); - -/** Validates the URL path of a POST request to the `/evaluate` endpoint */ -export const PostEvaluatePathQuery = t.type({ - agents: t.string, - datasetName: t.union([t.string, t.undefined]), - evaluationType: t.union([t.string, t.undefined]), - evalModel: t.union([t.string, t.undefined]), - models: t.string, - outputIndex, - projectName: t.union([t.string, t.undefined]), - runName: t.union([t.string, t.undefined]), -}); - -export type PostEvaluatePathQueryInputs = t.TypeOf; - -export type DatasetItem = t.TypeOf; -export const DatasetItem = t.type({ - id: t.union([t.string, t.undefined]), - input: t.string, - reference: t.string, - tags: t.union([t.array(t.string), t.undefined]), - prediction: t.union([t.string, t.undefined]), -}); - -export type Dataset = t.TypeOf; -export const Dataset = t.array(DatasetItem); - -/** Validates the body of a POST request to the `/evaluate` endpoint */ -export const PostEvaluateBody = t.type({ - dataset: t.union([Dataset, t.undefined]), - evalPrompt: t.union([t.string, t.undefined]), -}); - -export type PostEvaluateBodyInputs = t.TypeOf; diff --git a/x-pack/plugins/elastic_assistant/tsconfig.json b/x-pack/plugins/elastic_assistant/tsconfig.json index dfca7893b2036..2717da8d33a3a 100644 --- a/x-pack/plugins/elastic_assistant/tsconfig.json +++ b/x-pack/plugins/elastic_assistant/tsconfig.json @@ -35,6 +35,7 @@ "@kbn/core-analytics-server", "@kbn/elastic-assistant-common", "@kbn/core-http-router-server-mocks", + "@kbn/zod-helpers", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/security_solution/public/timelines/store/epic_dispatcher_timeline_persistence_queue.ts b/x-pack/plugins/enterprise_search/common/types/connectors.ts similarity index 72% rename from x-pack/plugins/security_solution/public/timelines/store/epic_dispatcher_timeline_persistence_queue.ts rename to x-pack/plugins/enterprise_search/common/types/connectors.ts index 0c2af972aa08c..9af170e4dbdcd 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/epic_dispatcher_timeline_persistence_queue.ts +++ b/x-pack/plugins/enterprise_search/common/types/connectors.ts @@ -5,6 +5,6 @@ * 2.0. */ -import { Subject } from 'rxjs'; - -export const dispatcherTimelinePersistQueue = new Subject(); +export interface DeleteConnectorResponse { + acknowledge: boolean; +} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/delete_connector_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/delete_connector_api_logic.ts new file mode 100644 index 0000000000000..a427b634c3b6e --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/delete_connector_api_logic.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DeleteConnectorResponse } from '../../../../../common/types/connectors'; + +import { Actions, createApiLogic } from '../../../shared/api_logic/create_api_logic'; +import { HttpLogic } from '../../../shared/http'; + +export interface DeleteConnectorApiLogicArgs { + connectorId: string; + shouldDeleteIndex: boolean; +} + +export interface DeleteConnectorApiLogicResponse { + acknowledged: boolean; +} + +export const deleteConnector = async ({ + connectorId, + shouldDeleteIndex = false, +}: DeleteConnectorApiLogicArgs) => { + return await HttpLogic.values.http.delete( + `/internal/enterprise_search/connectors/${connectorId}`, + { + query: { + shouldDeleteIndex, + }, + } + ); +}; + +export const DeleteConnectorApiLogic = createApiLogic( + ['delete_connector_api_logic'], + deleteConnector +); + +export type DeleteConnectorApiLogicActions = Actions< + DeleteConnectorApiLogicArgs, + DeleteConnectorResponse +>; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors.tsx index 0d797329093c8..3519fc9e16086 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors.tsx @@ -42,6 +42,7 @@ import { ConnectorStats } from './connector_stats'; import { ConnectorsLogic } from './connectors_logic'; import { ConnectorsTable } from './connectors_table'; import { CrawlerEmptyState } from './crawler_empty_state'; +import { DeleteConnectorModal } from './delete_connector_modal'; export const baseBreadcrumbs = [ i18n.translate('xpack.enterpriseSearch.content.connectors.breadcrumb', { @@ -53,7 +54,8 @@ export interface ConnectorsProps { isCrawler: boolean; } export const Connectors: React.FC = ({ isCrawler }) => { - const { fetchConnectors, onPaginate, setIsFirstRequest } = useActions(ConnectorsLogic); + const { fetchConnectors, onPaginate, setIsFirstRequest, openDeleteModal } = + useActions(ConnectorsLogic); const { data, isLoading, searchParams, isEmpty, connectors } = useValues(ConnectorsLogic); const { errorConnectingMessage } = useValues(HttpLogic); const [searchQuery, setSearchValue] = useState(''); @@ -69,151 +71,158 @@ export const Connectors: React.FC = ({ isCrawler }) => { return !isLoading && isEmpty && !isCrawler ? ( ) : ( - { - KibanaLogic.values.navigateToUrl(NEW_INDEX_SELECT_CONNECTOR_PATH); - }} - > - - , - { - KibanaLogic.values.navigateToUrl(NEW_INDEX_SELECT_CONNECTOR_NATIVE_PATH); - }} - > - {i18n.translate('xpack.enterpriseSearch.connectors.newNativeConnectorButtonLabel', { - defaultMessage: 'New Native Connector', - })} - , - { - KibanaLogic.values.navigateToUrl(NEW_INDEX_SELECT_CONNECTOR_CLIENTS_PATH); - }} - > - {i18n.translate( - 'xpack.enterpriseSearch.connectors.newConnectorsClientButtonLabel', - { defaultMessage: 'New Connector Client' } - )} - , - ] - : [ - { - KibanaLogic.values.navigateToUrl( - generateEncodedPath(NEW_INDEX_METHOD_PATH, { - type: INGESTION_METHOD_IDS.CRAWLER, - }) - ); - }} - > - {i18n.translate('xpack.enterpriseSearch.connectors.newCrawlerButtonLabel', { - defaultMessage: 'New web crawler', - })} - , - ], - }} - > - {Boolean(errorConnectingMessage) && ( - <> - - - - )} - - - - - {isEmpty && isCrawler ? ( - - ) : ( - <> - - -

- {!isCrawler ? ( - - ) : ( - + <> + + { + KibanaLogic.values.navigateToUrl(NEW_INDEX_SELECT_CONNECTOR_PATH); + }} + > + + , + { + KibanaLogic.values.navigateToUrl(NEW_INDEX_SELECT_CONNECTOR_NATIVE_PATH); + }} + > + {i18n.translate( + 'xpack.enterpriseSearch.connectors.newNativeConnectorButtonLabel', + { + defaultMessage: 'New Native Connector', + } )} -

-
-
- - setSearchValue(event.queryText)} - /> - - + , + { + KibanaLogic.values.navigateToUrl(NEW_INDEX_SELECT_CONNECTOR_CLIENTS_PATH); + }} + > + {i18n.translate( + 'xpack.enterpriseSearch.connectors.newConnectorsClientButtonLabel', + { defaultMessage: 'New Connector Client' } + )} + , + ] + : [ + { + KibanaLogic.values.navigateToUrl( + generateEncodedPath(NEW_INDEX_METHOD_PATH, { + type: INGESTION_METHOD_IDS.CRAWLER, + }) + ); + }} + > + {i18n.translate('xpack.enterpriseSearch.connectors.newCrawlerButtonLabel', { + defaultMessage: 'New web crawler', + })} + , + ], + }} + > + {Boolean(errorConnectingMessage) && ( + <> + + )} -
-
+ + + + + {isEmpty && isCrawler ? ( + + ) : ( + <> + + +

+ {!isCrawler ? ( + + ) : ( + + )} +

+
+
+ + setSearchValue(event.queryText)} + /> + + + + )} +
+ + ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors_logic.ts index d4b6925ddade3..332b20d84928e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors_logic.ts @@ -12,6 +12,10 @@ import { Connector } from '@kbn/search-connectors/types'; import { Status } from '../../../../../common/types/api'; import { Meta } from '../../../../../common/types/pagination'; +import { + DeleteConnectorApiLogic, + DeleteConnectorApiLogicActions, +} from '../../api/connector/delete_connector_api_logic'; import { FetchConnectorsApiLogic, FetchConnectorsApiLogicActions, @@ -21,6 +25,10 @@ export type ConnectorViewItem = Connector & { docsCount?: number }; export interface ConnectorsActions { apiError: FetchConnectorsApiLogicActions['apiError']; apiSuccess: FetchConnectorsApiLogicActions['apiSuccess']; + closeDeleteModal(): void; + deleteConnector: DeleteConnectorApiLogicActions['makeRequest']; + deleteError: DeleteConnectorApiLogicActions['apiError']; + deleteSuccess: DeleteConnectorApiLogicActions['apiSuccess']; fetchConnectors({ fetchCrawlersOnly, from, @@ -39,11 +47,26 @@ export interface ConnectorsActions { }; makeRequest: FetchConnectorsApiLogicActions['makeRequest']; onPaginate(newPageIndex: number): { newPageIndex: number }; + openDeleteModal( + connectorName: string, + connectorId: string, + indexName: string | null + ): { + connectorId: string; + connectorName: string; + indexName: string | null; + }; setIsFirstRequest(): void; } export interface ConnectorsValues { connectors: ConnectorViewItem[]; data: typeof FetchConnectorsApiLogic.values.data; + deleteModalConnectorId: string; + deleteModalConnectorName: string; + deleteModalIndexName: string | null; + deleteStatus: typeof DeleteConnectorApiLogic.values.status; + isDeleteLoading: boolean; + isDeleteModalVisible: boolean; isEmpty: boolean; isFetchConnectorsDetailsLoading: boolean; isFirstRequest: boolean; @@ -60,6 +83,7 @@ export interface ConnectorsValues { export const ConnectorsLogic = kea>({ actions: { + closeDeleteModal: true, fetchConnectors: ({ fetchCrawlersOnly, from, size, searchQuery }) => ({ fetchCrawlersOnly, from, @@ -67,13 +91,32 @@ export const ConnectorsLogic = kea ({ newPageIndex }), + openDeleteModal: (connectorName, connectorId, indexName) => ({ + connectorId, + connectorName, + indexName, + }), setIsFirstRequest: true, }, connect: { - actions: [FetchConnectorsApiLogic, ['makeRequest', 'apiSuccess', 'apiError']], - values: [FetchConnectorsApiLogic, ['data', 'status']], + actions: [ + DeleteConnectorApiLogic, + ['apiError as deleteError', 'apiSuccess as deleteSuccess', 'makeRequest as deleteConnector'], + FetchConnectorsApiLogic, + ['makeRequest', 'apiSuccess', 'apiError'], + ], + values: [ + DeleteConnectorApiLogic, + ['status as deleteStatus'], + FetchConnectorsApiLogic, + ['data', 'status'], + ], }, - listeners: ({ actions }) => ({ + listeners: ({ actions, values }) => ({ + deleteSuccess: () => { + actions.closeDeleteModal(); + actions.makeRequest(values.searchParams); + }, fetchConnectors: async (input, breakpoint) => { await breakpoint(150); actions.makeRequest(input); @@ -81,6 +124,34 @@ export const ConnectorsLogic = kea ({ + deleteModalConnectorId: [ + '', + { + closeDeleteModal: () => '', + openDeleteModal: (_, { connectorId }) => connectorId, + }, + ], + deleteModalConnectorName: [ + '', + { + closeDeleteModal: () => '', + openDeleteModal: (_, { connectorName }) => connectorName, + }, + ], + deleteModalIndexName: [ + null, + { + closeDeleteModal: () => null, + openDeleteModal: (_, { indexName }) => indexName, + }, + ], + isDeleteModalVisible: [ + false, + { + closeDeleteModal: () => false, + openDeleteModal: () => true, + }, + ], isFirstRequest: [ true, { @@ -128,6 +199,10 @@ export const ConnectorsLogic = kea [selectors.deleteStatus], + (deleteStatus) => Status.LOADING === deleteStatus, + ], isEmpty: [ () => [selectors.data], (data) => diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors_table.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors_table.tsx index 3f58137b5dbd9..2c675c362b00e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors_table.tsx @@ -41,6 +41,7 @@ interface ConnectorsTableProps { items: ConnectorViewItem[]; meta?: Meta; onChange: (criteria: CriteriaWithPagination) => void; + onDelete: (connectorName: string, connectorId: string, indexName: string | null) => void; } export const ConnectorsTable: React.FC = ({ items, @@ -53,6 +54,7 @@ export const ConnectorsTable: React.FC = ({ }, onChange, isLoading, + onDelete, }) => { const { navigateToUrl } = useValues(KibanaLogic); const columns: Array> = [ @@ -122,6 +124,23 @@ export const ConnectorsTable: React.FC = ({ }, { actions: [ + { + description: 'Delete this connector', + icon: 'trash', + isPrimary: false, + name: (connector) => + i18n.translate( + 'xpack.enterpriseSearch.content.connectors.connectorTable.column.actions.deleteIndex', + { + defaultMessage: 'Delete connector {connectorName}', + values: { connectorName: connector.name }, + } + ), + onClick: (connector) => { + onDelete(connector.name, connector.id, connector.index_name); + }, + type: 'icon', + }, { description: i18n.translate( 'xpack.enterpriseSearch.content.connectors.connectorTable.columns.actions.viewIndex', diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/delete_connector_modal.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/delete_connector_modal.tsx new file mode 100644 index 0000000000000..1a4236f59a798 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/delete_connector_modal.tsx @@ -0,0 +1,158 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState, useEffect } from 'react'; + +import { useActions, useValues } from 'kea'; + +import { + EuiCheckbox, + EuiConfirmModal, + EuiFieldText, + EuiForm, + EuiFormRow, + EuiSpacer, + EuiText, + EuiTextColor, +} from '@elastic/eui'; + +import { i18n } from '@kbn/i18n'; + +import { FormattedMessage } from '@kbn/i18n-react'; + +import { ConnectorsLogic } from './connectors_logic'; + +export const DeleteConnectorModal: React.FC = () => { + const { closeDeleteModal, deleteConnector } = useActions(ConnectorsLogic); + const { + deleteModalConnectorId: connectorId, + deleteModalConnectorName: connectorName, + deleteModalIndexName, + isDeleteLoading, + isDeleteModalVisible, + } = useValues(ConnectorsLogic); + + const [inputConnectorName, setInputConnectorName] = useState(''); + const [shouldDeleteIndex, setShouldDeleteIndex] = useState(false); + + useEffect(() => { + setShouldDeleteIndex(false); + setInputConnectorName(''); + }, [isDeleteModalVisible]); + + return isDeleteModalVisible ? ( + { + closeDeleteModal(); + }} + onConfirm={() => { + deleteConnector({ + connectorId, + shouldDeleteIndex, + }); + }} + cancelButtonText={ + isDeleteLoading + ? i18n.translate( + 'xpack.enterpriseSearch.content.connectors.deleteModal.closeButton.title', + { + defaultMessage: 'Close', + } + ) + : i18n.translate( + 'xpack.enterpriseSearch.content.connectors.deleteModal.cancelButton.title', + { + defaultMessage: 'Cancel', + } + ) + } + confirmButtonText={i18n.translate( + 'xpack.enterpriseSearch.content.connectors.deleteModal.confirmButton.title', + { + defaultMessage: 'Delete index', + } + )} + defaultFocusedButton="confirm" + buttonColor="danger" + confirmButtonDisabled={inputConnectorName.trim() !== connectorName} + isLoading={isDeleteLoading} + > +

+ {i18n.translate( + 'xpack.enterpriseSearch.content.connectors.deleteModal.delete.description', + { + defaultMessage: 'You are about to delete this connector:', + } + )} +

+

+

    +
  • + +
  • +
+

+

+ + + {connectorName} + + ), + }} + /> + +

+ {deleteModalIndexName && ( + <> + setShouldDeleteIndex(!shouldDeleteIndex)} + /> + + + )} + + + setInputConnectorName(e.target.value)} + value={inputConnectorName} + /> + + +
+ ) : ( + <> + ); +}; diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts index cc071d41ccd47..e1b5b399dc3a0 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts @@ -8,6 +8,8 @@ import { schema } from '@kbn/config-schema'; import { i18n } from '@kbn/i18n'; import { + deleteConnectorById, + fetchConnectorById, fetchConnectors, fetchSyncJobsByConnectorId, putUpdateNative, @@ -22,11 +24,14 @@ import { import { ConnectorStatus, FilteringRule, SyncJobType } from '@kbn/search-connectors'; import { cancelSyncs } from '@kbn/search-connectors/lib/cancel_syncs'; +import { isResourceNotFoundException } from '@kbn/search-connectors/utils/identify_exceptions'; import { ErrorCode } from '../../../common/types/error_codes'; import { addConnector } from '../../lib/connectors/add_connector'; import { startSync } from '../../lib/connectors/start_sync'; +import { deleteAccessControlIndex } from '../../lib/indices/delete_access_control_index'; import { fetchIndexCounts } from '../../lib/indices/fetch_index_counts'; +import { deleteIndexPipelines } from '../../lib/pipelines/delete_pipelines'; import { getDefaultPipeline } from '../../lib/pipelines/get_default_pipeline'; import { updateDefaultPipeline } from '../../lib/pipelines/update_default_pipeline'; import { updateConnectorPipeline } from '../../lib/pipelines/update_pipeline'; @@ -37,6 +42,7 @@ import { elasticsearchErrorHandler } from '../../utils/elasticsearch_error_handl import { isAccessControlDisabledException, isExpensiveQueriesNotAllowedException, + isIndexNotFoundException, } from '../../utils/identify_exceptions'; export function registerConnectorRoutes({ router, log }: RouteDependencies) { @@ -539,4 +545,66 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { }); }) ); + + router.delete( + { + path: '/internal/enterprise_search/connectors/{connectorId}', + validate: { + params: schema.object({ + connectorId: schema.string(), + }), + query: schema.object({ + shouldDeleteIndex: schema.maybe(schema.boolean()), + }), + }, + }, + elasticsearchErrorHandler(log, async (context, request, response) => { + const { client } = (await context.core).elasticsearch; + const { connectorId } = request.params; + const { shouldDeleteIndex } = request.query; + + let connectorResponse; + let indexNameToDelete; + try { + if (shouldDeleteIndex) { + const connector = await fetchConnectorById(client.asCurrentUser, connectorId); + indexNameToDelete = connector?.value.index_name; + } + connectorResponse = await deleteConnectorById(client.asCurrentUser, connectorId); + if (indexNameToDelete) { + await deleteIndexPipelines(client, indexNameToDelete); + await deleteAccessControlIndex(client, indexNameToDelete); + await client.asCurrentUser.indices.delete({ index: indexNameToDelete }); + } + } catch (error) { + if (isResourceNotFoundException(error)) { + return createError({ + errorCode: ErrorCode.RESOURCE_NOT_FOUND, + message: i18n.translate( + 'xpack.enterpriseSearch.server.routes.connectors.resource_not_found_error', + { + defaultMessage: 'Connector with id {connectorId} is not found.', + values: { connectorId }, + } + ), + response, + statusCode: 404, + }); + } + + if (isIndexNotFoundException(error)) { + return createError({ + errorCode: ErrorCode.INDEX_NOT_FOUND, + message: 'Could not find index', + response, + statusCode: 404, + }); + } + + throw error; + } + + return response.ok({ body: connectorResponse }); + }) + ); } diff --git a/x-pack/plugins/fleet/common/constants/output.ts b/x-pack/plugins/fleet/common/constants/output.ts index 4d75f79df0a26..cdd52a42f3e6c 100644 --- a/x-pack/plugins/fleet/common/constants/output.ts +++ b/x-pack/plugins/fleet/common/constants/output.ts @@ -122,12 +122,12 @@ export const kafkaSupportedVersions = [ export const RESERVED_CONFIG_YML_KEYS = [ 'bulk_max_size', - 'workers', + 'compression_level', + 'connection_idle_timeout', 'queue.mem.events', - 'flush.min_events', - 'flush.timeout', - 'compression', - 'idle_timeout', + 'queue.mem.flush.min_events', + 'queue.mem.flush.timeout', + 'workers', ]; export const OUTPUT_TYPES_WITH_PRESET_SUPPORT: Array> = [ diff --git a/x-pack/plugins/fleet/cypress/e2e/fleet_settings_outputs.cy.ts b/x-pack/plugins/fleet/cypress/e2e/fleet_settings_outputs.cy.ts index cbeeedabeb107..6aadca2da9d7e 100644 --- a/x-pack/plugins/fleet/cypress/e2e/fleet_settings_outputs.cy.ts +++ b/x-pack/plugins/fleet/cypress/e2e/fleet_settings_outputs.cy.ts @@ -5,6 +5,8 @@ * 2.0. */ +import { RESERVED_CONFIG_YML_KEYS } from '../../common/constants'; + import { getSpecificSelectorId, SETTINGS_CONFIRM_MODAL_BTN, @@ -32,13 +34,16 @@ import { } from '../screens/fleet_outputs'; import { login } from '../tasks/login'; - import { visit } from '../tasks/common'; export const fillYamlConfigBox = (query: string) => { cy.get('[data-test-subj="kibanaCodeEditor"] textarea').type(query, { force: true }); }; +export const clearYamlConfigBox = () => { + cy.get('[data-test-subj="kibanaCodeEditor"] textarea').clear({ force: true }); +}; + describe('Outputs', () => { beforeEach(() => { login(); @@ -46,16 +51,38 @@ describe('Outputs', () => { describe('Elasticsearch', () => { describe('Preset input', () => { + afterEach(() => { + clearYamlConfigBox(); + cy.getBySel(SETTINGS_OUTPUTS.PRESET_INPUT).select('balanced'); + }); + it('is set to balanced by default', () => { selectESOutput(); cy.getBySel(SETTINGS_OUTPUTS.PRESET_INPUT).should('have.value', 'balanced'); }); - it('forces custom when reserved key is included in config YAML box', () => { + for (const keyword of RESERVED_CONFIG_YML_KEYS) { + it(`forces custom when reserved key ${keyword} is included in config YAML box`, () => { + selectESOutput(); + + fillYamlConfigBox(`${keyword}: value`); + + cy.getBySel(SETTINGS_OUTPUTS.PRESET_INPUT) + .should('have.value', 'custom') + .should('be.disabled'); + }); + } + + it('handles expanded syntax for reserved keys', () => { selectESOutput(); - fillYamlConfigBox('bulk_max_size: 1000'); + fillYamlConfigBox(` +queue: + mem: + flush: + min_events: 100 + `); cy.getBySel(SETTINGS_OUTPUTS.PRESET_INPUT) .should('have.value', 'custom') diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_list_table.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_list_table.tsx index 0a723bab1b969..5756f1fee4dca 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_list_table.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_list_table.tsx @@ -52,7 +52,7 @@ interface Props { sortField: keyof Agent; sortOrder: 'asc' | 'desc'; onSelectionChange: (agents: Agent[]) => void; - tableRef?: React.Ref; + selected: Agent[]; showUpgradeable: boolean; totalAgents?: number; pagination: Pagination; @@ -77,9 +77,9 @@ export const AgentListTable: React.FC = (props: Props) => { renderActions, sortField, sortOrder, - tableRef, onTableChange, onSelectionChange, + selected, totalAgents = 0, showUpgradeable, pagination, @@ -318,7 +318,6 @@ export const AgentListTable: React.FC = (props: Props) => { return ( - ref={tableRef} className="fleet__agentList__table" data-test-subj="fleetAgentListTable" loading={isLoading} @@ -341,6 +340,7 @@ export const AgentListTable: React.FC = (props: Props) => { }} isSelectable={true} selection={{ + selected, onSelectionChange, selectable: isAgentSelectable, selectableMessage: (selectable, agent) => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx index af91e65a40313..afa26547fecc7 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx @@ -4,9 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { useState, useMemo, useCallback, useRef } from 'react'; +import React, { useState, useMemo, useCallback } from 'react'; import { differenceBy, isEqual } from 'lodash'; -import type { EuiBasicTable } from '@elastic/eui'; import { EuiSpacer, EuiPortal } from '@elastic/eui'; import type { Agent } from '../../../types'; @@ -49,7 +48,6 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { // Table and search states const [selectedAgents, setSelectedAgents] = useState([]); const [selectionMode, setSelectionMode] = useState('manual'); - const tableRef = useRef>(null); const { allTags, @@ -208,21 +206,19 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { ); const onSelectionChange = (newAgents: Agent[]) => { - setSelectedAgents(newAgents); if (selectionMode === 'query' && newAgents.length < selectedAgents.length) { // differentiating between selection changed by agents dropping from current page or user action const areSelectedAgentsStillVisible = selectedAgents.length > 0 && differenceBy(selectedAgents, agentsOnCurrentPage, 'id').length === 0; - if (areSelectedAgentsStillVisible) { - setSelectionMode('manual'); - } else { + if (!areSelectedAgentsStillVisible) { // force selecting all agents on current page if staying in query mode - if (tableRef?.current) { - tableRef.current.setSelection(agentsOnCurrentPage); - } + return setSelectedAgents(agentsOnCurrentPage); + } else { + setSelectionMode('manual'); } } + setSelectedAgents(newAgents); }; const agentToUnenrollHasFleetServer = useMemo(() => { @@ -429,10 +425,8 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { setSelectionMode={setSelectionMode} selectedAgents={selectedAgents} setSelectedAgents={(newAgents: Agent[]) => { - if (tableRef?.current) { - tableRef.current.setSelection(newAgents); - setSelectionMode('manual'); - } + setSelectedAgents(newAgents); + setSelectionMode('manual'); }} clearFilters={clearFilters} isUsingFilter={isUsingFilter} @@ -448,7 +442,7 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { agentPoliciesIndexedById={agentPoliciesIndexedById} renderActions={renderActions} onSelectionChange={onSelectionChange} - tableRef={tableRef} + selected={selectedAgents} showUpgradeable={showUpgradeable} onTableChange={onTableChange} pagination={pagination} diff --git a/x-pack/plugins/index_lifecycle_management/server/routes/api/policies/register_create_route.ts b/x-pack/plugins/index_lifecycle_management/server/routes/api/policies/register_create_route.ts index 65c37120e552f..302b92a98407e 100644 --- a/x-pack/plugins/index_lifecycle_management/server/routes/api/policies/register_create_route.ts +++ b/x-pack/plugins/index_lifecycle_management/server/routes/api/policies/register_create_route.ts @@ -33,6 +33,7 @@ async function createPolicy( */ const bodySchema = schema.object({ name: schema.string(), + deprecated: schema.maybe(schema.boolean()), phases: schema.object({ hot: schema.any(), warm: schema.maybe(schema.any()), diff --git a/x-pack/plugins/index_management/__jest__/components/index_table.test.js b/x-pack/plugins/index_management/__jest__/components/index_table.test.js index e6790ea12ad36..af3333d3201ef 100644 --- a/x-pack/plugins/index_management/__jest__/components/index_table.test.js +++ b/x-pack/plugins/index_management/__jest__/components/index_table.test.js @@ -167,7 +167,6 @@ describe('index table', () => { enableLegacyTemplates: true, enableIndexActions: true, enableIndexStats: true, - enableEmbeddedConsole: false, }, }; diff --git a/x-pack/plugins/index_management/public/application/app_context.tsx b/x-pack/plugins/index_management/public/application/app_context.tsx index e532fc45c0f4a..cf2e9703669bd 100644 --- a/x-pack/plugins/index_management/public/application/app_context.tsx +++ b/x-pack/plugins/index_management/public/application/app_context.tsx @@ -57,7 +57,6 @@ export interface AppDependencies { enableIndexStats: boolean; editableIndexSettings: 'all' | 'limited'; enableDataStreamsStorageColumn: boolean; - enableEmbeddedConsole: boolean; }; history: ScopedHistory; setBreadcrumbs: ManagementAppMountParams['setBreadcrumbs']; diff --git a/x-pack/plugins/index_management/public/application/lib/edit_settings.ts b/x-pack/plugins/index_management/public/application/lib/edit_settings.ts index 16a67633224a9..ea935ea7c9cb6 100644 --- a/x-pack/plugins/index_management/public/application/lib/edit_settings.ts +++ b/x-pack/plugins/index_management/public/application/lib/edit_settings.ts @@ -27,12 +27,15 @@ export const limitedEditableSettings = [ 'index.blocks.write', 'index.blocks.read', 'index.blocks.read_only', + 'index.codec', 'index.default_pipeline', 'index.lifecycle.origination_date', 'index.final_pipeline', 'index.query.default_field', 'index.refresh_interval', + 'index.query_string.lenient', 'index.mapping.ignore_malformed', + 'index.mapping.coerce', 'index.mapping.total_fields.limit', 'index.merge.policy.deletes_pct_allowed', 'index.merge.policy.max_merge_at_once', diff --git a/x-pack/plugins/index_management/public/application/sections/home/home.tsx b/x-pack/plugins/index_management/public/application/sections/home/home.tsx index e0f965ad26d08..e85ee6b561064 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/home.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/home.tsx @@ -40,7 +40,6 @@ export const IndexManagementHome: React.FunctionComponent { const { - config: { enableEmbeddedConsole }, plugins: { console: consolePlugin }, } = useAppContext(); const tabs = [ @@ -146,7 +145,7 @@ export const IndexManagementHome: React.FunctionComponent - {(enableEmbeddedConsole && consolePlugin?.renderEmbeddableConsole?.()) ?? <>} + {consolePlugin?.renderEmbeddableConsole?.() ?? <>} ); return ( diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_content.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_content.tsx index 00b6f779d2c40..3c29a658daa28 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_content.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_content.tsx @@ -58,9 +58,7 @@ const defaultTabs: IndexDetailsTab[] = [ name: ( ), - renderTabContent: ({ index }) => ( - - ), + renderTabContent: ({ index }) => , order: 30, }, ]; @@ -91,7 +89,7 @@ export const DetailsPageContent: FunctionComponent = ({ navigateToIndicesList, }) => { const { - config: { enableIndexStats, enableEmbeddedConsole }, + config: { enableIndexStats }, plugins: { console: consolePlugin }, services: { extensionsService }, } = useAppContext(); @@ -180,7 +178,7 @@ export const DetailsPageContent: FunctionComponent = ({ >
- {(enableEmbeddedConsole && consolePlugin?.renderEmbeddableConsole?.()) ?? <>} + {consolePlugin?.renderEmbeddableConsole?.() ?? <>} ); }; diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_settings.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_settings.tsx index 2c6d9a2a36330..bf169ac2b9e5e 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_settings.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_settings.tsx @@ -16,8 +16,7 @@ import { DetailsPageSettingsContent } from './details_page_settings_content'; export const DetailsPageSettings: FunctionComponent<{ indexName: string; - isIndexOpen: boolean; -}> = ({ indexName, isIndexOpen }) => { +}> = ({ indexName }) => { const { isLoading, data, error, resendRequest } = useLoadIndexSettings(indexName); useEffect(() => { @@ -79,7 +78,6 @@ export const DetailsPageSettings: FunctionComponent<{ } return ( ; settingsString: string } => { const { defaults, settings } = data; @@ -62,23 +61,17 @@ const getEditableSettings = ({ readOnlySettings.forEach((e) => delete newSettings[e]); } - // can't change codec on an open index - if (isIndexOpen) { - delete newSettings['index.codec']; - } const settingsString = JSON.stringify(newSettings, null, 2); return { originalSettings: newSettings, settingsString }; }; interface Props { - isIndexOpen: boolean; data: IndexSettingsResponse; indexName: string; reloadIndexSettings: () => void; } export const DetailsPageSettingsContent: FunctionComponent = ({ - isIndexOpen, data, indexName, reloadIndexSettings, @@ -94,7 +87,6 @@ export const DetailsPageSettingsContent: FunctionComponent = ({ const { originalSettings, settingsString } = getEditableSettings({ data, - isIndexOpen, editableIndexSettings, }); const [editableSettings, setEditableSettings] = useState(settingsString); @@ -152,6 +144,14 @@ export const DetailsPageSettingsContent: FunctionComponent = ({ }); } }, [originalSettings, editableSettings, indexName, reloadIndexSettings]); + const settingsSchemaProperties = {} as Record; + Object.keys(originalSettings).forEach( + // allow any type of value + (setting) => + (settingsSchemaProperties[setting] = { + type: ['null', 'boolean', 'object', 'array', 'number', 'string'], + }) + ); return ( // using "rowReverse" to keep the card on the left side to be on top of the code block on smaller screens = ({ {isEditMode ? ( { + monacoEditor.languages.json.jsonDefaults.setDiagnosticsOptions({ + validate: true, + schemas: [ + { + uri: editor.getModel()?.uri.toString() ?? '', + fileMatch: ['*'], + schema: { + type: 'object', + properties: settingsSchemaProperties, + }, + }, + ], + }); + }} value={editableSettings} data-test-subj="indexDetailsSettingsEditor" options={{ diff --git a/x-pack/plugins/index_management/public/plugin.ts b/x-pack/plugins/index_management/public/plugin.ts index 68ce6f10e43c6..f4038a4e2677f 100644 --- a/x-pack/plugins/index_management/public/plugin.ts +++ b/x-pack/plugins/index_management/public/plugin.ts @@ -43,7 +43,6 @@ export class IndexMgmtUIPlugin { enableIndexStats, editableIndexSettings, enableDataStreamsStorageColumn, - enableEmbeddedConsole, } = this.ctx.config.get(); if (isIndexManagementUiEnabled) { @@ -55,7 +54,6 @@ export class IndexMgmtUIPlugin { enableIndexStats: enableIndexStats ?? true, editableIndexSettings: editableIndexSettings ?? 'all', enableDataStreamsStorageColumn: enableDataStreamsStorageColumn ?? true, - enableEmbeddedConsole: enableEmbeddedConsole ?? false, }; management.sections.section.data.registerApp({ id: PLUGIN.id, diff --git a/x-pack/plugins/index_management/public/types.ts b/x-pack/plugins/index_management/public/types.ts index 31a0e8e69ad59..729bfdcccc8c7 100644 --- a/x-pack/plugins/index_management/public/types.ts +++ b/x-pack/plugins/index_management/public/types.ts @@ -43,5 +43,4 @@ export interface ClientConfigType { enableIndexStats?: boolean; editableIndexSettings?: 'all' | 'limited'; enableDataStreamsStorageColumn?: boolean; - enableEmbeddedConsole?: boolean; } diff --git a/x-pack/plugins/index_management/server/config.ts b/x-pack/plugins/index_management/server/config.ts index 9f1e8a840bb45..7ee8afc5af5e4 100644 --- a/x-pack/plugins/index_management/server/config.ts +++ b/x-pack/plugins/index_management/server/config.ts @@ -52,8 +52,6 @@ const schemaLatest = schema.object( // We take this approach in order to have a central place (serverless.yml) for serverless config across Kibana serverless: schema.boolean({ defaultValue: true }), }), - // Embedded Developer Console is disabled by default - enableEmbeddedConsole: schema.boolean({ defaultValue: false }), }, { defaultValue: undefined } ); @@ -66,7 +64,6 @@ const configLatest: PluginConfigDescriptor = { enableIndexStats: true, editableIndexSettings: true, enableDataStreamsStorageColumn: true, - enableEmbeddedConsole: true, }, schema: schemaLatest, deprecations: ({ unused }) => [unused('dev.enableIndexDetailsPage', { level: 'warning' })], diff --git a/x-pack/plugins/index_management/server/routes/api/settings/register_update_route.ts b/x-pack/plugins/index_management/server/routes/api/settings/register_update_route.ts index cfb0be50e0484..730c7a3b24274 100644 --- a/x-pack/plugins/index_management/server/routes/api/settings/register_update_route.ts +++ b/x-pack/plugins/index_management/server/routes/api/settings/register_update_route.ts @@ -29,6 +29,7 @@ export function registerUpdateRoute({ router, lib: { handleEsError } }: RouteDep ignore_unavailable: true, allow_no_indices: false, expand_wildcards: 'none' as const, + reopen: true, index: indexName, body: request.body, }; diff --git a/x-pack/plugins/index_management/tsconfig.json b/x-pack/plugins/index_management/tsconfig.json index e9e76a18f8fd0..50181a03e3f19 100644 --- a/x-pack/plugins/index_management/tsconfig.json +++ b/x-pack/plugins/index_management/tsconfig.json @@ -43,6 +43,7 @@ "@kbn/ui-theme", "@kbn/core-application-browser", "@kbn/code-editor", + "@kbn/monaco", "@kbn/console-plugin", ], "exclude": [ diff --git a/x-pack/plugins/infra/common/http_api/profiling_api.ts b/x-pack/plugins/infra/common/http_api/profiling_api.ts index d6a27155477a9..e7c9600dcd14f 100644 --- a/x-pack/plugins/infra/common/http_api/profiling_api.ts +++ b/x-pack/plugins/infra/common/http_api/profiling_api.ts @@ -8,13 +8,13 @@ import * as rt from 'io-ts'; export const InfraProfilingFlamegraphRequestParamsRT = rt.type({ - hostname: rt.string, + kuery: rt.string, from: rt.number, to: rt.number, }); export const InfraProfilingFunctionsRequestParamsRT = rt.type({ - hostname: rt.string, + kuery: rt.string, from: rt.number, to: rt.number, startIndex: rt.number, diff --git a/x-pack/plugins/infra/kibana.jsonc b/x-pack/plugins/infra/kibana.jsonc index fe2086584a033..7b2705117675d 100644 --- a/x-pack/plugins/infra/kibana.jsonc +++ b/x-pack/plugins/infra/kibana.jsonc @@ -1,7 +1,7 @@ { "type": "plugin", "id": "@kbn/infra-plugin", - "owner": ["@elastic/infra-monitoring-ui", "@elastic/obs-ux-logs-team", "@elastic/obs-ux-infra_services-team"], + "owner": ["@elastic/obs-ux-logs-team", "@elastic/obs-ux-infra_services-team"], "description": "This plugin visualizes data from Filebeat and Metricbeat, and integrates with other Observability solutions", "plugin": { "id": "infra", diff --git a/x-pack/plugins/infra/public/alerting/log_threshold/components/alert_details_app_section/index.tsx b/x-pack/plugins/infra/public/alerting/log_threshold/components/alert_details_app_section/index.tsx index 055039091e074..19b134ee27e90 100644 --- a/x-pack/plugins/infra/public/alerting/log_threshold/components/alert_details_app_section/index.tsx +++ b/x-pack/plugins/infra/public/alerting/log_threshold/components/alert_details_app_section/index.tsx @@ -47,6 +47,7 @@ const AlertDetailsAppSection = ({ const theme = useTheme(); const timeRange = getPaddedAlertTimeRange(alert.fields[ALERT_START]!, alert.fields[ALERT_END]); const alertEnd = alert.fields[ALERT_END] ? moment(alert.fields[ALERT_END]).valueOf() : undefined; + const alertContext = alert.fields[ALERT_CONTEXT]; const interval = `${rule.params.timeSize}${rule.params.timeUnit}`; const thresholdFill = convertComparatorToFill(rule.params.count.comparator); const filter = rule.params.groupBy @@ -85,7 +86,7 @@ const AlertDetailsAppSection = ({ (selectedFields: Record, field) => ({ ...selectedFields, ...{ - [field]: get(alert.fields[ALERT_CONTEXT], ['groupByKeys', ...field.split('.')], null), + [field]: get(alertContext, ['groupByKeys', ...field.split('.')], null), }, }), {} @@ -96,7 +97,7 @@ const AlertDetailsAppSection = ({ value, })); setAlertSummaryFields(alertSummaryFields); - }, [alert.fields, rule.params.groupBy, setAlertSummaryFields]); + }, [alertContext, rule.params.groupBy, setAlertSummaryFields]); const getLogRatioChart = () => { if (isRatioRule(rule.params.criteria)) { diff --git a/x-pack/plugins/infra/public/components/asset_details/hooks/use_asset_details_url_state.ts b/x-pack/plugins/infra/public/components/asset_details/hooks/use_asset_details_url_state.ts index 42abaf1c5bc91..aa9e58c430b21 100644 --- a/x-pack/plugins/infra/public/components/asset_details/hooks/use_asset_details_url_state.ts +++ b/x-pack/plugins/infra/public/components/asset_details/hooks/use_asset_details_url_state.ts @@ -69,6 +69,7 @@ const AssetDetailsUrlStateRT = rt.partial({ processSearch: rt.string, metadataSearch: rt.string, logsSearch: rt.string, + profilingSearch: rt.string, }); const AssetDetailsUrlRT = rt.union([AssetDetailsUrlStateRT, rt.null]); diff --git a/x-pack/plugins/infra/public/components/asset_details/hooks/use_profiling_kuery.test.tsx b/x-pack/plugins/infra/public/components/asset_details/hooks/use_profiling_kuery.test.tsx new file mode 100644 index 0000000000000..f5bd973aca2ec --- /dev/null +++ b/x-pack/plugins/infra/public/components/asset_details/hooks/use_profiling_kuery.test.tsx @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { MemoryRouter, useHistory } from 'react-router-dom'; +import { renderHook, act } from '@testing-library/react-hooks'; +import { useProfilingKuery } from './use_profiling_kuery'; +import { useAssetDetailsRenderPropsContext } from './use_asset_details_render_props'; + +jest.mock('./use_asset_details_render_props'); + +describe('useProfilingKuery', () => { + const asset = { name: 'test-host' }; + + beforeEach(() => { + (useAssetDetailsRenderPropsContext as jest.Mock).mockReturnValue({ asset }); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('gets initial search value from the URL if present', () => { + const { result } = renderHook(() => useProfilingKuery(), { + wrapper: ({ children }) => ( + + {children} + + ), + }); + + expect(result.current.fullKuery).toBe('host.name : "test-host" and Stacktrace.count >= 5'); + expect(result.current.customKuery).toBe('Stacktrace.count >= 5'); + }); + + it('saves new custom kuery to the URL', () => { + const { result } = renderHook( + () => ({ profilingKuery: useProfilingKuery(), history: useHistory() }), + { + wrapper: ({ children }) => ( + {children} + ), + } + ); + + act(() => { + result.current.profilingKuery.setCustomKuery('Stacktrace.count > 5'); + }); + + expect(result.current.history.location.search).toBe( + encodeURI("?assetDetails=(profilingSearch:'Stacktrace.count > 5')") + ); + }); +}); diff --git a/x-pack/plugins/infra/public/components/asset_details/hooks/use_profiling_kuery.ts b/x-pack/plugins/infra/public/components/asset_details/hooks/use_profiling_kuery.ts new file mode 100644 index 0000000000000..10fb9b90cb090 --- /dev/null +++ b/x-pack/plugins/infra/public/components/asset_details/hooks/use_profiling_kuery.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useState } from 'react'; +import { HOST_FIELD } from '../../../../common/constants'; +import { useAssetDetailsRenderPropsContext } from './use_asset_details_render_props'; +import { useAssetDetailsUrlState } from './use_asset_details_url_state'; + +function buildFullProfilingKuery(assetName: string, profilingSearch?: string) { + const defaultKuery = `${HOST_FIELD} : "${assetName}"`; + const customKuery = profilingSearch?.trim() ?? ''; + + return customKuery !== '' ? `${defaultKuery} and ${customKuery}` : defaultKuery; +} +export function useProfilingKuery() { + const { asset } = useAssetDetailsRenderPropsContext(); + const [assetDetailsUrlState, setAssetDetailsUrlState] = useAssetDetailsUrlState(); + const [fullKuery, setFullKuery] = useState( + buildFullProfilingKuery(asset.name, assetDetailsUrlState?.profilingSearch) + ); + + const setCustomKuery = (customKuery: string) => { + setAssetDetailsUrlState({ profilingSearch: customKuery }); + setFullKuery(buildFullProfilingKuery(asset.name, customKuery)); + }; + + return { + fullKuery, + customKuery: assetDetailsUrlState?.profilingSearch ?? '', + setCustomKuery, + } as const; +} diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/flamegraph.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/flamegraph.tsx index 80a7f0ad8539c..c8c1d6fe18b84 100644 --- a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/flamegraph.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/flamegraph.tsx @@ -19,7 +19,11 @@ import { ErrorPrompt } from './error_prompt'; import { ProfilingLinks } from './profiling_links'; import { EmptyDataPrompt } from './empty_data_prompt'; -export function Flamegraph() { +interface Props { + kuery: string; +} + +export function Flamegraph({ kuery }: Props) { const { services } = useKibanaContextForPlugin(); const { asset } = useAssetDetailsRenderPropsContext(); const { activeTabId } = useTabSwitcherContext(); @@ -31,14 +35,7 @@ export function Flamegraph() { defaultMessage: 'Go to Universal Profiling Flamegraph', }); - const params = useMemo( - () => ({ - hostname: asset.name, - from, - to, - }), - [asset.name, from, to] - ); + const params = useMemo(() => ({ kuery, from, to }), [from, kuery, to]); const { error, loading, response } = useProfilingFlamegraphData({ isActive: activeTabId === ContentTabIds.PROFILING, params, diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/functions.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/functions.tsx index 5e3cf66ae8429..5dcf851897e5c 100644 --- a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/functions.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/functions.tsx @@ -19,7 +19,11 @@ import { ErrorPrompt } from './error_prompt'; import { ProfilingLinks } from './profiling_links'; import { EmptyDataPrompt } from './empty_data_prompt'; -export function Functions() { +interface Props { + kuery: string; +} + +export function Functions({ kuery }: Props) { const { services } = useKibanaContextForPlugin(); const { asset } = useAssetDetailsRenderPropsContext(); const { activeTabId } = useTabSwitcherContext(); @@ -33,13 +37,13 @@ export function Functions() { const params = useMemo( () => ({ - hostname: asset.name, + kuery, from, to, startIndex: 0, endIndex: 10, }), - [asset.name, from, to] + [kuery, from, to] ); const { error, loading, response } = useProfilingFunctionsData({ diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/profiling.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/profiling.tsx index 527ddcc59cb50..2901c7742f7f7 100644 --- a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/profiling.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/profiling.tsx @@ -7,15 +7,17 @@ import { i18n } from '@kbn/i18n'; import { EuiLink, EuiSpacer, EuiTabbedContent, type EuiTabbedContentProps } from '@elastic/eui'; -import React from 'react'; -import { ProfilingEmptyState } from '@kbn/observability-shared-plugin/public'; +import React, { useCallback } from 'react'; +import { + EmbeddableProfilingSearchBar, + ProfilingEmptyState, +} from '@kbn/observability-shared-plugin/public'; import { EuiLoadingSpinner } from '@elastic/eui'; import { css } from '@emotion/react'; import { EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { Flamegraph } from './flamegraph'; import { Functions } from './functions'; -import { DatePicker } from '../../date_picker/date_picker'; import { useProfilingStatusData } from '../../hooks/use_profiling_status_data'; import { useTabSwitcherContext } from '../../hooks/use_tab_switcher'; import { ContentTabIds } from '../../types'; @@ -23,13 +25,28 @@ import { ErrorPrompt } from './error_prompt'; import { Threads } from './threads'; import { DescriptionCallout } from './description_callout'; import { Popover } from '../common/popover'; +import { useDatePickerContext } from '../../hooks/use_date_picker'; +import { useProfilingKuery } from '../../hooks/use_profiling_kuery'; export function Profiling() { const { activeTabId } = useTabSwitcherContext(); + const { dateRange, setDateRange } = useDatePickerContext(); + const { fullKuery, customKuery, setCustomKuery } = useProfilingKuery(); const { error, loading, response } = useProfilingStatusData({ isActive: activeTabId === ContentTabIds.PROFILING, }); + const onSearchSubmit = useCallback( + ({ dateRange: range, query }) => { + setDateRange(range); + setCustomKuery(query); + }, + [setCustomKuery, setDateRange] + ); + const onSearchRefresh = useCallback(() => { + setDateRange(dateRange); + }, [dateRange, setDateRange]); + const tabs: EuiTabbedContentProps['tabs'] = [ { id: 'flamegraph', @@ -39,7 +56,7 @@ export function Profiling() { content: ( <> - + ), append: ( @@ -75,7 +92,7 @@ export function Profiling() { content: ( <> - + ), append: ( @@ -111,7 +128,7 @@ export function Profiling() { content: ( <> - + ), append: ( @@ -150,7 +167,14 @@ export function Profiling() { ) : ( <> - + + diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/threads.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/threads.tsx index 120fe3ca7fd99..837b526e7bf02 100644 --- a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/threads.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/threads.tsx @@ -10,13 +10,16 @@ import React from 'react'; import { TopNType } from '@kbn/profiling-utils'; import { EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { HOST_FIELD } from '../../../../../common/constants'; import { useAssetDetailsRenderPropsContext } from '../../hooks/use_asset_details_render_props'; import { useDatePickerContext } from '../../hooks/use_date_picker'; import { useKibanaContextForPlugin } from '../../../../hooks/use_kibana'; import { ProfilingLinks } from './profiling_links'; -export function Threads() { +interface Props { + kuery: string; +} + +export function Threads({ kuery }: Props) { const { services } = useKibanaContextForPlugin(); const { getDateRangeInTimestamp, dateRange, setDateRange } = useDatePickerContext(); const { from, to } = getDateRangeInTimestamp(); @@ -40,13 +43,13 @@ export function Threads() { type={TopNType.Threads} rangeFrom={from} rangeTo={to} - kuery={`${HOST_FIELD}:"${asset.name}"`} + kuery={kuery} onClick={(category) => { stacktracesProfilingLinkLocator.navigate({ type: TopNType.Traces, rangeFrom: dateRange.from, rangeTo: dateRange.to, - kuery: `(${HOST_FIELD}:"${asset.name}" ) AND process.thread.name:"${category}"`, + kuery: `(${kuery}) AND process.thread.name:"${category}"`, }); }} onChartBrushEnd={(range) => { diff --git a/x-pack/plugins/infra/public/plugin.ts b/x-pack/plugins/infra/public/plugin.ts index f89d99a43a57b..0732093e2d7bf 100644 --- a/x-pack/plugins/infra/public/plugin.ts +++ b/x-pack/plugins/infra/public/plugin.ts @@ -128,7 +128,7 @@ export class Plugin implements InfraClientPluginClass { entries: [ { label: 'Explorer', - app: 'observability-log-explorer', + app: 'observability-logs-explorer', path: '/', isBetaFeature: true, }, diff --git a/x-pack/plugins/infra/server/routes/profiling/index.ts b/x-pack/plugins/infra/server/routes/profiling/index.ts index d322fcca37b51..eaba17a8eddec 100644 --- a/x-pack/plugins/infra/server/routes/profiling/index.ts +++ b/x-pack/plugins/infra/server/routes/profiling/index.ts @@ -58,7 +58,7 @@ export function initProfilingRoutes({ framework, getStartServices, logger }: Inf path: '/api/infra/profiling/flamegraph', validate: { query: schema.object({ - hostname: schema.string(), + kuery: schema.string(), from: schema.number(), to: schema.number(), }), @@ -93,7 +93,7 @@ export function initProfilingRoutes({ framework, getStartServices, logger }: Inf path: '/api/infra/profiling/functions', validate: { query: schema.object({ - hostname: schema.string(), + kuery: schema.string(), from: schema.number(), to: schema.number(), startIndex: schema.number(), diff --git a/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_flamegraph.ts b/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_flamegraph.ts index 4f7ff72c3e72f..8b3ab0414f5c8 100644 --- a/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_flamegraph.ts +++ b/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_flamegraph.ts @@ -8,11 +8,10 @@ import type { CoreRequestHandlerContext } from '@kbn/core-http-request-handler-context-server'; import type { ProfilingDataAccessPluginStart } from '@kbn/profiling-data-access-plugin/server'; import type { BaseFlameGraph } from '@kbn/profiling-utils'; -import { HOST_FIELD } from '../../../../common/constants'; import type { InfraProfilingFlamegraphRequestParams } from '../../../../common/http_api/profiling_api'; export async function fetchProfilingFlamegraph( - { hostname, from, to }: InfraProfilingFlamegraphRequestParams, + { kuery, from, to }: InfraProfilingFlamegraphRequestParams, profilingDataAccess: ProfilingDataAccessPluginStart, coreRequestContext: CoreRequestHandlerContext ): Promise { @@ -21,6 +20,6 @@ export async function fetchProfilingFlamegraph( esClient: coreRequestContext.elasticsearch.client.asCurrentUser, rangeFromMs: from, rangeToMs: to, - kuery: `${HOST_FIELD} : "${hostname}"`, + kuery, }); } diff --git a/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_functions.ts b/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_functions.ts index d445e364d143c..fb78075ca3545 100644 --- a/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_functions.ts +++ b/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_functions.ts @@ -8,7 +8,6 @@ import type { CoreRequestHandlerContext } from '@kbn/core-http-request-handler-context-server'; import type { ProfilingDataAccessPluginStart } from '@kbn/profiling-data-access-plugin/server'; import type { TopNFunctions } from '@kbn/profiling-utils'; -import { HOST_FIELD } from '../../../../common/constants'; import type { InfraProfilingFunctionsRequestParams } from '../../../../common/http_api/profiling_api'; export async function fetchProfilingFunctions( @@ -16,14 +15,14 @@ export async function fetchProfilingFunctions( profilingDataAccess: ProfilingDataAccessPluginStart, coreRequestContext: CoreRequestHandlerContext ): Promise { - const { hostname, from, to, startIndex, endIndex } = params; + const { kuery, from, to, startIndex, endIndex } = params; return await profilingDataAccess.services.fetchFunction({ core: coreRequestContext, esClient: coreRequestContext.elasticsearch.client.asCurrentUser, rangeFromMs: from, rangeToMs: to, - kuery: `${HOST_FIELD} : "${hostname}"`, + kuery, startIndex, endIndex, }); diff --git a/x-pack/plugins/infra/types/redux_observable.d.ts b/x-pack/plugins/infra/types/redux_observable.d.ts deleted file mode 100644 index c1f9a2dda3352..0000000000000 --- a/x-pack/plugins/infra/types/redux_observable.d.ts +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { Action } from 'redux'; -import { Epic } from 'redux-observable'; - -declare module 'redux-observable' { - function combineEpics< - T1 extends Action, - T2 extends Action, - O1 extends T1, - O2 extends T2, - S, - D1, - D2 - >(epic1: Epic, epic2: Epic): Epic; - function combineEpics< - T1 extends Action, - T2 extends Action, - T3 extends Action, - O1 extends T1, - O2 extends T2, - O3 extends T3, - S, - D1, - D2, - D3 - >( - epic1: Epic, - epic2: Epic, - epic3: Epic - ): Epic; - function combineEpics< - T1 extends Action, - T2 extends Action, - T3 extends Action, - T4 extends Action, - O1 extends T1, - O2 extends T2, - O3 extends T3, - O4 extends T4, - S, - D1, - D2, - D3, - D4 - >( - epic1: Epic, - epic2: Epic, - epic3: Epic, - epic4: Epic - ): Epic; - function combineEpics< - T1 extends Action, - T2 extends Action, - T3 extends Action, - T4 extends Action, - T5 extends Action, - O1 extends T1, - O2 extends T2, - O3 extends T3, - O4 extends T4, - O5 extends T5, - S, - D1, - D2, - D3, - D4, - D5 - >( - epic1: Epic, - epic2: Epic, - epic3: Epic, - epic4: Epic, - epic5: Epic - ): Epic; - - type EpicWithState = E extends Epic - ? Epic - : E; -} diff --git a/x-pack/plugins/lens/public/embeddable/index.ts b/x-pack/plugins/lens/public/embeddable/index.ts index 641601a2be3be..37bd92c53a9a3 100644 --- a/x-pack/plugins/lens/public/embeddable/index.ts +++ b/x-pack/plugins/lens/public/embeddable/index.ts @@ -6,3 +6,5 @@ */ export * from './embeddable'; + +export { type HasLensConfig, apiHasLensConfig } from './interfaces/has_lens_config'; diff --git a/x-pack/plugins/lens/public/embeddable/interfaces/has_lens_config.ts b/x-pack/plugins/lens/public/embeddable/interfaces/has_lens_config.ts new file mode 100644 index 0000000000000..39bb91c5c8fe6 --- /dev/null +++ b/x-pack/plugins/lens/public/embeddable/interfaces/has_lens_config.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { type HasType, apiIsOfType } from '@kbn/presentation-publishing'; +import { Document } from '../../persistence'; + +export type HasLensConfig = HasType<'lens'> & { + getSavedVis: () => Readonly; +}; + +export const apiHasLensConfig = (api: unknown): api is HasLensConfig => { + return Boolean( + api && apiIsOfType(api, 'lens') && typeof (api as HasLensConfig).getSavedVis === 'function' + ); +}; diff --git a/x-pack/plugins/lens/public/index.ts b/x-pack/plugins/lens/public/index.ts index a9f8e0eba3dc4..2bf09422986e9 100644 --- a/x-pack/plugins/lens/public/index.ts +++ b/x-pack/plugins/lens/public/index.ts @@ -7,6 +7,7 @@ import { LensPlugin } from './plugin'; +export { apiHasLensConfig } from './embeddable/interfaces/has_lens_config'; export type { EmbeddableComponentProps, EmbeddableComponent, @@ -109,6 +110,7 @@ export type { export type { InlineEditLensEmbeddableContext } from './trigger_actions/open_lens_config/in_app_embeddable_edit/types'; export type { + HasLensConfig, LensEmbeddableInput, LensSavedObjectAttributes, Embeddable, diff --git a/x-pack/plugins/lens/tsconfig.json b/x-pack/plugins/lens/tsconfig.json index 9338b9df054ba..01470e01785f6 100644 --- a/x-pack/plugins/lens/tsconfig.json +++ b/x-pack/plugins/lens/tsconfig.json @@ -107,7 +107,8 @@ "@kbn/shared-ux-utility", "@kbn/text-based-editor", "@kbn/managed-content-badge", - "@kbn/sort-predicates" + "@kbn/sort-predicates", + "@kbn/presentation-publishing" ], "exclude": ["target/**/*"] } diff --git a/x-pack/plugins/maps/public/legacy_visualizations/is_legacy_map.ts b/x-pack/plugins/maps/public/legacy_visualizations/is_legacy_map.ts index 93a74b2adc1ea..46f7b9cf27be5 100644 --- a/x-pack/plugins/maps/public/legacy_visualizations/is_legacy_map.ts +++ b/x-pack/plugins/maps/public/legacy_visualizations/is_legacy_map.ts @@ -5,10 +5,8 @@ * 2.0. */ -import type { HasType } from '@kbn/presentation-publishing'; import { Embeddable } from '@kbn/embeddable-plugin/public'; import type { HasVisualizeConfig, VisualizeEmbeddable } from '@kbn/visualizations-plugin/public'; -import { apiHasVisualizeConfig } from '@kbn/visualizations-plugin/public'; export function isLegacyMap(embeddable: Embeddable) { return ( @@ -18,11 +16,6 @@ export function isLegacyMap(embeddable: Embeddable) { ); } -type LegacyMapApi = HasType & Partial; - -export function isLegacyMapApi(api: LegacyMapApi) { - if (api.type !== 'visualization' || !apiHasVisualizeConfig(api)) { - return false; - } +export function isLegacyMapApi(api: HasVisualizeConfig) { return ['region_map', 'tile_map'].includes(api.getVis().type?.name); } diff --git a/x-pack/plugins/maps/public/map_attribute_service.ts b/x-pack/plugins/maps/public/map_attribute_service.ts index 3fb1c8157c0f5..6cc226b72dc4b 100644 --- a/x-pack/plugins/maps/public/map_attribute_service.ts +++ b/x-pack/plugins/maps/public/map_attribute_service.ts @@ -28,6 +28,8 @@ type MapDoc = MapAttributes & { }; export interface MapUnwrapMetaInfo { sharingSavedObjectProps: SharingSavedObjectProps; + // Is this map managed by the system? + managed: boolean; } export type MapAttributeService = AttributeService< @@ -101,6 +103,7 @@ export function getMapAttributeService(): MapAttributeService { aliasPurpose, sourceId: savedObjectId, }, + managed: Boolean(savedObject.managed), }, }; }, diff --git a/x-pack/plugins/maps/public/routes/map_page/map_app/map_app.tsx b/x-pack/plugins/maps/public/routes/map_page/map_app/map_app.tsx index 453fbe3a54fc3..c40157fbbe68e 100644 --- a/x-pack/plugins/maps/public/routes/map_page/map_app/map_app.tsx +++ b/x-pack/plugins/maps/public/routes/map_page/map_app/map_app.tsx @@ -32,6 +32,7 @@ import { withNotifyOnErrors, IKbnUrlStateStorage, } from '@kbn/kibana-utils-plugin/public'; +import { getManagedContentBadge } from '@kbn/managed-content-badge'; import { getData, getExecutionContextService, @@ -486,6 +487,18 @@ export class MapApp extends React.Component { ); diff --git a/x-pack/plugins/maps/public/trigger_actions/filter_by_map_extent/action.ts b/x-pack/plugins/maps/public/trigger_actions/filter_by_map_extent/action.ts index 5bd55e65b6fe0..a368dc65b26fe 100644 --- a/x-pack/plugins/maps/public/trigger_actions/filter_by_map_extent/action.ts +++ b/x-pack/plugins/maps/public/trigger_actions/filter_by_map_extent/action.ts @@ -6,8 +6,9 @@ */ import { i18n } from '@kbn/i18n'; -import { type EmbeddableApiContext, apiHasType } from '@kbn/presentation-publishing'; +import { type EmbeddableApiContext, apiHasType, apiIsOfType } from '@kbn/presentation-publishing'; import { createAction } from '@kbn/ui-actions-plugin/public'; +import { apiHasVisualizeConfig } from '@kbn/visualizations-plugin/public'; import { type FilterByMapExtentActionApi } from './types'; import { MAP_SAVED_OBJECT_TYPE } from '../../../common/constants'; import { isLegacyMapApi } from '../../legacy_visualizations/is_legacy_map'; @@ -52,10 +53,11 @@ export const filterByMapExtentAction = createAction({ return 'filter'; }, isCompatible: async ({ embeddable }: EmbeddableApiContext) => { - if (!isApiCompatible(embeddable)) return false; - return embeddable.disableTriggers - ? false - : embeddable.type === MAP_SAVED_OBJECT_TYPE || isLegacyMapApi(embeddable); + if (!isApiCompatible(embeddable) || embeddable.disableTriggers) return false; + return ( + apiIsOfType(embeddable, MAP_SAVED_OBJECT_TYPE) || + (apiHasVisualizeConfig(embeddable) && isLegacyMapApi(embeddable)) + ); }, execute: async ({ embeddable }: EmbeddableApiContext) => { const { openModal } = await import('./modal'); diff --git a/x-pack/plugins/maps/public/trigger_actions/filter_by_map_extent/types.ts b/x-pack/plugins/maps/public/trigger_actions/filter_by_map_extent/types.ts index b5de10937c3d4..a397c627c5a36 100644 --- a/x-pack/plugins/maps/public/trigger_actions/filter_by_map_extent/types.ts +++ b/x-pack/plugins/maps/public/trigger_actions/filter_by_map_extent/types.ts @@ -8,5 +8,5 @@ import type { HasDisableTriggers, HasParentApi, HasType } from '@kbn/presentation-publishing'; import type { HasVisualizeConfig } from '@kbn/visualizations-plugin/public'; -export type FilterByMapExtentActionApi = HasType & +export type FilterByMapExtentActionApi = HasType<'visualization' | 'map'> & Partial & HasVisualizeConfig>; diff --git a/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/action.ts b/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/action.ts index 3a3fd78072865..880172a982181 100644 --- a/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/action.ts +++ b/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/action.ts @@ -6,16 +6,20 @@ */ import { i18n } from '@kbn/i18n'; +import { type EmbeddableApiContext, apiHasType } from '@kbn/presentation-publishing'; import { createAction } from '@kbn/ui-actions-plugin/public'; -import type { SynchronizeMovementActionContext } from './types'; +import type { SynchronizeMovementActionApi } from './types'; export const SYNCHRONIZE_MOVEMENT_ACTION = 'SYNCHRONIZE_MOVEMENT_ACTION'; -export const synchronizeMovementAction = createAction({ +export const isApiCompatible = (api: unknown | null): api is SynchronizeMovementActionApi => + Boolean(apiHasType(api)); + +export const synchronizeMovementAction = createAction({ id: SYNCHRONIZE_MOVEMENT_ACTION, type: SYNCHRONIZE_MOVEMENT_ACTION, order: 21, - getDisplayName: ({ embeddable }: SynchronizeMovementActionContext) => { + getDisplayName: () => { return i18n.translate('xpack.maps.synchronizeMovementAction.title', { defaultMessage: 'Synchronize map movement', }); @@ -29,11 +33,12 @@ export const synchronizeMovementAction = createAction { return 'crosshairs'; }, - isCompatible: async (context: SynchronizeMovementActionContext) => { + isCompatible: async ({ embeddable }: EmbeddableApiContext) => { + if (!isApiCompatible(embeddable)) return false; const { isCompatible } = await import('./is_compatible'); - return isCompatible(context); + return isCompatible(embeddable); }, - execute: async (context: SynchronizeMovementActionContext) => { + execute: async () => { const { openModal } = await import('./modal'); openModal(); }, diff --git a/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/is_compatible.ts b/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/is_compatible.ts index ef73f8bb23d11..bd31feb04f00e 100644 --- a/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/is_compatible.ts +++ b/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/is_compatible.ts @@ -5,28 +5,21 @@ * 2.0. */ -import type { Embeddable as LensEmbeddable } from '@kbn/lens-plugin/public'; +import { apiIsOfType } from '@kbn/presentation-publishing'; +import { apiHasVisualizeConfig } from '@kbn/visualizations-plugin/public'; +import { apiHasLensConfig } from '@kbn/lens-plugin/public'; import { MAP_SAVED_OBJECT_TYPE } from '../../../common/constants'; -import { isLegacyMap } from '../../legacy_visualizations/is_legacy_map'; +import { isLegacyMapApi } from '../../legacy_visualizations/is_legacy_map'; import { mapEmbeddablesSingleton } from '../../embeddable/map_embeddables_singleton'; -import type { SynchronizeMovementActionContext } from './types'; +import type { SynchronizeMovementActionApi } from './types'; -export function isCompatible({ embeddable }: SynchronizeMovementActionContext) { +export function isCompatible(api: SynchronizeMovementActionApi) { if (!mapEmbeddablesSingleton.hasMultipleMaps()) { return false; } - - if ( - embeddable.type === 'lens' && - typeof (embeddable as LensEmbeddable).getSavedVis === 'function' && - (embeddable as LensEmbeddable).getSavedVis()?.visualizationType === 'lnsChoropleth' - ) { - return true; - } - - if (isLegacyMap(embeddable)) { - return true; - } - - return embeddable.type === MAP_SAVED_OBJECT_TYPE; + return ( + apiIsOfType(api, MAP_SAVED_OBJECT_TYPE) || + (apiHasLensConfig(api) && api.getSavedVis()?.visualizationType === 'lnsChoropleth') || + (apiHasVisualizeConfig(api) && isLegacyMapApi(api)) + ); } diff --git a/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/types.ts b/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/types.ts index 8b0060ab1efe6..4b9e48e19c2d0 100644 --- a/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/types.ts +++ b/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/types.ts @@ -5,8 +5,10 @@ * 2.0. */ -import type { Embeddable, EmbeddableInput } from '@kbn/embeddable-plugin/public'; +import type { HasType } from '@kbn/presentation-publishing'; +import type { HasLensConfig } from '@kbn/lens-plugin/public'; +import type { HasVisualizeConfig } from '@kbn/visualizations-plugin/public'; -export interface SynchronizeMovementActionContext { - embeddable: Embeddable; -} +export type SynchronizeMovementActionApi = + | HasType<'map' | 'visualization' | 'lens'> + | Partial; diff --git a/x-pack/plugins/maps/tsconfig.json b/x-pack/plugins/maps/tsconfig.json index 3139e90e20311..ea0fe5eef42a3 100644 --- a/x-pack/plugins/maps/tsconfig.json +++ b/x-pack/plugins/maps/tsconfig.json @@ -83,6 +83,7 @@ "@kbn/es-types", "@kbn/data-service", "@kbn/code-editor", + "@kbn/managed-content-badge", "@kbn/presentation-publishing", ], "exclude": [ diff --git a/x-pack/plugins/observability/public/hooks/slo/mix_kql_with_tags.test.ts b/x-pack/plugins/observability/public/hooks/slo/mix_kql_with_tags.test.ts new file mode 100644 index 0000000000000..4387dbc06e641 --- /dev/null +++ b/x-pack/plugins/observability/public/hooks/slo/mix_kql_with_tags.test.ts @@ -0,0 +1,110 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mixKqlWithTags } from './mix_kql_with_tags'; + +describe('mixKqlWithTags', () => { + it('mixes kql with selected tags', async () => { + const query = 'something'; + const tags = { + included: ['production'], + excluded: [], + }; + + const kqlQueryMixedValue = mixKqlWithTags(query, tags); + expect(kqlQueryMixedValue).toBe('something and slo.tags: (production)'); + }); + + it('mixes kql with cleared out tags', async () => { + const query = 'something'; + const tags = { + included: [], + excluded: [], + }; + + const kqlQueryMixedValue = mixKqlWithTags(query, tags); + expect(kqlQueryMixedValue).toBe('something'); + }); + + it('mixes kql with included and excluded tags', async () => { + const query = 'something'; + const tags = { + included: ['production'], + excluded: ['dev'], + }; + + const kqlQueryMixedValue = mixKqlWithTags(query, tags); + expect(kqlQueryMixedValue).toBe('something and slo.tags: (production) and not slo.tags: (dev)'); + }); + + it('mixes empty query with tags', async () => { + const query = ''; + const tags = { + included: ['production'], + excluded: ['dev'], + }; + const kqlQueryMixedValue = mixKqlWithTags(query, tags); + expect(kqlQueryMixedValue).toBe('slo.tags: (production) and not slo.tags: (dev)'); + }); + + it('mixes empty query with empty tags', async () => { + const query = ''; + const tags = { + included: [], + excluded: [], + }; + + const kqlQueryMixedValue = mixKqlWithTags(query, tags); + expect(kqlQueryMixedValue).toBe(''); + }); + + it('mixes empty query with undefined tags', async () => { + const query = ''; + const tags = { + included: undefined, + excluded: undefined, + }; + + const kqlQueryMixedValue = mixKqlWithTags(query, tags); + expect(kqlQueryMixedValue).toBe(''); + }); + + it('mixes query with multiple included tags', async () => { + const query = 'something'; + const tags = { + included: ['production', 'staging'], + excluded: [], + }; + + const kqlQueryMixedValue = mixKqlWithTags(query, tags); + expect(kqlQueryMixedValue).toBe('something and slo.tags: (production or staging)'); + }); + + it('mixes query with multiple excluded tags', async () => { + const query = 'something'; + const tags = { + included: [], + excluded: ['dev', 'production'], + }; + + const kqlQueryMixedValue = mixKqlWithTags(query, tags); + expect(kqlQueryMixedValue).toBe('something and not slo.tags: (dev or production)'); + }); + + it('mixes query with multiple included and multiple excluded tags', async () => { + const query = 'something'; + const tags = { + included: ['production', 'staging'], + excluded: ['dev', 'pre', 'qa'], + }; + + const kqlQueryMixedValue = mixKqlWithTags(query, tags); + expect(kqlQueryMixedValue).toBe( + 'something and slo.tags: (production or staging) and not slo.tags: (dev or pre or qa)' + ); + }); +}); diff --git a/x-pack/plugins/observability/public/hooks/slo/mix_kql_with_tags.ts b/x-pack/plugins/observability/public/hooks/slo/mix_kql_with_tags.ts new file mode 100644 index 0000000000000..70c193edfc38b --- /dev/null +++ b/x-pack/plugins/observability/public/hooks/slo/mix_kql_with_tags.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { SearchState } from '../../pages/slos/hooks/use_url_search_state'; + +export function mixKqlWithTags(kqlQuery: string, tags: SearchState['tags']) { + if (!tags) { + return kqlQuery; + } + const includedKqlTags = tags?.included?.join(' or '); + const excludedKqlTags = tags?.excluded?.join(' or '); + + const queryParts = []; + if (!!kqlQuery) { + queryParts.push(kqlQuery); + } + if (!!includedKqlTags) { + queryParts.push(`slo.tags: (${includedKqlTags})`); + } + if (!!excludedKqlTags) { + queryParts.push(`not slo.tags: (${excludedKqlTags})`); + } + return queryParts.join(' and '); +} diff --git a/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_list.ts b/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_list.ts index dcead3e31615f..ec0f078836c9e 100644 --- a/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_list.ts +++ b/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_list.ts @@ -19,6 +19,7 @@ import { import { useKibana } from '../../utils/kibana_react'; import { sloKeys } from './query_key_factory'; +import { mixKqlWithTags } from './mix_kql_with_tags'; interface SLOListParams { kqlQuery?: string; @@ -130,28 +131,3 @@ export function useFetchSloList({ isError, }; } - -const mixKqlWithTags = (kqlQuery: string, tags: SearchState['tags']) => { - if (!tags) { - return kqlQuery; - } - const tagsKqlIncluded = tags.included?.join(' or ') || ''; - const excludedTagsKql = tags.excluded?.join(' or ') || ''; - - let tagsQuery = ''; - if (tagsKqlIncluded && excludedTagsKql) { - tagsQuery = `slo.tags: (${excludedTagsKql}) and not slo.tags: (${tagsKqlIncluded})`; - } - if (!excludedTagsKql && tagsKqlIncluded) { - tagsQuery = `slo.tags: (${tagsKqlIncluded})`; - } - if (!tagsKqlIncluded && excludedTagsKql) { - tagsQuery = `not slo.tags: (${excludedTagsKql})`; - } - - if (!kqlQuery) { - return tagsQuery; - } - - return `${kqlQuery} and ${tagsQuery}`; -}; diff --git a/x-pack/plugins/observability/public/hooks/slo/use_get_preview_data.ts b/x-pack/plugins/observability/public/hooks/slo/use_get_preview_data.ts index 3a3b5d91871ea..1cf3cb1c0a002 100644 --- a/x-pack/plugins/observability/public/hooks/slo/use_get_preview_data.ts +++ b/x-pack/plugins/observability/public/hooks/slo/use_get_preview_data.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { GetPreviewDataResponse, Indicator } from '@kbn/slo-schema'; +import { GetPreviewDataResponse, Indicator, Objective } from '@kbn/slo-schema'; import { useQuery } from '@tanstack/react-query'; import { useKibana } from '../../utils/kibana_react'; import { sloKeys } from './query_key_factory'; @@ -21,7 +21,9 @@ export interface UseGetPreviewData { export function useGetPreviewData( isValid: boolean, indicator: Indicator, - range: { start: number; end: number } + range: { start: number; end: number }, + objective?: Objective, + filter?: string ): UseGetPreviewData { const { http } = useKibana().services; @@ -31,7 +33,11 @@ export function useGetPreviewData( const response = await http.post( '/internal/observability/slos/_preview', { - body: JSON.stringify({ indicator, range }), + body: JSON.stringify({ + indicator: { ...indicator, params: { ...indicator.params, filter } }, + range, + ...((objective && { objective }) || {}), + }), signal, } ); diff --git a/x-pack/plugins/observability/public/pages/alert_details/alert_details.test.tsx b/x-pack/plugins/observability/public/pages/alert_details/alert_details.test.tsx index e6ef115b6aba8..ffa4f08e2d144 100644 --- a/x-pack/plugins/observability/public/pages/alert_details/alert_details.test.tsx +++ b/x-pack/plugins/observability/public/pages/alert_details/alert_details.test.tsx @@ -5,30 +5,30 @@ * 2.0. */ -import React, { Fragment } from 'react'; -import { useParams } from 'react-router-dom'; -import { Chance } from 'chance'; -import { waitFor } from '@testing-library/react'; import { casesPluginMock } from '@kbn/cases-plugin/public/mocks'; import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; import * as useUiSettingHook from '@kbn/kibana-react-plugin/public/ui_settings/use_ui_setting'; -import { useBreadcrumbs } from '@kbn/observability-shared-plugin/public'; import { observabilityAIAssistantPluginMock } from '@kbn/observability-ai-assistant-plugin/public/mock'; -import { ruleTypeRegistryMock } from '@kbn/triggers-actions-ui-plugin/public/application/rule_type_registry.mock'; +import { useBreadcrumbs } from '@kbn/observability-shared-plugin/public'; import { RuleTypeModel, ValidationResult } from '@kbn/triggers-actions-ui-plugin/public'; - +import { ruleTypeRegistryMock } from '@kbn/triggers-actions-ui-plugin/public/application/rule_type_registry.mock'; +import { waitFor } from '@testing-library/react'; +import { Chance } from 'chance'; +import React, { Fragment } from 'react'; +import { useLocation, useParams } from 'react-router-dom'; +import { useFetchAlertDetail } from '../../hooks/use_fetch_alert_detail'; +import { ConfigSchema } from '../../plugin'; import { Subset } from '../../typings'; -import { render } from '../../utils/test_helper'; import { useKibana } from '../../utils/kibana_react'; import { kibanaStartMock } from '../../utils/kibana_react.mock'; -import { useFetchAlertDetail } from '../../hooks/use_fetch_alert_detail'; +import { render } from '../../utils/test_helper'; import { AlertDetails } from './alert_details'; -import { ConfigSchema } from '../../plugin'; import { alertDetail, alertWithNoData } from './mock/alert'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), useParams: jest.fn(), + useLocation: jest.fn(), })); jest.mock('../../utils/kibana_react'); @@ -83,6 +83,7 @@ jest.mock('@kbn/observability-shared-plugin/public'); const useFetchAlertDetailMock = useFetchAlertDetail as jest.Mock; const useParamsMock = useParams as jest.Mock; +const useLocationMock = useLocation as jest.Mock; const useBreadcrumbsMock = useBreadcrumbs as jest.Mock; const chance = new Chance(); @@ -108,6 +109,7 @@ describe('Alert details', () => { beforeEach(() => { jest.clearAllMocks(); useParamsMock.mockReturnValue(params); + useLocationMock.mockReturnValue({ pathname: '/alerts/uuid', search: '', state: '', hash: '' }); useBreadcrumbsMock.mockReturnValue([]); ruleTypeRegistry.list.mockReturnValue([ruleType]); ruleTypeRegistry.get.mockReturnValue(ruleType); diff --git a/x-pack/plugins/observability/public/pages/alerts/alerts.test.tsx b/x-pack/plugins/observability/public/pages/alerts/alerts.test.tsx index 38d5ae3a05852..caf12f5bd6ea4 100644 --- a/x-pack/plugins/observability/public/pages/alerts/alerts.test.tsx +++ b/x-pack/plugins/observability/public/pages/alerts/alerts.test.tsx @@ -5,27 +5,31 @@ * 2.0. */ -import React from 'react'; -import { render, waitFor } from '@testing-library/react'; -import { CoreStart } from '@kbn/core/public'; -import { AppMountParameters } from '@kbn/core/public'; -import { TimeBuckets } from '@kbn/data-plugin/common'; +import { ThemeProvider } from '@emotion/react'; +import { MAINTENANCE_WINDOW_FEATURE_ID } from '@kbn/alerting-plugin/common/maintenance_window'; import { fetchActiveMaintenanceWindows } from '@kbn/alerts-ui-shared/src/maintenance_window_callout/api'; import { RUNNING_MAINTENANCE_WINDOW_1 } from '@kbn/alerts-ui-shared/src/maintenance_window_callout/mock'; -import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; +import { AppMountParameters, CoreStart } from '@kbn/core/public'; +import { TimeBuckets } from '@kbn/data-plugin/common'; import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; -import { MAINTENANCE_WINDOW_FEATURE_ID } from '@kbn/alerting-plugin/common/maintenance_window'; import { observabilityAIAssistantPluginMock } from '@kbn/observability-ai-assistant-plugin/public/mock'; - -import { ObservabilityPublicPluginsStart } from '../../plugin'; -import { AlertsPage } from './alerts'; -import { kibanaStartMock } from '../../utils/kibana_react.mock'; -import * as pluginContext from '../../hooks/use_plugin_context'; -import * as dataContext from '../../hooks/use_has_data'; -import { createObservabilityRuleTypeRegistryMock } from '../../rules/observability_rule_type_registry_mock'; -import { ThemeProvider } from '@emotion/react'; +import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; import { euiDarkVars } from '@kbn/ui-theme'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { render, waitFor } from '@testing-library/react'; +import React from 'react'; +import { useLocation } from 'react-router-dom'; +import * as dataContext from '../../hooks/use_has_data'; +import * as pluginContext from '../../hooks/use_plugin_context'; +import { ObservabilityPublicPluginsStart } from '../../plugin'; +import { createObservabilityRuleTypeRegistryMock } from '../../rules/observability_rule_type_registry_mock'; +import { kibanaStartMock } from '../../utils/kibana_react.mock'; +import { AlertsPage } from './alerts'; + +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useLocation: jest.fn(), +})); const mockUseKibanaReturnValue = kibanaStartMock.startContract(); mockUseKibanaReturnValue.services.application.capabilities = { @@ -49,6 +53,8 @@ jest.mock('../../utils/kibana_react', () => ({ })), })); +const useLocationMock = useLocation as jest.Mock; + jest.mock('@kbn/kibana-react-plugin/public', () => ({ __esModule: true, useKibana: jest.fn(() => mockUseKibanaReturnValue), @@ -167,6 +173,7 @@ describe('AlertsPage with all capabilities', () => { beforeEach(() => { fetchActiveMaintenanceWindowsMock.mockClear(); useTimeBuckets.mockReturnValue(timeBuckets); + useLocationMock.mockReturnValue({ pathname: '/alerts', search: '', state: '', hash: '' }); }); it('should render an alerts page template', async () => { diff --git a/x-pack/plugins/observability/public/pages/overview/components/header_menu/header_menu.tsx b/x-pack/plugins/observability/public/pages/overview/components/header_menu/header_menu.tsx index be167785e2bad..7a21eb1d2248c 100644 --- a/x-pack/plugins/observability/public/pages/overview/components/header_menu/header_menu.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/header_menu/header_menu.tsx @@ -8,10 +8,11 @@ import { EuiHeaderLink, EuiHeaderLinks } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; - -import { useKibana } from '../../../../utils/kibana_react'; +import { useLocation } from 'react-router-dom'; import { usePluginContext } from '../../../../hooks/use_plugin_context'; +import { useKibana } from '../../../../utils/kibana_react'; import HeaderMenuPortal from './header_menu_portal'; + const SLO_FEEDBACK_LINK = 'https://ela.st/slo-feedback'; export function HeaderMenu(): React.ReactElement | null { @@ -25,19 +26,26 @@ export function HeaderMenu(): React.ReactElement | null { appMountParameters: { setHeaderActionMenu }, } = usePluginContext(); + const { pathname } = useLocation(); + const path = pathname?.split('/').slice(1)[0] ?? ''; + const isSloRelatedPath = path === 'slos'; + return ( - - {i18n.translate('xpack.observability.slo.giveFeedback', { - defaultMessage: 'Give feedback', - })} - + {isSloRelatedPath ? ( + + {i18n.translate('xpack.observability.slo.giveFeedback', { + defaultMessage: 'Give feedback', + })} + + ) : null} ({ + ...jest.requireActual('react-router-dom'), + useLocation: jest.fn(), +})); + jest.mock('../../utils/kibana_react', () => ({ __esModule: true, useKibana: jest.fn(() => ({ @@ -39,6 +44,8 @@ jest.mock('@kbn/triggers-actions-ui-plugin/public', () => ({ useLoadRuleTypesQuery: jest.fn(), })); +const useLocationMock = useLocation as jest.Mock; + jest.spyOn(pluginContext, 'usePluginContext').mockImplementation(() => ({ appMountParameters: { setHeaderActionMenu: () => {}, @@ -63,6 +70,10 @@ jest.spyOn(pluginContext, 'usePluginContext').mockImplementation(() => ({ const { useLoadRuleTypesQuery } = jest.requireMock('@kbn/triggers-actions-ui-plugin/public'); describe('RulesPage with all capabilities', () => { + beforeEach(() => { + useLocationMock.mockReturnValue({ pathname: '/rules', search: '', state: '', hash: '' }); + }); + async function setup() { const ruleTypeIndex = new Map( Object.entries({ diff --git a/x-pack/plugins/observability/public/pages/rules/rules.tsx b/x-pack/plugins/observability/public/pages/rules/rules.tsx index 47c3d2d568dda..1b8d20d580d30 100644 --- a/x-pack/plugins/observability/public/pages/rules/rules.tsx +++ b/x-pack/plugins/observability/public/pages/rules/rules.tsx @@ -5,21 +5,20 @@ * 2.0. */ -import React, { lazy, useState } from 'react'; -import { useHistory } from 'react-router-dom'; -import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiButtonEmpty } from '@elastic/eui'; +import { EuiButton, EuiButtonEmpty, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { ALERTS_FEATURE_ID } from '@kbn/alerting-plugin/common'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { ALERTS_FEATURE_ID } from '@kbn/alerting-plugin/common'; import { useBreadcrumbs } from '@kbn/observability-shared-plugin/public'; - import { AlertConsumers } from '@kbn/rule-data-utils'; import { useLoadRuleTypesQuery } from '@kbn/triggers-actions-ui-plugin/public'; +import React, { lazy, useState } from 'react'; +import { useHistory } from 'react-router-dom'; +import { observabilityRuleCreationValidConsumers } from '../../../common/constants'; import { RULES_LOGS_PATH, RULES_PATH } from '../../../common/locators/paths'; -import { useKibana } from '../../utils/kibana_react'; -import { usePluginContext } from '../../hooks/use_plugin_context'; import { useGetFilteredRuleTypes } from '../../hooks/use_get_filtered_rule_types'; -import { observabilityRuleCreationValidConsumers } from '../../../common/constants'; +import { usePluginContext } from '../../hooks/use_plugin_context'; +import { useKibana } from '../../utils/kibana_react'; import { HeaderMenu } from '../overview/components/header_menu/header_menu'; import { RulesTab } from './rules_tab'; diff --git a/x-pack/plugins/observability/public/pages/slo_details/components/events_chart_panel.tsx b/x-pack/plugins/observability/public/pages/slo_details/components/events_chart_panel.tsx index fdb911c80c206..2cca59fad87af 100644 --- a/x-pack/plugins/observability/public/pages/slo_details/components/events_chart_panel.tsx +++ b/x-pack/plugins/observability/public/pages/slo_details/components/events_chart_panel.tsx @@ -6,10 +6,14 @@ */ import { + AnnotationDomainType, + AreaSeries, Axis, BarSeries, Chart, + LineAnnotation, Position, + RectAnnotation, ScaleType, Settings, Tooltip, @@ -28,11 +32,13 @@ import { import numeral from '@elastic/numeral'; import { useActiveCursor } from '@kbn/charts-plugin/public'; import { i18n } from '@kbn/i18n'; -import { SLOWithSummaryResponse } from '@kbn/slo-schema'; +import { ALL_VALUE, SLOWithSummaryResponse } from '@kbn/slo-schema'; import moment from 'moment'; import React, { useRef } from 'react'; +import { max, min } from 'lodash'; import { useGetPreviewData } from '../../../hooks/slo/use_get_preview_data'; import { useKibana } from '../../../utils/kibana_react'; +import { COMPARATOR_MAPPING } from '../../slo_edit/constants'; export interface Props { slo: SLOWithSummaryResponse; @@ -45,7 +51,8 @@ export interface Props { export function EventsChartPanel({ slo, range }: Props) { const { charts, uiSettings } = useKibana().services; const { euiTheme } = useEuiTheme(); - const { isLoading, data } = useGetPreviewData(true, slo.indicator, range); + const filter = slo.instanceId !== ALL_VALUE ? `${slo.groupBy}: "${slo.instanceId}"` : ''; + const { isLoading, data } = useGetPreviewData(true, slo.indicator, range, slo.objective, filter); const baseTheme = charts.theme.useChartsBaseTheme(); const chartRef = useRef(null); const handleCursorUpdate = useActiveCursor(charts.activeCursor, chartRef, { @@ -54,19 +61,87 @@ export function EventsChartPanel({ slo, range }: Props) { const dateFormat = uiSettings.get('dateFormat'); + const title = + slo.indicator.type !== 'sli.metric.timeslice' ? ( + +

+ {i18n.translate('xpack.observability.slo.sloDetails.eventsChartPanel.title', { + defaultMessage: 'Good vs bad events', + })} +

+
+ ) : ( + +

+ {i18n.translate('xpack.observability.slo.sloDetails.eventsChartPanel.timesliceTitle', { + defaultMessage: 'Timeslice metric', + })} +

+
+ ); + const threshold = + slo.indicator.type === 'sli.metric.timeslice' + ? slo.indicator.params.metric.threshold + : undefined; + const yAxisNumberFormat = slo.indicator.type === 'sli.metric.timeslice' ? '0,0[.00]' : '0,0'; + + const values = (data || []).map((row) => { + if (slo.indicator.type === 'sli.metric.timeslice') { + return row.sliValue; + } else { + return row?.events?.total || 0; + } + }); + const maxValue = max(values); + const minValue = min(values); + const domain = { + fit: true, + min: + threshold != null && minValue != null && threshold < minValue ? threshold : minValue || NaN, + max: + threshold != null && maxValue != null && threshold > maxValue ? threshold : maxValue || NaN, + }; + + const annotation = + slo.indicator.type === 'sli.metric.timeslice' && threshold ? ( + <> + {threshold}} + markerPosition="right" + /> + + + ) : null; + return ( - - -

- {i18n.translate('xpack.observability.slo.sloDetails.eventsChartPanel.title', { - defaultMessage: 'Good vs bad events', - })} -

-
-
+ {title} {i18n.translate('xpack.observability.slo.sloDetails.eventsChartPanel.duration', { @@ -84,7 +159,7 @@ export function EventsChartPanel({ slo, range }: Props) { + {annotation} numeral(d).format('0,0')} + tickFormat={(d) => numeral(d).format(yAxisNumberFormat)} + domain={domain} /> - ({ - key: new Date(datum.date).getTime(), - value: datum.events?.good, - })) ?? [] - } - /> + {slo.indicator.type !== 'sli.metric.timeslice' ? ( + <> + ({ + key: new Date(datum.date).getTime(), + value: datum.events?.good, + })) ?? [] + } + /> - ({ - key: new Date(datum.date).getTime(), - value: datum.events?.bad, - })) ?? [] - } - /> + ({ + key: new Date(datum.date).getTime(), + value: datum.events?.bad, + })) ?? [] + } + /> + + ) : ( + ({ + date: new Date(datum.date).getTime(), + value: datum.sliValue >= 0 ? datum.sliValue : null, + }))} + /> + )} )} diff --git a/x-pack/plugins/observability/public/pages/slo_details/components/slo_details.tsx b/x-pack/plugins/observability/public/pages/slo_details/components/slo_details.tsx index 122ecd0c07aac..9de1d11a6849f 100644 --- a/x-pack/plugins/observability/public/pages/slo_details/components/slo_details.tsx +++ b/x-pack/plugins/observability/public/pages/slo_details/components/slo_details.tsx @@ -160,11 +160,9 @@ export function SloDetails({ slo, isAutoRefreshing }: Props) { slo={slo} /> - {slo.indicator.type !== 'sli.metric.timeslice' ? ( - - - - ) : null} + + +
diff --git a/x-pack/plugins/observability/public/pages/slo_details/slo_details.test.tsx b/x-pack/plugins/observability/public/pages/slo_details/slo_details.test.tsx index 22691aaa2b49c..9d0837bd6fc69 100644 --- a/x-pack/plugins/observability/public/pages/slo_details/slo_details.test.tsx +++ b/x-pack/plugins/observability/public/pages/slo_details/slo_details.test.tsx @@ -5,37 +5,35 @@ * 2.0. */ -import React from 'react'; -import { fireEvent, screen, waitFor } from '@testing-library/react'; +import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; import type { Capabilities } from '@kbn/core/public'; import { observabilityAIAssistantPluginMock } from '@kbn/observability-ai-assistant-plugin/public/mock'; - -import { useKibana } from '../../utils/kibana_react'; -import { useParams, useLocation } from 'react-router-dom'; -import { useLicense } from '../../hooks/use_license'; -import { useCapabilities } from '../../hooks/slo/use_capabilities'; -import { useFetchSloDetails } from '../../hooks/slo/use_fetch_slo_details'; -import { useFetchHistoricalSummary } from '../../hooks/slo/use_fetch_historical_summary'; -import { useFetchActiveAlerts } from '../../hooks/slo/use_fetch_active_alerts'; -import { ActiveAlerts } from '../../hooks/slo/active_alerts'; -import { useDeleteSlo } from '../../hooks/slo/use_delete_slo'; -import { render } from '../../utils/test_helper'; -import { SloDetailsPage } from './slo_details'; -import { buildSlo } from '../../data/slo/slo'; +import { encode } from '@kbn/rison'; +import { ALL_VALUE } from '@kbn/slo-schema'; +import { fireEvent, screen, waitFor } from '@testing-library/react'; +import React from 'react'; +import Router from 'react-router-dom'; import { paths } from '../../../common/locators/paths'; import { HEALTHY_STEP_DOWN_ROLLING_SLO, historicalSummaryData, } from '../../data/slo/historical_summary_data'; -import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; import { buildApmAvailabilityIndicator } from '../../data/slo/indicator'; -import { ALL_VALUE } from '@kbn/slo-schema'; -import { encode } from '@kbn/rison'; +import { buildSlo } from '../../data/slo/slo'; +import { ActiveAlerts } from '../../hooks/slo/active_alerts'; +import { useCapabilities } from '../../hooks/slo/use_capabilities'; +import { useDeleteSlo } from '../../hooks/slo/use_delete_slo'; +import { useFetchActiveAlerts } from '../../hooks/slo/use_fetch_active_alerts'; +import { useFetchHistoricalSummary } from '../../hooks/slo/use_fetch_historical_summary'; +import { useFetchSloDetails } from '../../hooks/slo/use_fetch_slo_details'; +import { useLicense } from '../../hooks/use_license'; +import { useKibana } from '../../utils/kibana_react'; +import { render } from '../../utils/test_helper'; +import { SloDetailsPage } from './slo_details'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), useParams: jest.fn(), - useLocation: jest.fn(), })); jest.mock('@kbn/observability-shared-plugin/public'); @@ -48,8 +46,7 @@ jest.mock('../../hooks/slo/use_fetch_historical_summary'); jest.mock('../../hooks/slo/use_delete_slo'); const useKibanaMock = useKibana as jest.Mock; -const useParamsMock = useParams as jest.Mock; -const useLocationMock = useLocation as jest.Mock; + const useLicenseMock = useLicense as jest.Mock; const useCapabilitiesMock = useCapabilities as jest.Mock; const useFetchActiveAlertsMock = useFetchActiveAlerts as jest.Mock; @@ -120,13 +117,15 @@ describe('SLO Details Page', () => { }); useFetchActiveAlertsMock.mockReturnValue({ isLoading: false, data: new ActiveAlerts() }); useDeleteSloMock.mockReturnValue({ mutate: mockDelete }); - useLocationMock.mockReturnValue({ search: '' }); + jest + .spyOn(Router, 'useLocation') + .mockReturnValue({ pathname: '/slos/1234', search: '', state: '', hash: '' }); }); describe('when the incorrect license is found', () => { it('navigates to the SLO List page', async () => { const slo = buildSlo(); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => false }); @@ -137,7 +136,7 @@ describe('SLO Details Page', () => { }); it('renders the PageNotFound when the SLO cannot be found', async () => { - useParamsMock.mockReturnValue('nonexistent'); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: 'nonexistent' }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: undefined }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); @@ -148,7 +147,7 @@ describe('SLO Details Page', () => { it('renders the loading spinner when fetching the SLO', async () => { const slo = buildSlo(); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: true, data: undefined }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); @@ -161,7 +160,7 @@ describe('SLO Details Page', () => { it('renders the SLO details page with loading charts when summary data is loading', async () => { const slo = buildSlo({ id: HEALTHY_STEP_DOWN_ROLLING_SLO }); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); useFetchHistoricalSummaryMock.mockReturnValue({ @@ -180,7 +179,7 @@ describe('SLO Details Page', () => { it('renders the SLO details page with the overview and chart panels', async () => { const slo = buildSlo({ id: HEALTHY_STEP_DOWN_ROLLING_SLO }); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); @@ -196,7 +195,7 @@ describe('SLO Details Page', () => { it("renders a 'Edit' button under actions menu", async () => { const slo = buildSlo(); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); @@ -208,7 +207,7 @@ describe('SLO Details Page', () => { it("renders a 'Create alert rule' button under actions menu", async () => { const slo = buildSlo(); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); @@ -220,7 +219,7 @@ describe('SLO Details Page', () => { it("renders a 'Manage rules' button under actions menu", async () => { const slo = buildSlo(); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); @@ -232,7 +231,7 @@ describe('SLO Details Page', () => { it("renders a 'Clone' button under actions menu", async () => { const slo = buildSlo(); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); @@ -257,7 +256,7 @@ describe('SLO Details Page', () => { it("renders a 'Delete' button under actions menu", async () => { const slo = buildSlo(); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); @@ -287,7 +286,7 @@ describe('SLO Details Page', () => { it('renders the Overview tab by default', async () => { const slo = buildSlo(); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); useFetchActiveAlertsMock.mockReturnValue({ @@ -306,7 +305,7 @@ describe('SLO Details Page', () => { describe('when an APM SLO is loaded', () => { it("renders a 'Explore in APM' button under actions menu", async () => { const slo = buildSlo({ indicator: buildApmAvailabilityIndicator() }); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); @@ -320,7 +319,7 @@ describe('SLO Details Page', () => { describe('when an Custom KQL SLO is loaded', () => { it("does not render a 'Explore in APM' button under actions menu", async () => { const slo = buildSlo(); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); diff --git a/x-pack/plugins/observability/public/pages/slo_edit/components/common/data_preview_chart.tsx b/x-pack/plugins/observability/public/pages/slo_edit/components/common/data_preview_chart.tsx index 8fd1039c0c53c..fc805118d6f3a 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/components/common/data_preview_chart.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/components/common/data_preview_chart.tsx @@ -48,6 +48,7 @@ interface DataPreviewChartProps { thresholdDirection?: 'above' | 'below'; thresholdColor?: string; thresholdMessage?: string; + ignoreMoreThan100?: boolean; } const ONE_HOUR_IN_MILLISECONDS = 1 * 60 * 60 * 1000; @@ -58,6 +59,7 @@ export function DataPreviewChart({ thresholdDirection, thresholdColor, thresholdMessage, + ignoreMoreThan100, }: DataPreviewChartProps) { const { watch, getFieldState, formState, getValues } = useFormContext(); const { charts, uiSettings } = useKibana().services; @@ -80,7 +82,7 @@ export function DataPreviewChart({ isError, } = useDebouncedGetPreviewData(isIndicatorSectionValid, watch('indicator'), range); - const isMoreThan100 = previewData?.find((row) => row.sliValue > 1) != null; + const isMoreThan100 = !ignoreMoreThan100 && previewData?.find((row) => row.sliValue > 1) != null; const baseTheme = charts.theme.useChartsBaseTheme(); const dateFormat = uiSettings.get('dateFormat'); diff --git a/x-pack/plugins/observability/public/pages/slo_edit/components/timeslice_metric/timeslice_metric_indicator.tsx b/x-pack/plugins/observability/public/pages/slo_edit/components/timeslice_metric/timeslice_metric_indicator.tsx index 1c01219ffe1a2..acc6344f732ad 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/components/timeslice_metric/timeslice_metric_indicator.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/components/timeslice_metric/timeslice_metric_indicator.tsx @@ -179,6 +179,7 @@ export function TimesliceMetricIndicatorTypeForm() { thresholdDirection={['GT', 'GTE'].includes(comparator) ? 'above' : 'below'} thresholdColor={euiTheme.colors.warning} thresholdMessage={`${COMPARATOR_MAPPING[comparator]} ${threshold}`} + ignoreMoreThan100 />
diff --git a/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx b/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx index 20b2c89287a3c..fc1a3cef31d5a 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx @@ -5,12 +5,14 @@ * 2.0. */ -import { fireEvent, waitFor, cleanup } from '@testing-library/react'; +import { ILicense } from '@kbn/licensing-plugin/common/types'; +import { licensingMock } from '@kbn/licensing-plugin/public/mocks'; +import { observabilityAIAssistantPluginMock } from '@kbn/observability-ai-assistant-plugin/public/mock'; +import { cleanup, fireEvent, waitFor } from '@testing-library/react'; import { createBrowserHistory } from 'history'; import React from 'react'; import Router from 'react-router-dom'; -import { observabilityAIAssistantPluginMock } from '@kbn/observability-ai-assistant-plugin/public/mock'; - +import { BehaviorSubject } from 'rxjs'; import { paths } from '../../../common/locators/paths'; import { buildSlo } from '../../data/slo/slo'; import { useCapabilities } from '../../hooks/slo/use_capabilities'; @@ -26,9 +28,6 @@ import { kibanaStartMock } from '../../utils/kibana_react.mock'; import { render } from '../../utils/test_helper'; import { SLO_EDIT_FORM_DEFAULT_VALUES } from './constants'; import { SloEditPage } from './slo_edit'; -import { licensingMock } from '@kbn/licensing-plugin/public/mocks'; -import { BehaviorSubject } from 'rxjs'; -import { ILicense } from '@kbn/licensing-plugin/common/types'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), @@ -197,7 +196,7 @@ describe('SLO Edit Page', () => { jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: '1234' }); jest .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); + .mockReturnValue({ pathname: '/slos/1234/edit', search: '', state: '', hash: '' }); useFetchSloMock.mockReturnValue({ isLoading: false, data: undefined }); @@ -220,7 +219,7 @@ describe('SLO Edit Page', () => { jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: '1234' }); jest .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); + .mockReturnValue({ pathname: '/slos/1234/edit', search: '', state: '', hash: '' }); useFetchSloMock.mockReturnValue({ isLoading: false, data: undefined }); @@ -251,7 +250,7 @@ describe('SLO Edit Page', () => { jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: '1234' }); jest .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); + .mockReturnValue({ pathname: '/slos/1234/edit', search: '', state: '', hash: '' }); useFetchSloMock.mockReturnValue({ isLoading: false, data: undefined }); @@ -270,7 +269,7 @@ describe('SLO Edit Page', () => { jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: undefined }); jest .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); + .mockReturnValue({ pathname: '/slos/1234/edit', search: '', state: '', hash: '' }); const { queryByTestId } = render(); @@ -295,7 +294,7 @@ describe('SLO Edit Page', () => { ); jest .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); + .mockReturnValue({ pathname: '/slos/create', search: '', state: '', hash: '' }); useFetchApmSuggestionsMock.mockReturnValue({ suggestions: ['cartService'], @@ -327,7 +326,7 @@ describe('SLO Edit Page', () => { jest .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); + .mockReturnValue({ pathname: '/slos/123Foo/edit', search: '', state: '', hash: '' }); const { queryByTestId } = render(); @@ -373,7 +372,7 @@ describe('SLO Edit Page', () => { ); jest .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); + .mockReturnValue({ pathname: '/slos/123/edit', search: '', state: '', hash: '' }); useFetchSloMock.mockReturnValue({ isLoading: false, data: slo }); @@ -410,7 +409,7 @@ describe('SLO Edit Page', () => { jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: '123' }); jest .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); + .mockReturnValue({ pathname: '/slos/123/edit', search: '', state: '', hash: '' }); useFetchSloMock.mockReturnValue({ isLoading: false, data: slo }); @@ -432,7 +431,7 @@ describe('SLO Edit Page', () => { jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: '123' }); jest .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); + .mockReturnValue({ pathname: '/slos/123/edit', search: '', state: '', hash: '' }); useFetchSloMock.mockReturnValue({ isLoading: false, data: slo }); @@ -456,9 +455,12 @@ describe('SLO Edit Page', () => { const slo = buildSlo(); jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: '123' }); - jest - .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: 'create-rule=true', state: '', hash: '' }); + jest.spyOn(Router, 'useLocation').mockReturnValue({ + pathname: '/slos/123/edit', + search: 'create-rule=true', + state: '', + hash: '', + }); useFetchSloMock.mockReturnValue({ isLoading: false, data: slo }); diff --git a/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.tsx b/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.tsx index 052ef26cd758b..f14f1d7a1446e 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.tsx @@ -11,7 +11,6 @@ import { i18n } from '@kbn/i18n'; import { useBreadcrumbs } from '@kbn/observability-shared-plugin/public'; import { createHtmlPortalNode, OutPortal } from 'react-reverse-portal'; -import { FeedbackButton } from '../alert_details/components/feedback_button'; import { paths } from '../../../common/locators/paths'; import { useKibana } from '../../utils/kibana_react'; import { usePluginContext } from '../../hooks/use_plugin_context'; @@ -79,7 +78,7 @@ export function SloEditPage() { : i18n.translate('xpack.observability.sloCreatePageTitle', { defaultMessage: 'Create new SLO', }), - rightSideItems: [, ], + rightSideItems: [], bottomBorder: false, }} data-test-subj="slosEditPage" diff --git a/x-pack/plugins/observability/public/pages/slos/slos.test.tsx b/x-pack/plugins/observability/public/pages/slos/slos.test.tsx index ca09a51af1464..a785be9f9a81a 100644 --- a/x-pack/plugins/observability/public/pages/slos/slos.test.tsx +++ b/x-pack/plugins/observability/public/pages/slos/slos.test.tsx @@ -5,12 +5,13 @@ * 2.0. */ -import { act, fireEvent, screen, waitFor } from '@testing-library/react'; -import React from 'react'; -import { observabilityAIAssistantPluginMock } from '@kbn/observability-ai-assistant-plugin/public/mock'; import { waitForEuiPopoverOpen } from '@elastic/eui/lib/test/rtl'; import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; - +import { observabilityAIAssistantPluginMock } from '@kbn/observability-ai-assistant-plugin/public/mock'; +import { encode } from '@kbn/rison'; +import { act, fireEvent, screen, waitFor } from '@testing-library/react'; +import React from 'react'; +import Router from 'react-router-dom'; import { paths } from '../../../common/locators/paths'; import { historicalSummaryData } from '../../data/slo/historical_summary_data'; import { emptySloList, sloList } from '../../data/slo/slo'; @@ -23,7 +24,6 @@ import { useLicense } from '../../hooks/use_license'; import { useKibana } from '../../utils/kibana_react'; import { render } from '../../utils/test_helper'; import { SlosPage } from './slos'; -import { encode } from '@kbn/rison'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), @@ -127,6 +127,9 @@ describe('SLOs Page', () => { jest.clearAllMocks(); mockKibana(); useCapabilitiesMock.mockReturnValue({ hasWriteCapabilities: true, hasReadCapabilities: true }); + jest + .spyOn(Router, 'useLocation') + .mockReturnValue({ pathname: '/slos', search: '', state: '', hash: '' }); }); describe('when the incorrect license is found', () => { diff --git a/x-pack/plugins/observability/public/pages/slos_welcome/slos_welcome.test.tsx b/x-pack/plugins/observability/public/pages/slos_welcome/slos_welcome.test.tsx index 8290ecc2988be..f967b6cb40c69 100644 --- a/x-pack/plugins/observability/public/pages/slos_welcome/slos_welcome.test.tsx +++ b/x-pack/plugins/observability/public/pages/slos_welcome/slos_welcome.test.tsx @@ -5,19 +5,24 @@ * 2.0. */ -import React from 'react'; +import { observabilityAIAssistantPluginMock } from '@kbn/observability-ai-assistant-plugin/public/mock'; import { screen, waitFor } from '@testing-library/react'; - -import { render } from '../../utils/test_helper'; -import { useKibana } from '../../utils/kibana_react'; -import { useFetchSloList } from '../../hooks/slo/use_fetch_slo_list'; +import React from 'react'; +import Router from 'react-router-dom'; +import { paths } from '../../../common/locators/paths'; +import { emptySloList, sloList } from '../../data/slo/slo'; +import { useCapabilities } from '../../hooks/slo/use_capabilities'; import { useFetchSloGlobalDiagnosis } from '../../hooks/slo/use_fetch_global_diagnosis'; +import { useFetchSloList } from '../../hooks/slo/use_fetch_slo_list'; import { useLicense } from '../../hooks/use_license'; +import { useKibana } from '../../utils/kibana_react'; +import { render } from '../../utils/test_helper'; import { SlosWelcomePage } from './slos_welcome'; -import { emptySloList, sloList } from '../../data/slo/slo'; -import { useCapabilities } from '../../hooks/slo/use_capabilities'; -import { paths } from '../../../common/locators/paths'; -import { observabilityAIAssistantPluginMock } from '@kbn/observability-ai-assistant-plugin/public/mock'; + +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useParams: jest.fn(), +})); jest.mock('@kbn/observability-shared-plugin/public'); jest.mock('../../utils/kibana_react'); @@ -56,6 +61,9 @@ describe('SLOs Welcome Page', () => { jest.clearAllMocks(); mockKibana(); useCapabilitiesMock.mockReturnValue({ hasWriteCapabilities: true, hasReadCapabilities: true }); + jest + .spyOn(Router, 'useLocation') + .mockReturnValue({ pathname: '/slos/welcome', search: '', state: '', hash: '' }); }); describe('when the incorrect license is found', () => { diff --git a/x-pack/plugins/observability/server/index.ts b/x-pack/plugins/observability/server/index.ts index 3d9e87ccadf00..682d05e2f249f 100644 --- a/x-pack/plugins/observability/server/index.ts +++ b/x-pack/plugins/observability/server/index.ts @@ -19,7 +19,7 @@ import { WrappedElasticsearchClientError, } from '../common/utils/unwrap_es_response'; -export { rangeQuery, kqlQuery, termQuery, termsQuery } from './utils/queries'; +export { rangeQuery, kqlQuery, termQuery, termsQuery, wildcardQuery } from './utils/queries'; export { getParsedFilterQuery } from './utils/get_parsed_filtered_query'; export { getInspectResponse } from '../common/utils/get_inspect_response'; diff --git a/x-pack/plugins/observability/server/services/slo/get_preview_data.ts b/x-pack/plugins/observability/server/services/slo/get_preview_data.ts index c1cd4d0d6caf1..0aa7ffbf94119 100644 --- a/x-pack/plugins/observability/server/services/slo/get_preview_data.ts +++ b/x-pack/plugins/observability/server/services/slo/get_preview_data.ts @@ -86,6 +86,10 @@ export class GetPreviewData { date_histogram: { field: '@timestamp', fixed_interval: options.interval, + extended_bounds: { + min: options.range.start, + max: options.range.end, + }, }, aggs: { _good: { @@ -172,6 +176,10 @@ export class GetPreviewData { date_histogram: { field: '@timestamp', fixed_interval: options.interval, + extended_bounds: { + min: options.range.start, + max: options.range.end, + }, }, aggs: { good: { @@ -233,6 +241,10 @@ export class GetPreviewData { date_histogram: { field: timestampField, fixed_interval: options.interval, + extended_bounds: { + min: options.range.start, + max: options.range.end, + }, }, aggs: { ...getHistogramIndicatorAggregations.execute({ @@ -284,6 +296,10 @@ export class GetPreviewData { date_histogram: { field: timestampField, fixed_interval: options.interval, + extended_bounds: { + min: options.range.start, + max: options.range.end, + }, }, aggs: { ...getCustomMetricIndicatorAggregation.execute({ @@ -337,6 +353,10 @@ export class GetPreviewData { date_histogram: { field: timestampField, fixed_interval: options.interval, + extended_bounds: { + min: options.range.start, + max: options.range.end, + }, }, aggs: { ...getCustomMetricIndicatorAggregation.execute('metric'), @@ -376,6 +396,10 @@ export class GetPreviewData { date_histogram: { field: timestampField, fixed_interval: options.interval, + extended_bounds: { + min: options.range.start, + max: options.range.end, + }, }, aggs: { good: { filter: goodQuery }, @@ -402,12 +426,21 @@ export class GetPreviewData { public async execute(params: GetPreviewDataParams): Promise { try { - const bucketSize = Math.max( - calculateAuto - .near(100, moment.duration(params.range.end - params.range.start, 'ms')) - ?.asMinutes() ?? 0, - 1 - ); + // If the time range is 24h or less, then we want to use a 1m bucket for the + // Timeslice metric so that the chart is as close to the evaluation as possible. + // Otherwise due to how the statistics work, the values might not look like + // they've breached the threshold. + const bucketSize = + params.indicator.type === 'sli.metric.timeslice' && + params.range.end - params.range.start <= 86_400_000 && + params.objective?.timesliceWindow + ? params.objective.timesliceWindow.asMinutes() + : Math.max( + calculateAuto + .near(100, moment.duration(params.range.end - params.range.start, 'ms')) + ?.asMinutes() ?? 0, + 1 + ); const options: Options = { range: params.range, interval: `${bucketSize}m`, diff --git a/x-pack/plugins/observability/server/ui_settings.ts b/x-pack/plugins/observability/server/ui_settings.ts index f58b6dd1f9683..0ccd75c9ae3a3 100644 --- a/x-pack/plugins/observability/server/ui_settings.ts +++ b/x-pack/plugins/observability/server/ui_settings.ts @@ -298,8 +298,8 @@ export const uiSettings: Record = { }, }), schema: schema.boolean(), - value: false, - requiresPageReload: false, + value: true, + requiresPageReload: true, type: 'boolean', }, [apmAWSLambdaPriceFactor]: { diff --git a/x-pack/plugins/observability/server/utils/queries.test.ts b/x-pack/plugins/observability/server/utils/queries.test.ts new file mode 100644 index 0000000000000..0e34f84050386 --- /dev/null +++ b/x-pack/plugins/observability/server/utils/queries.test.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { wildcardQuery } from './queries'; // Replace 'your-module' with the actual module path + +describe('wildcardQuery', () => { + it('generates wildcard query with leading wildcard by default', () => { + const result = wildcardQuery('fieldName', 'value'); + expect(result).toEqual([ + { + wildcard: { + fieldName: { + value: '*value*', + case_insensitive: true, + }, + }, + }, + ]); + }); + + it('generates wildcard query without leading wildcard if specified in options', () => { + const result = wildcardQuery('fieldName', 'value', { leadingWildcard: false }); + expect(result).toEqual([ + { + wildcard: { + fieldName: { + value: 'value*', + case_insensitive: true, + }, + }, + }, + ]); + }); + + it('returns an empty array if value is undefined', () => { + const result = wildcardQuery('fieldName', undefined); + expect(result).toEqual([]); + }); +}); diff --git a/x-pack/plugins/observability/server/utils/queries.ts b/x-pack/plugins/observability/server/utils/queries.ts index 4715e0f398e4a..bdacad577838c 100644 --- a/x-pack/plugins/observability/server/utils/queries.ts +++ b/x-pack/plugins/observability/server/utils/queries.ts @@ -31,6 +31,27 @@ export function termQuery( return [{ term: { [field]: value } }]; } +export function wildcardQuery( + field: T, + value: string | undefined, + opts = { leadingWildcard: true } +): QueryDslQueryContainer[] { + if (isUndefinedOrNull(value)) { + return []; + } + + return [ + { + wildcard: { + [field]: { + value: opts.leadingWildcard ? `*${value}*` : `${value}*`, + case_insensitive: true, + }, + }, + }, + ]; +} + export function termsQuery( field: string, ...values: Array diff --git a/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/logs/custom_logs/install_elastic_agent.cy.ts b/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/logs/custom_logs/install_elastic_agent.cy.ts index c4d5edee7d3af..3f85bb560fa6f 100644 --- a/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/logs/custom_logs/install_elastic_agent.cy.ts +++ b/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/logs/custom_logs/install_elastic_agent.cy.ts @@ -618,11 +618,11 @@ describe('[Logs onboarding] Custom logs - install elastic agent', () => { .should('exist'); }); - it('when user clicks on Explore Logs it navigates to observability log explorer', () => { + it('when user clicks on Explore Logs it navigates to observability logs explorer', () => { cy.wait('@checkOnboardingProgress'); cy.getByTestSubj('obltOnboardingExploreLogs').should('exist').click(); - cy.url().should('include', '/app/observability-log-explorer'); + cy.url().should('include', '/app/observability-logs-explorer'); cy.get('[data-test-subj="datasetSelectorPopoverButton"]') .contains('[Mylogs] mylogs', { matchCase: false }) .should('exist'); diff --git a/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/logs/system_logs.cy.ts b/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/logs/system_logs.cy.ts index 80d5e042c1239..8b95d171a70ef 100644 --- a/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/logs/system_logs.cy.ts +++ b/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/logs/system_logs.cy.ts @@ -673,11 +673,11 @@ describe('[Logs onboarding] System logs', () => { cy.visitKibana('/app/observabilityOnboarding/systemLogs'); }); - it('when users clicks on Explore logs they navigate to log explorer - All logs', () => { + it('when users clicks on Explore logs they navigate to logs explorer - All logs', () => { cy.wait('@systemIntegrationInstall'); cy.getByTestSubj('obltOnboardingExploreLogs').should('exist').click(); - cy.url().should('include', '/app/observability-log-explorer'); + cy.url().should('include', '/app/observability-logs-explorer'); cy.get('button').contains('All logs').should('exist'); }); }); @@ -692,11 +692,11 @@ describe('[Logs onboarding] System logs', () => { cy.visitKibana('/app/observabilityOnboarding/systemLogs'); }); - it('when users clicks on Explore logs they navigate to log explorer and System integration is selected', () => { + it('when users clicks on Explore logs they navigate to logs explorer and System integration is selected', () => { cy.wait('@systemIntegrationInstall'); cy.getByTestSubj('obltOnboardingExploreLogs').should('exist').click(); - cy.url().should('include', '/app/observability-log-explorer'); + cy.url().should('include', '/app/observability-logs-explorer'); cy.get('button').contains('[System] syslog').should('exist'); }); }); diff --git a/x-pack/plugins/observability_solution/logs_explorer/README.md b/x-pack/plugins/observability_solution/logs_explorer/README.md index 1a46e08981984..31d1f43498e22 100755 --- a/x-pack/plugins/observability_solution/logs_explorer/README.md +++ b/x-pack/plugins/observability_solution/logs_explorer/README.md @@ -1,10 +1,10 @@ -# Log Explorer +# Logs Explorer -This plugin is home to the `` component and related types. It implements several of the underlying concepts that the [Observability Log Explorer app](../observability_solution/observability_logs_explorer) builds upon. +This plugin is home to the `` component and related types. It implements several of the underlying concepts that the [Observability Logs Explorer app](../observability_solution/observability_logs_explorer) builds upon. ## Developing the `` component -⚠ The Log Explorer is in early stages of development, so the following partly describes the current situation and partly the intended future scenario. +⚠ The Logs Explorer is in early stages of development, so the following partly describes the current situation and partly the intended future scenario. ### Dependencies @@ -20,11 +20,11 @@ While not fully realized yet, the dependency graph would roughly resemble the fo ```mermaid flowchart TD -obs_log_explorer_app(Observability Log Explorer app) +obs_log_explorer_app(Observability Logs Explorer app) obs_apps(Other Observability apps) -obs_log_explorer_component(Observability Log Explorer component) +obs_log_explorer_component(Observability Logs Explorer component) other_apps(Other non-Observability apps) -log_explorer_component(Log Explorer component) +log_explorer_component(Logs Explorer component) platform(Kibana Platform) discover(Discover Main container) fleet(Fleet / EPM) @@ -47,7 +47,7 @@ When designing the API we face two conflicting goals: - It should be easy to consume by any non-observability app. This means... - its API needs to be relatively stable and straightforward. - it should not perform any page-wide changes that could interfere with consuming app's page state (such as URL changes). -- It should be extensible so the Observability Log Explorer can build on top of this. +- It should be extensible so the Observability Logs Explorer can build on top of this. In its current state the `` achieves neither goal. To resolve the tension in the future we could export two variants with different sets of properties. diff --git a/x-pack/plugins/observability_solution/logs_explorer/common/constants.ts b/x-pack/plugins/observability_solution/logs_explorer/common/constants.ts index 62cd9af1d05c3..114ba985553a7 100644 --- a/x-pack/plugins/observability_solution/logs_explorer/common/constants.ts +++ b/x-pack/plugins/observability_solution/logs_explorer/common/constants.ts @@ -5,7 +5,7 @@ * 2.0. */ -export const LOG_EXPLORER_PROFILE_ID = 'log-explorer'; +export const LOG_EXPLORER_PROFILE_ID = 'logs-explorer'; // Fields constants export const TIMESTAMP_FIELD = '@timestamp'; diff --git a/x-pack/plugins/observability_solution/logs_explorer/public/components/flyout_detail/flyout_header.tsx b/x-pack/plugins/observability_solution/logs_explorer/public/components/flyout_detail/flyout_header.tsx index f8c34d5dd8346..b26f90145b6a5 100644 --- a/x-pack/plugins/observability_solution/logs_explorer/public/components/flyout_detail/flyout_header.tsx +++ b/x-pack/plugins/observability_solution/logs_explorer/public/components/flyout_detail/flyout_header.tsx @@ -54,7 +54,7 @@ export function FlyoutHeader({ doc }: { doc: FlyoutDoc }) { @@ -71,7 +71,7 @@ export function FlyoutHeader({ doc }: { doc: FlyoutDoc }) { const contentField = hasMessageField && ( - + @@ -110,9 +110,9 @@ export function FlyoutHeader({ doc }: { doc: FlyoutDoc }) { buttonContent={accordionTitle} paddingSize="m" initialIsOpen={true} - data-test-subj={`logExplorerFlyoutHeaderSection${flyoutContentLabel}`} + data-test-subj={`logsExplorerFlyoutHeaderSection${flyoutContentLabel}`} > - + {hasMessageField ? contentField : logLevelAndTimestamp} diff --git a/x-pack/plugins/observability_solution/logs_explorer/public/components/flyout_detail/flyout_highlights.tsx b/x-pack/plugins/observability_solution/logs_explorer/public/components/flyout_detail/flyout_highlights.tsx index 6ee16be2fddae..5e8af29566372 100644 --- a/x-pack/plugins/observability_solution/logs_explorer/public/components/flyout_detail/flyout_highlights.tsx +++ b/x-pack/plugins/observability_solution/logs_explorer/public/components/flyout_detail/flyout_highlights.tsx @@ -49,11 +49,11 @@ export function FlyoutHighlights({ {formattedDoc[constants.SERVICE_NAME_FIELD] && ( {formattedDoc[constants.CLOUD_PROVIDER_FIELD] && ( {formattedDoc[constants.LOG_FILE_PATH_FIELD] && ( + {timestamp} ); diff --git a/x-pack/plugins/observability_solution/logs_explorer/public/components/virtual_columns/content.tsx b/x-pack/plugins/observability_solution/logs_explorer/public/components/virtual_columns/content.tsx index 42fd21e89141b..5e485cb03c99b 100644 --- a/x-pack/plugins/observability_solution/logs_explorer/public/components/virtual_columns/content.tsx +++ b/x-pack/plugins/observability_solution/logs_explorer/public/components/virtual_columns/content.tsx @@ -31,9 +31,9 @@ const LogMessage = ({ field, value }: { field?: string; value: string }) => { return ( {renderFieldPrefix && ( - {field} + {field} )} - + {value} @@ -108,7 +108,7 @@ export const Content = ({ fieldFormats={fieldFormats} shouldShowFieldHandler={shouldShowFieldHandler} maxEntries={50} - dataTestSubj="logExplorerCellDescriptionList" + dataTestSubj="logsExplorerCellDescriptionList" className="logsExplorerVirtualColumn__sourceDocument" /> )} diff --git a/x-pack/plugins/observability_solution/logs_explorer/public/customizations/custom_flyout_content.tsx b/x-pack/plugins/observability_solution/logs_explorer/public/customizations/custom_flyout_content.tsx index cd74ed1c4c81c..958070c6041a2 100644 --- a/x-pack/plugins/observability_solution/logs_explorer/public/customizations/custom_flyout_content.tsx +++ b/x-pack/plugins/observability_solution/logs_explorer/public/customizations/custom_flyout_content.tsx @@ -46,7 +46,7 @@ const CustomFlyoutContent = ({ <> - {/* Apply custom Log Explorer detail */} + {/* Apply custom Logs Explorer detail */} {renderCustomizedContent(flyoutContentProps)} diff --git a/x-pack/plugins/observability_solution/logs_explorer/public/utils/get_data_view_test_subj.ts b/x-pack/plugins/observability_solution/logs_explorer/public/utils/get_data_view_test_subj.ts index 8cf915b64691c..0beda0992aacf 100644 --- a/x-pack/plugins/observability_solution/logs_explorer/public/utils/get_data_view_test_subj.ts +++ b/x-pack/plugins/observability_solution/logs_explorer/public/utils/get_data_view_test_subj.ts @@ -5,7 +5,7 @@ * 2.0. */ -const BASE_DATA_VIEW_TEST_SUBJ = 'logExplorerDataView'; +const BASE_DATA_VIEW_TEST_SUBJ = 'logsExplorerDataView'; const publicDataViewPatternsSet = new Set(['logs-*', 'logstash-*', 'filebeat-*']); diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/README.md b/x-pack/plugins/observability_solution/observability_logs_explorer/README.md index ae3c50138ab46..56328aa2cc08d 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/README.md +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/README.md @@ -1,4 +1,4 @@ -# Observability Log Explorer +# Observability Logs Explorer This plugin provides an app based on the `LogExplorer` component from the `logs_explorer` plugin, but adds observability-specific affordances. @@ -8,17 +8,17 @@ This plugin provides an app based on the `LogExplorer` component from the `logs_ #### FTR Server ``` -yarn test:ftr:server --config ./x-pack/test/functional/apps/observability_log_explorer/config.ts +yarn test:ftr:server --config ./x-pack/test/functional/apps/observability_logs_explorer/config.ts ``` #### FTR Runner ``` -yarn test:ftr:runner --config ./x-pack/test/functional/apps/observability_log_explorer/config.ts --include ./x-pack/test/functional/apps/observability_log_explorer/index.ts +yarn test:ftr:runner --config ./x-pack/test/functional/apps/observability_logs_explorer/config.ts --include ./x-pack/test/functional/apps/observability_logs_explorer/index.ts ``` #### Running Individual Tests ``` -yarn test:ftr:runner --config ./x-pack/test/functional/apps/observability_log_explorer/config.ts --include ./x-pack/test/functional/apps/observability_log_explorer/$1 +yarn test:ftr:runner --config ./x-pack/test/functional/apps/observability_logs_explorer/config.ts --include ./x-pack/test/functional/apps/observability_logs_explorer/$1 ``` ### Serverless @@ -30,20 +30,20 @@ yarn test:ftr:server --config ./x-pack/test_serverless/functional/test_suites/ob #### Runner ``` -yarn test:ftr:runner --config ./x-pack/test_serverless/functional/test_suites/observability/config.ts --include ./x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts +yarn test:ftr:runner --config ./x-pack/test_serverless/functional/test_suites/observability/config.ts --include ./x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/index.ts ``` #### Running Individual Tests ``` -yarn test:ftr:runner --config ./x-pack/test_serverless/functional/test_suites/observability/config.ts --include ./x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/$1 +yarn test:ftr:runner --config ./x-pack/test_serverless/functional/test_suites/observability/config.ts --include ./x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/$1 ``` ## Checktypes -#### Log Explorer +#### Logs Explorer ``` node scripts/type_check.js --project x-pack/plugins/observability_solution/logs_explorer/tsconfig.json ``` -#### Observability Log Explorer +#### Observability Logs Explorer ``` node scripts/type_check.js --project x-pack/plugins/observability_solution/observability_logs_explorer/tsconfig.json ``` diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/index.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/index.ts index f94c83117e7e8..5ef2ca71e5ce1 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/index.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/index.ts @@ -10,5 +10,5 @@ export { SingleDatasetLocatorDefinition, AllDatasetsLocatorDefinition, } from './locators'; -export { OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY, urlSchemaV1 } from './url_schema'; +export { OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY, urlSchemaV1 } from './url_schema'; export { deepCompactObject } from './utils/deep_compact_object'; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/locators.test.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/locators.test.ts index ff12691e8c2fd..0c4615ad110e0 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/locators.test.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/locators.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { OBSERVABILITY_LOG_EXPLORER_APP_ID } from '@kbn/deeplinks-observability'; +import { OBSERVABILITY_LOGS_EXPLORER_APP_ID } from '@kbn/deeplinks-observability'; import { AllDatasetsLocatorParams, SingleDatasetLocatorParams, @@ -36,7 +36,7 @@ describe('Observability Logs Explorer Locators', () => { const location = await allDatasetsLocator.getLocation({}); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: '/?pageState=(datasetSelection:(selectionType:all),v:1)', state: {}, }); @@ -51,7 +51,7 @@ describe('Observability Logs Explorer Locators', () => { const location = await allDatasetsLocator.getLocation(params); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: '/?pageState=(datasetSelection:(selectionType:all),time:(from:now-30m,to:now),v:1)', state: {}, }); @@ -68,7 +68,7 @@ describe('Observability Logs Explorer Locators', () => { const location = await allDatasetsLocator.getLocation(params); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: '/?pageState=(datasetSelection:(selectionType:all),query:(language:kuery,query:foo),v:1)', state: {}, }); @@ -86,7 +86,7 @@ describe('Observability Logs Explorer Locators', () => { const location = await allDatasetsLocator.getLocation(params); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: '/?pageState=(datasetSelection:(selectionType:all),refreshInterval:(pause:!f,value:666),v:1)', state: {}, }); @@ -101,7 +101,7 @@ describe('Observability Logs Explorer Locators', () => { const location = await allDatasetsLocator.getLocation(params); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: `/?pageState=(columns:!((field:_source)),datasetSelection:(selectionType:all),v:1)`, state: {}, }); @@ -147,7 +147,7 @@ describe('Observability Logs Explorer Locators', () => { }); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: `/?pageState=(datasetSelection:(selection:(dataset:(name:'logs-test-*-*',title:test),name:Test),selectionType:unresolved),v:1)`, state: {}, }); @@ -164,7 +164,7 @@ describe('Observability Logs Explorer Locators', () => { const location = await singleDatasetLocator.getLocation(params); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: `/?pageState=(datasetSelection:(selection:(dataset:(name:'logs-test-*-*',title:test),name:Test),selectionType:unresolved),time:(from:now-30m,to:now),v:1)`, state: {}, }); @@ -184,7 +184,7 @@ describe('Observability Logs Explorer Locators', () => { const location = await singleDatasetLocator.getLocation(params); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: `/?pageState=(datasetSelection:(selection:(dataset:(name:'logs-test-*-*',title:test),name:Test),selectionType:unresolved),query:(language:kuery,query:foo),v:1)`, state: {}, }); @@ -204,7 +204,7 @@ describe('Observability Logs Explorer Locators', () => { const location = await singleDatasetLocator.getLocation(params); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: `/?pageState=(datasetSelection:(selection:(dataset:(name:'logs-test-*-*',title:test),name:Test),selectionType:unresolved),refreshInterval:(pause:!f,value:666),v:1)`, state: {}, }); @@ -221,7 +221,7 @@ describe('Observability Logs Explorer Locators', () => { const location = await singleDatasetLocator.getLocation(params); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: `/?pageState=(columns:!((field:_source)),datasetSelection:(selection:(dataset:(name:'logs-test-*-*',title:test),name:Test),selectionType:unresolved),v:1)`, state: {}, }); diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/construct_locator_path.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/construct_locator_path.ts index 664251374d88c..d2464184107f2 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/construct_locator_path.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/construct_locator_path.ts @@ -16,8 +16,8 @@ import { availableControlsPanels, DatasetSelectionPlain, } from '@kbn/logs-explorer-plugin/common'; -import { OBSERVABILITY_LOG_EXPLORER_APP_ID } from '@kbn/deeplinks-observability'; -import { OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY, urlSchemaV1 } from '../../url_schema'; +import { OBSERVABILITY_LOGS_EXPLORER_APP_ID } from '@kbn/deeplinks-observability'; +import { OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY, urlSchemaV1 } from '../../url_schema'; import { deepCompactObject } from '../../utils/deep_compact_object'; type ControlsPageState = NonNullable; @@ -49,14 +49,14 @@ export const constructLocatorPath = async (params: LocatorPathConstructionParams ); const path = setStateToKbnUrl( - OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY, + OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY, pageState, { useHash, storeInHashQuery: false }, '/' ); return { - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path, state: { ...(origin ? { origin } : {}), diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/common.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/common.ts index fa3b3f72383d1..22b00ded2e180 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/common.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/common.ts @@ -5,4 +5,4 @@ * 2.0. */ -export const OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY = 'pageState'; +export const OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY = 'pageState'; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/index.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/index.ts index d8f53e47b6058..f0873d9949426 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/index.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/index.ts @@ -5,5 +5,5 @@ * 2.0. */ -export { OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY } from './common'; +export { OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY } from './common'; export * as urlSchemaV1 from './url_schema_v1'; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/applications/redirect_to_observability_logs_explorer.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/applications/redirect_to_observability_logs_explorer.tsx new file mode 100644 index 0000000000000..222b68fa8544e --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/applications/redirect_to_observability_logs_explorer.tsx @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import ReactDOM from 'react-dom'; +import { useLocation } from 'react-router-dom'; +import { Router } from '@kbn/shared-ux-router'; +import { OBSERVABILITY_LOGS_EXPLORER_APP_ID } from '@kbn/deeplinks-observability'; +import { AppMountParameters, CoreStart } from '@kbn/core/public'; + +export const renderObservabilityLogExplorerRedirect = ( + core: CoreStart, + appParams: AppMountParameters +) => { + ReactDOM.render( + + + , + appParams.element + ); + + return () => { + ReactDOM.unmountComponentAtNode(appParams.element); + }; +}; + +export const ObservabilityLogExplorerRedirect = ({ core }: { core: CoreStart }) => { + const location = useLocation(); + const path = `${location.pathname}${location.search}`; + core.application.navigateToApp(OBSERVABILITY_LOGS_EXPLORER_APP_ID, { replace: true, path }); + return <>; +}; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/discover_link.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/discover_link.tsx index a9f50468a8db9..755b01f820909 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/discover_link.tsx +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/discover_link.tsx @@ -74,7 +74,7 @@ export const DiscoverLinkForUnknownState = React.memo(() => ( {discoverLinkTitle} @@ -105,7 +105,7 @@ export const DiscoverLink = React.memo( {...discoverLinkProps} color="primary" iconType="discoverApp" - data-test-subj="logExplorerDiscoverFallbackLink" + data-test-subj="logsExplorerDiscoverFallbackLink" > {discoverLinkTitle} diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/log_explorer_top_nav_menu.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/log_explorer_top_nav_menu.tsx index a9e1135cbb099..5bdf9348db5d5 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/log_explorer_top_nav_menu.tsx +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/log_explorer_top_nav_menu.tsx @@ -40,7 +40,7 @@ const ServerlessTopNav = () => { const { ObservabilityAIAssistantActionMenuItem } = services.observabilityAIAssistant; return ( - + @@ -106,7 +106,7 @@ const StatefulTopNav = () => { chrome.setBreadcrumbsAppendExtension({ content: toMountPoint( { return ( - + diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/onboarding_link.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/onboarding_link.tsx index 261405c766024..be7e0722210f5 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/onboarding_link.tsx +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/onboarding_link.tsx @@ -48,7 +48,7 @@ export const OnboardingLink = React.memo(({ urlService }: { urlService: BrowserU fill size="s" iconType="indexOpen" - data-test-subj="logExplorerOnboardingLink" + data-test-subj="logsExplorerOnboardingLink" > {onboardingLinkTitle} diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/plugin.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/public/plugin.ts index 6af6484e883b5..4c00dd88525d6 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/plugin.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/plugin.ts @@ -6,6 +6,7 @@ */ import { + AppMountParameters, AppNavLinkStatus, CoreSetup, CoreStart, @@ -13,7 +14,7 @@ import { Plugin, PluginInitializerContext, } from '@kbn/core/public'; -import { OBSERVABILITY_LOG_EXPLORER_APP_ID } from '@kbn/deeplinks-observability'; +import { OBSERVABILITY_LOGS_EXPLORER_APP_ID } from '@kbn/deeplinks-observability'; import { AllDatasetsLocatorDefinition, ObservabilityLogExplorerLocators, @@ -28,7 +29,6 @@ import type { ObservabilityLogExplorerSetupDeps, ObservabilityLogExplorerStartDeps, } from './types'; - export class ObservabilityLogExplorerPlugin implements Plugin { @@ -47,7 +47,7 @@ export class ObservabilityLogExplorerPlugin const useHash = core.uiSettings.get('state:storeInSessionStorage'); core.application.register({ - id: OBSERVABILITY_LOG_EXPLORER_APP_ID, + id: OBSERVABILITY_LOGS_EXPLORER_APP_ID, title: logExplorerAppTitle, category: DEFAULT_APP_CATEGORIES.observability, euiIconType: 'logoLogging', @@ -71,6 +71,21 @@ export class ObservabilityLogExplorerPlugin }, }); + // App used solely to redirect from "/app/observability-log-explorer" to "/app/observability-logs-explorer" + core.application.register({ + id: 'observability-log-explorer', + title: logExplorerAppTitle, + navLinkStatus: AppNavLinkStatus.hidden, + mount: async (appMountParams: AppMountParameters) => { + const [coreStart] = await core.getStartServices(); + const { renderObservabilityLogExplorerRedirect } = await import( + './applications/redirect_to_observability_logs_explorer' + ); + + return renderObservabilityLogExplorerRedirect(coreStart, appMountParams); + }, + }); + if (serverless) { discover.showLogExplorerTabs(); } diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/main_route.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/main_route.tsx index e8b93562915c4..120c33f4e11a8 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/main_route.tsx +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/main_route.tsx @@ -83,7 +83,7 @@ const InitializingContent = React.memo(() => ( title={ } /> diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/observability_log_explorer/src/url_state_storage_service.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/observability_log_explorer/src/url_state_storage_service.ts index 2eef22e0e5269..cdb2ec2980439 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/observability_log_explorer/src/url_state_storage_service.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/observability_log_explorer/src/url_state_storage_service.ts @@ -11,7 +11,7 @@ import { IKbnUrlStateStorage, withNotifyOnErrors } from '@kbn/kibana-utils-plugi import * as Either from 'fp-ts/lib/Either'; import * as rt from 'io-ts'; import { InvokeCreator } from 'xstate'; -import { OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY } from '../../../../common'; +import { OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY } from '../../../../common'; import type { ObservabilityLogExplorerContext, ObservabilityLogExplorerEvent } from './types'; import * as urlSchemaV1 from './url_schema_v1'; @@ -32,7 +32,7 @@ export const updateUrlFromLogExplorerState = context.logExplorerState ); - urlStateStorageContainer.set(OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY, encodedUrlStateValues, { + urlStateStorageContainer.set(OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY, encodedUrlStateValues, { replace: true, }); }; @@ -48,7 +48,7 @@ export const initializeFromUrl = (_context, _event) => (send) => { const urlStateValues = - urlStateStorageContainer.get(OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY) ?? undefined; + urlStateStorageContainer.get(OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY) ?? undefined; // in the future we'll have to more schema versions to the union const stateValuesE = rt diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/utils/breadcrumbs.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/utils/breadcrumbs.tsx index 9de71eb8069d7..184b99bb87368 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/utils/breadcrumbs.tsx +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/utils/breadcrumbs.tsx @@ -9,7 +9,7 @@ import { EuiBreadcrumb } from '@elastic/eui'; import type { ChromeStart } from '@kbn/core-chrome-browser'; import { LOGS_APP_ID, - OBSERVABILITY_LOG_EXPLORER_APP_ID, + OBSERVABILITY_LOGS_EXPLORER_APP_ID, OBSERVABILITY_OVERVIEW_APP_ID, } from '@kbn/deeplinks-observability'; import { useLinkProps } from '@kbn/observability-shared-plugin/public'; @@ -28,7 +28,7 @@ export const useBreadcrumbs = ( ) => { const observabilityLinkProps = useLinkProps({ app: OBSERVABILITY_OVERVIEW_APP_ID }); const logsLinkProps = useLinkProps({ app: LOGS_APP_ID }); - const logExplorerLinkProps = useLinkProps({ app: OBSERVABILITY_LOG_EXPLORER_APP_ID }); + const logExplorerLinkProps = useLinkProps({ app: OBSERVABILITY_LOGS_EXPLORER_APP_ID }); useEffect(() => { setBreadcrumbs( diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_response_actions_form.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_response_actions_form.cy.ts index 0591e650cc560..041818824f2f2 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_response_actions_form.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_response_actions_form.cy.ts @@ -70,32 +70,32 @@ describe('Alert Event Details - Response Actions Form', { tags: ['@ess', '@serve cy.getBySel(RESPONSE_ACTIONS_ERRORS).within(() => { cy.contains('Query is a required field'); - cy.contains('Timeout value must be greater than 60 seconds.').should('not.exist'); + cy.contains('The timeout value must be 60 seconds or higher.').should('not.exist'); }); // check if changing error state of one input doesn't clear other errors - START cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { cy.contains('Advanced').click(); cy.getBySel('timeout-input').clear(); - cy.contains('Timeout value must be greater than 60 seconds.'); + cy.contains('The timeout value must be 60 seconds or higher.'); }); cy.getBySel(RESPONSE_ACTIONS_ERRORS).within(() => { cy.contains('Query is a required field'); - cy.contains('Timeout value must be greater than 60 seconds.'); + cy.contains('The timeout value must be 60 seconds or higher.'); }); cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { cy.getBySel('timeout-input').type('6'); - cy.contains('Timeout value must be greater than 60 seconds.'); + cy.contains('The timeout value must be 60 seconds or higher.'); }); cy.getBySel(RESPONSE_ACTIONS_ERRORS).within(() => { cy.contains('Query is a required field'); - cy.contains('Timeout value must be greater than 60 seconds.'); + cy.contains('The timeout value must be 60 seconds or higher.'); }); cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { cy.getBySel('timeout-input').type('6'); - cy.contains('Timeout value must be greater than 60 seconds.').should('not.exist'); + cy.contains('The timeout value must be 60 seconds or higher.').should('not.exist'); }); cy.getBySel(RESPONSE_ACTIONS_ERRORS).within(() => { cy.contains('Query is a required field'); @@ -105,7 +105,7 @@ describe('Alert Event Details - Response Actions Form', { tags: ['@ess', '@serve }); cy.getBySel(RESPONSE_ACTIONS_ERRORS).within(() => { cy.contains('Query is a required field'); - cy.contains('Timeout value must be greater than 60 seconds.').should('not.exist'); + cy.contains('The timeout value must be 60 seconds or higher.').should('not.exist'); }); // check if changing error state of one input doesn't clear other errors - END diff --git a/x-pack/plugins/osquery/cypress/e2e/all/live_query.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/live_query.cy.ts index 8351e9df4728c..6f551ad39b196 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/live_query.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/live_query.cy.ts @@ -39,10 +39,10 @@ describe('ALL - Live Query', { tags: ['@ess', '@serverless'] }, () => { getAdvancedButton().click(); fillInQueryTimeout('910'); submitQuery(); - cy.contains('Timeout value must be lower than 900 seconds.'); + cy.contains('The timeout value must be 900 seconds or or lower.'); fillInQueryTimeout('890'); submitQuery(); - cy.contains('Timeout value must be lower than 900 seconds.').should('not.exist'); + cy.contains('The timeout value must be 900 seconds or or lower.').should('not.exist'); typeInOsqueryFieldInput('days{downArrow}{enter}'); submitQuery(); cy.contains('ECS field is required.'); diff --git a/x-pack/plugins/osquery/cypress/e2e/tiers/endpoint_essentials.cy.ts b/x-pack/plugins/osquery/cypress/e2e/tiers/endpoint_essentials.cy.ts index c2c94bb5afd0e..59a5ad3d8cf61 100644 --- a/x-pack/plugins/osquery/cypress/e2e/tiers/endpoint_essentials.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/tiers/endpoint_essentials.cy.ts @@ -7,7 +7,8 @@ import { checkOsqueryResponseActionsPermissions } from '../../tasks/response_actions'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/174567 +describe.skip( 'App Features for Endpoint Essentials PLI', { tags: ['@serverless'], diff --git a/x-pack/plugins/osquery/public/form/timeout_field.tsx b/x-pack/plugins/osquery/public/form/timeout_field.tsx index cdbc415a69c8f..86b696694570c 100644 --- a/x-pack/plugins/osquery/public/form/timeout_field.tsx +++ b/x-pack/plugins/osquery/public/form/timeout_field.tsx @@ -28,15 +28,15 @@ const TimeoutFieldComponent = ({ euiFieldProps }: TimeoutFieldProps) => { validate: (currentValue: number) => { if (currentValue < QUERY_TIMEOUT.DEFAULT || isNaN(currentValue)) { return i18n.translate('xpack.osquery.pack.queryFlyoutForm.timeoutFieldMinNumberError', { - defaultMessage: 'Timeout value must be greater than {than} seconds.', - values: { than: QUERY_TIMEOUT.DEFAULT }, + defaultMessage: 'The timeout value must be {timeoutInSeconds} seconds or higher.', + values: { timeoutInSeconds: QUERY_TIMEOUT.DEFAULT }, }); } if (currentValue > QUERY_TIMEOUT.MAX) { return i18n.translate('xpack.osquery.pack.queryFlyoutForm.timeoutFieldMaxNumberError', { - defaultMessage: 'Timeout value must be lower than {than} seconds.', - values: { than: QUERY_TIMEOUT.MAX }, + defaultMessage: 'The timeout value must be {timeoutInSeconds} seconds or or lower. ', + values: { timeoutInSeconds: QUERY_TIMEOUT.MAX }, }); } }, @@ -61,7 +61,8 @@ const TimeoutFieldComponent = ({ euiFieldProps }: TimeoutFieldProps) => { diff --git a/x-pack/plugins/profiling/public/embeddables/search_bar/embeddable_search_bar.tsx b/x-pack/plugins/profiling/public/embeddables/search_bar/embeddable_search_bar.tsx index cbc773abfc0f7..e32f514ff5ac5 100644 --- a/x-pack/plugins/profiling/public/embeddables/search_bar/embeddable_search_bar.tsx +++ b/x-pack/plugins/profiling/public/embeddables/search_bar/embeddable_search_bar.tsx @@ -43,7 +43,7 @@ export class EmbeddableSearchBar extends Embeddable< `} > { diff --git a/x-pack/plugins/screenshotting/server/browsers/chromium/driver_factory/args.test.ts b/x-pack/plugins/screenshotting/server/browsers/chromium/driver_factory/args.test.ts index 3e2cb57af3a88..6c736a97a52fe 100644 --- a/x-pack/plugins/screenshotting/server/browsers/chromium/driver_factory/args.test.ts +++ b/x-pack/plugins/screenshotting/server/browsers/chromium/driver_factory/args.test.ts @@ -51,7 +51,7 @@ describe('headless webgl arm mac workaround', () => { // please double-check that the --use-angle flag is still needed for arm macs // instead of --use-angle you may need --enable-gpu expect(getChromiumPackage().binaryChecksum).toBe( - 'a8556ed7ac2a669fa81f752f7d18a9d1e9b99b05d3504f6bbc08e3e0b02ff71e' + '2b5c892e3125eecd31b651f4632cbafabee3a31c02728dcddafee8d462ab075d' ); // just putting this here so that someone updating the chromium version will see this comment }); }); diff --git a/x-pack/plugins/screenshotting/server/browsers/chromium/paths.ts b/x-pack/plugins/screenshotting/server/browsers/chromium/paths.ts index 91c53aba46e77..c8e18d9459a9d 100644 --- a/x-pack/plugins/screenshotting/server/browsers/chromium/paths.ts +++ b/x-pack/plugins/screenshotting/server/browsers/chromium/paths.ts @@ -44,10 +44,10 @@ export class ChromiumArchivePaths { platform: 'darwin', architecture: 'x64', archiveFilename: 'chrome-mac.zip', - archiveChecksum: '35261c7a88f1797d27646c340eeaf7d7d70727f0c4ae884e8400240ed66d7192', - binaryChecksum: 'ca90fe7573ddb0723d633fe526acf0fdefdda570a549f35e15c111d10f3ffc0d', + archiveChecksum: '2577b515b871b507a9c830cdf5a360e6a966dc058e07307ad1a21a22ae681d4c', + binaryChecksum: '80287437016fd444f78822017c3dba939984b627c18cba57b052136323aa82ef', binaryRelativePath: 'chrome-mac/Chromium.app/Contents/MacOS/Chromium', - revision: 1204244, // 1204232 is not available for Mac Intel + revision: 1233115, // 1233107 is not available for Mac Intel location: 'common', archivePath: 'Mac', isPreInstalled: false, @@ -56,10 +56,10 @@ export class ChromiumArchivePaths { platform: 'darwin', architecture: 'arm64', archiveFilename: 'chrome-mac.zip', - archiveChecksum: '1ed375086a9505ee6bc9bc1373bebd79e87e5b27af5a93258ea25ffb6f71f03c', - binaryChecksum: 'a8556ed7ac2a669fa81f752f7d18a9d1e9b99b05d3504f6bbc08e3e0b02ff71e', + archiveChecksum: 'c2219ea9dea838eef2ea350c4d2591fc91090fd7a920dfa010fa44d8c31db515', + binaryChecksum: '2b5c892e3125eecd31b651f4632cbafabee3a31c02728dcddafee8d462ab075d', binaryRelativePath: 'chrome-mac/Chromium.app/Contents/MacOS/Chromium', - revision: 1204255, // 1204232 is not available for Mac_Arm + revision: 1233124, // 1233107 is not available for Mac_Arm location: 'common', archivePath: 'Mac_Arm', isPreInstalled: false, @@ -67,22 +67,22 @@ export class ChromiumArchivePaths { { platform: 'linux', architecture: 'x64', - archiveFilename: 'chromium-38c7255-locales-linux_x64.zip', - archiveChecksum: 'bf07734366ece771a85b2452fd63e5981b1abc234ef0ed1c7d0774b8a7b5c6a9', - binaryChecksum: '87a991c412ad333549a58524b6be23f2a1ff56af61bb1a1b10c1f4a0206edc2a', + archiveFilename: 'chromium-3f98d69-locales-linux_x64.zip', + archiveChecksum: '251e4cf450bfab59154a2a366e724db65df521016d3fc651e9fe5cbe6970b7b0', + binaryChecksum: 'cd888114440b25c29a653563e56a29dc1ae2cebbf335e557f99100c5402bc302', binaryRelativePath: 'headless_shell-linux_x64/headless_shell', - revision: 1204232, + revision: 1233107, location: 'custom', isPreInstalled: true, }, { platform: 'linux', architecture: 'arm64', - archiveFilename: 'chromium-38c7255-locales-linux_arm64.zip', - archiveChecksum: '11c1cd2398ae3b57a72e7746e1f1cbbd2c2d18d1b83dec949dc81a3c690688f0', - binaryChecksum: '4d914034d466b97c438283dbc914230e087217c25028f403dfa3c933ea755e94', + archiveFilename: 'chromium-3f98d69-locales-linux_arm64.zip', + archiveChecksum: '87e59ba3fb20649301a27f56d3328d970812ecb473b23ad216f9122739a40bf0', + binaryChecksum: '2a44c60e7f85e47533beace3d5dc6271803f87e8fc2083e8cdc612e8cf4366b9', binaryRelativePath: 'headless_shell-linux_arm64/headless_shell', - revision: 1204232, + revision: 1233107, location: 'custom', isPreInstalled: true, }, @@ -90,10 +90,10 @@ export class ChromiumArchivePaths { platform: 'win32', architecture: 'x64', archiveFilename: 'chrome-win.zip', - archiveChecksum: 'd6f5a21973867115435814c2c46d49edd9a0a2ad6da14b4724746374cad80e47', - binaryChecksum: '9c0d2404004bd7c4ada649049422de6958460ecf6cec53460a478c6d8c33e444', + archiveChecksum: 'b7c04da4d51ee03eca5ffa6c440c951375147d913647375e30bd52e9d67c6caf', + binaryChecksum: '52fe4b81323c73d48cb50e80d16e61e1aced809e19d984d9df20169efdf63b5b', binaryRelativePath: path.join('chrome-win', 'chrome.exe'), - revision: 1204234, // 1204232 is not available for win + revision: 1233121, // 1233107 is not available for win location: 'common', archivePath: 'Win', isPreInstalled: true, diff --git a/x-pack/plugins/security/common/constants.ts b/x-pack/plugins/security/common/constants.ts index 48a0202105965..aab0c9d6c438b 100644 --- a/x-pack/plugins/security/common/constants.ts +++ b/x-pack/plugins/security/common/constants.ts @@ -92,3 +92,8 @@ export const SESSION_EXTENSION_THROTTLE_MS = 60 * 1000; * Route to get session info and extend session expiration */ export const SESSION_ROUTE = '/internal/security/session'; + +/** + * Allowed image file types for uploading an image as avatar + */ +export const IMAGE_FILE_TYPES = ['image/svg+xml', 'image/jpeg', 'image/png', 'image/gif']; diff --git a/x-pack/plugins/security/common/model/api_key.ts b/x-pack/plugins/security/common/model/api_key.ts index 3441f4d07a8c1..48fe1dd95e85d 100644 --- a/x-pack/plugins/security/common/model/api_key.ts +++ b/x-pack/plugins/security/common/model/api_key.ts @@ -22,7 +22,7 @@ export interface RestApiKey extends BaseApiKey { } /** - * Interface representing a Cross-Cluster API key the way it is returned by Elasticsearch GET endpoint. + * Interface representing a cross-cluster API key the way it is returned by Elasticsearch GET endpoint. * * TODO: Remove this type when `@elastic/elasticsearch` has been updated. */ diff --git a/x-pack/plugins/security/public/account_management/user_profile/user_profile.tsx b/x-pack/plugins/security/public/account_management/user_profile/user_profile.tsx index 04ac8cc4fcfe9..601e13c8bb16e 100644 --- a/x-pack/plugins/security/public/account_management/user_profile/user_profile.tsx +++ b/x-pack/plugins/security/public/account_management/user_profile/user_profile.tsx @@ -42,8 +42,9 @@ import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; import type { DarkModeValue, UserProfileData } from '@kbn/user-profile-components'; import { UserAvatar, useUpdateUserProfile } from '@kbn/user-profile-components'; -import { createImageHandler, getRandomColor, IMAGE_FILE_TYPES, VALID_HEX_COLOR } from './utils'; +import { createImageHandler, getRandomColor, VALID_HEX_COLOR } from './utils'; import type { AuthenticatedUser } from '../../../common'; +import { IMAGE_FILE_TYPES } from '../../../common/constants'; import { canUserChangeDetails, canUserChangePassword, diff --git a/x-pack/plugins/security/public/account_management/user_profile/utils.ts b/x-pack/plugins/security/public/account_management/user_profile/utils.ts index fd15350288493..2621ba0b65f1f 100644 --- a/x-pack/plugins/security/public/account_management/user_profile/utils.ts +++ b/x-pack/plugins/security/public/account_management/user_profile/utils.ts @@ -4,8 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { IMAGE_FILE_TYPES } from '../../../common/constants'; -export const IMAGE_FILE_TYPES = ['image/svg+xml', 'image/jpeg', 'image/png', 'image/gif']; export const MAX_IMAGE_SIZE = 64; export function readFile(data: File) { diff --git a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_key_flyout.tsx b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_key_flyout.tsx index fb7ba2b6c40a3..65a2f588a7591 100644 --- a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_key_flyout.tsx +++ b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_key_flyout.tsx @@ -282,7 +282,7 @@ export const ApiKeyFlyout: FunctionComponent = ({ title={ } /> @@ -295,7 +295,7 @@ export const ApiKeyFlyout: FunctionComponent = ({ title={ } /> @@ -451,7 +451,7 @@ export const ApiKeyFlyout: FunctionComponent = ({

@@ -477,7 +477,7 @@ export const ApiKeyFlyout: FunctionComponent = ({

@@ -485,7 +485,7 @@ export const ApiKeyFlyout: FunctionComponent = ({ diff --git a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.tsx b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.tsx index dd47e7e198bc4..834c4d4fd6054 100644 --- a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.tsx +++ b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.tsx @@ -159,7 +159,7 @@ export const APIKeysGridPage: FunctionComponent = () => { description={ } rightSideItems={ @@ -353,12 +353,9 @@ export const ApiKeysTable: FunctionComponent = ({ }, { field: 'type', - name: ( - - ), + name: i18n.translate('xpack.security.management.apiKeys.table.typeColumnName', { + defaultMessage: 'Type', + }), sortable: true, render: (type: CategorizedApiKey['type']) => , } @@ -367,12 +364,9 @@ export const ApiKeysTable: FunctionComponent = ({ if (canManageApiKeys || usernameFilters.length > 1) { columns.push({ field: 'username', - name: ( - - ), + name: i18n.translate('xpack.security.management.apiKeys.table.ownerColumnName', { + defaultMessage: 'Owner', + }), sortable: true, render: (username: CategorizedApiKey['username']) => , }); @@ -381,12 +375,9 @@ export const ApiKeysTable: FunctionComponent = ({ columns.push( { field: 'creation', - name: ( - - ), + name: i18n.translate('xpack.security.management.apiKeys.table.createdColumnName', { + defaultMessage: 'Created', + }), sortable: true, mobileOptions: { show: false, @@ -406,12 +397,9 @@ export const ApiKeysTable: FunctionComponent = ({ }, { field: 'expiration', - name: ( - - ), + name: i18n.translate('xpack.security.management.apiKeys.table.statusColumnName', { + defaultMessage: 'Status', + }), sortable: true, render: (expiration: number) => , } @@ -422,12 +410,9 @@ export const ApiKeysTable: FunctionComponent = ({ width: `${24 + 2 * 8}px`, actions: [ { - name: ( - - ), + name: i18n.translate('xpack.security.management.apiKeys.table.deleteAction', { + defaultMessage: 'Delete', + }), description: i18n.translate('xpack.security.management.apiKeys.table.deleteDescription', { defaultMessage: 'Delete this API key', }), @@ -571,7 +556,7 @@ export const TypesFilterButton: FunctionComponent = ({ > ) : null} @@ -593,7 +578,7 @@ export const TypesFilterButton: FunctionComponent = ({ > ) : null} @@ -786,7 +771,7 @@ export const ApiKeyBadge: FunctionComponent = ({ type }) => { @@ -818,7 +803,7 @@ export const ApiKeyBadge: FunctionComponent = ({ type }) => { diff --git a/x-pack/plugins/security/public/management/role_mappings/role_mappings_grid/role_mappings_grid_page.tsx b/x-pack/plugins/security/public/management/role_mappings/role_mappings_grid/role_mappings_grid_page.tsx index b5905ec147960..ed733ac8d24b9 100644 --- a/x-pack/plugins/security/public/management/role_mappings/role_mappings_grid/role_mappings_grid_page.tsx +++ b/x-pack/plugins/security/public/management/role_mappings/role_mappings_grid/role_mappings_grid_page.tsx @@ -74,7 +74,6 @@ export class RoleMappingsGridPage extends Component { readOnly: false, }; - private tableRef: React.RefObject>; constructor(props: any) { super(props); this.state = { @@ -85,7 +84,6 @@ export class RoleMappingsGridPage extends Component { selectedItems: [], error: undefined, }; - this.tableRef = React.createRef(); } public componentDidMount() { @@ -226,6 +224,7 @@ export class RoleMappingsGridPage extends Component { selectedItems: newSelectedItems, }); }, + selected: selectedItems, }; const search = { @@ -237,13 +236,7 @@ export class RoleMappingsGridPage extends Component { {(deleteRoleMappingsPrompt) => { return ( - deleteRoleMappingsPrompt( - selectedItems, - this.onRoleMappingsDeleted, - this.onRoleMappingsDeleteCancel - ) - } + onClick={() => deleteRoleMappingsPrompt(selectedItems, this.onRoleMappingsDeleted)} color="danger" data-test-subj="bulkDeleteActionButton" > @@ -298,7 +291,6 @@ export class RoleMappingsGridPage extends Component { loading={loadState === 'loadingTable'} message={message} isSelectable={true} - ref={this.tableRef} rowProps={() => { return { 'data-test-subj': 'roleMappingRow', @@ -499,10 +491,6 @@ export class RoleMappingsGridPage extends Component { } }; - private onRoleMappingsDeleteCancel = () => { - this.tableRef.current?.setSelection([]); - }; - private async checkPrivileges() { try { const { canManageRoleMappings, hasCompatibleRealms } = diff --git a/x-pack/plugins/security/public/management/roles/roles_grid/roles_grid_page.tsx b/x-pack/plugins/security/public/management/roles/roles_grid/roles_grid_page.tsx index 6a6433038d635..1da786c7e6b70 100644 --- a/x-pack/plugins/security/public/management/roles/roles_grid/roles_grid_page.tsx +++ b/x-pack/plugins/security/public/management/roles/roles_grid/roles_grid_page.tsx @@ -68,7 +68,6 @@ export class RolesGridPage extends Component { readOnly: false, }; - private tableRef: React.RefObject>; constructor(props: Props) { super(props); this.state = { @@ -80,7 +79,6 @@ export class RolesGridPage extends Component { permissionDenied: false, includeReservedRoles: true, }; - this.tableRef = React.createRef(); } public componentDidMount() { @@ -156,6 +154,7 @@ export class RolesGridPage extends Component { selectableMessage: (selectable: boolean) => !selectable ? 'Role is reserved' : '', onSelectionChange: (selection: Role[]) => this.setState({ selection }), + selected: this.state.selection, } } pagination={{ @@ -188,7 +187,6 @@ export class RolesGridPage extends Component { direction: 'asc', }, }} - ref={this.tableRef} rowProps={(role: Role) => { return { 'data-test-subj': `roleRow`, @@ -484,7 +482,6 @@ export class RolesGridPage extends Component { ); } private onCancelDelete = () => { - this.setState({ showDeleteConfirmation: false, selection: [] }); - this.tableRef.current?.setSelection([]); + this.setState({ showDeleteConfirmation: false }); }; } diff --git a/x-pack/plugins/security/server/authentication/api_keys/api_keys.test.ts b/x-pack/plugins/security/server/authentication/api_keys/api_keys.test.ts index 0d8f5a78c64b8..7c63ace9fc706 100644 --- a/x-pack/plugins/security/server/authentication/api_keys/api_keys.test.ts +++ b/x-pack/plugins/security/server/authentication/api_keys/api_keys.test.ts @@ -259,7 +259,7 @@ describe('API Keys', () => { }); }); - it('creates Cross-Cluster API key when type is `cross_cluster`', async () => { + it('creates cross-cluster API key when type is `cross_cluster`', async () => { mockLicense.isEnabled.mockReturnValue(true); mockScopedClusterClient.asCurrentUser.transport.request.mockResolvedValueOnce({ @@ -388,7 +388,7 @@ describe('API Keys', () => { }); }); - it('updates Cross-Cluster API key when type is `cross_cluster`', async () => { + it('updates cross-cluster API key when type is `cross_cluster`', async () => { mockLicense.isEnabled.mockReturnValue(true); mockScopedClusterClient.asCurrentUser.transport.request.mockResolvedValueOnce({ diff --git a/x-pack/plugins/security/server/authentication/api_keys/api_keys.ts b/x-pack/plugins/security/server/authentication/api_keys/api_keys.ts index 36a3bfeee4f7c..1fbd99b4dd812 100644 --- a/x-pack/plugins/security/server/authentication/api_keys/api_keys.ts +++ b/x-pack/plugins/security/server/authentication/api_keys/api_keys.ts @@ -113,7 +113,7 @@ export class APIKeys implements APIKeysType { } /** - * Determines if Cross-Cluster API Keys are enabled in Elasticsearch. + * Determines if cross-cluster API Keys are enabled in Elasticsearch. */ async areCrossClusterAPIKeysEnabled(): Promise { if (!this.license.isEnabled()) { @@ -123,14 +123,14 @@ export class APIKeys implements APIKeysType { const id = 'kibana-api-key-service-test'; this.logger.debug( - `Testing if Cross-Cluster API Keys are enabled by attempting to update a non-existant key: ${id}` + `Testing if cross-cluster API Keys are enabled by attempting to update a non-existant key: ${id}` ); try { await this.clusterClient.asInternalUser.transport.request({ method: 'PUT', path: `/_security/cross_cluster/api_key/${id}`, - body: {}, // We are sending an empty request body and expect a validation error if Update Cross-Cluster API key endpoint is available. + body: {}, // We are sending an empty request body and expect a validation error if Update cross-cluster API key endpoint is available. }); return false; } catch (error) { @@ -143,7 +143,7 @@ export class APIKeys implements APIKeysType { * * Returns newly created API key or `null` if API keys are disabled. * - * User needs `manage_api_key` privilege to create REST API keys and `manage_security` for Cross-Cluster API keys. + * User needs `manage_api_key` privilege to create REST API keys and `manage_security` for cross-cluster API keys. * * @param request Request instance. * @param createParams The params to create an API key @@ -199,7 +199,7 @@ export class APIKeys implements APIKeysType { * * Returns `updated`, `true` if the update was successful, `false` if there was nothing to update * - * User needs `manage_api_key` privilege to update REST API keys and `manage_security` for Cross-Cluster API keys. + * User needs `manage_api_key` privilege to update REST API keys and `manage_security` for cross-cluster API keys. * * @param request Request instance. * @param updateParams The params to edit an API key diff --git a/x-pack/plugins/security/server/routes/api_keys/get.ts b/x-pack/plugins/security/server/routes/api_keys/get.ts index 7f4154f49868b..4a6583d585ea0 100644 --- a/x-pack/plugins/security/server/routes/api_keys/get.ts +++ b/x-pack/plugins/security/server/routes/api_keys/get.ts @@ -77,7 +77,7 @@ export function defineGetApiKeysRoutes({ return response.ok({ body: { - // @ts-expect-error Elasticsearch client types do not know about Cross-Cluster API keys yet. + // @ts-expect-error Elasticsearch client types do not know about cross-cluster API keys yet. apiKeys: validKeys, canManageCrossClusterApiKeys: clusterPrivileges.manage_security && areCrossClusterApiKeysEnabled, diff --git a/x-pack/plugins/security/server/routes/user_profile/update.ts b/x-pack/plugins/security/server/routes/user_profile/update.ts index 205f6a6d68a4a..9a550ada52adc 100644 --- a/x-pack/plugins/security/server/routes/user_profile/update.ts +++ b/x-pack/plugins/security/server/routes/user_profile/update.ts @@ -8,6 +8,7 @@ import { schema } from '@kbn/config-schema'; import type { RouteDefinitionParams } from '..'; +import { IMAGE_FILE_TYPES } from '../../../common/constants'; import { wrapIntoCustomErrorResponse } from '../../errors'; import { flattenObject } from '../../lib'; import { getPrintableSessionId } from '../../session_management'; @@ -47,7 +48,28 @@ export function defineUpdateUserProfileDataRoute({ } const currentUser = getAuthenticationService().getCurrentUser(request); + const userProfileData = request.body; + const imageDataUrl = userProfileData.avatar?.imageUrl; + if (imageDataUrl && typeof imageDataUrl === 'string') { + const matches = imageDataUrl.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/); + if (!matches || matches.length !== 3) { + return response.customError({ + body: 'Unsupported media type', + statusCode: 415, + }); + } + + const [, mimeType] = matches; + + if (!IMAGE_FILE_TYPES.includes(mimeType)) { + return response.customError({ + body: 'Unsupported media type', + statusCode: 415, + }); + } + } + const keysToUpdate = Object.keys(flattenObject(userProfileData)); if (currentUser?.elastic_cloud_user) { diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/common/alerts_ecs_fields.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/common/alerts_ecs_fields.ts new file mode 100644 index 0000000000000..027adaa8ff0c9 --- /dev/null +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/common/alerts_ecs_fields.ts @@ -0,0 +1,926 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/** + * A list of ECS fields that can appear on the `logs-endpoint.events.*` index. + * Used to defined Event Filters and Endpoint Exceptions + */ +export const ENDPOINT_EVENTS_LOG_INDEX_FIELDS: readonly string[] = [ + '@timestamp', + 'Effective_process.entity_id', + 'Effective_process.executable', + 'Effective_process.name', + 'Effective_process.pid', + 'Persistence.args', + 'Persistence.executable', + 'Persistence.keepalive', + 'Persistence.name', + 'Persistence.path', + 'Persistence.runatload', + 'Target.process.Ext.memory_region.allocation_base', + 'Target.process.Ext.memory_region.allocation_protection', + 'Target.process.Ext.memory_region.allocation_size', + 'Target.process.Ext.memory_region.allocation_type', + 'Target.process.Ext.memory_region.bytes_address', + 'Target.process.Ext.memory_region.bytes_allocation_offset', + 'Target.process.Ext.memory_region.bytes_compressed', + 'Target.process.Ext.memory_region.bytes_compressed_present', + 'Target.process.Ext.memory_region.hash.sha256', + 'Target.process.Ext.memory_region.malware_signature.all_names', + 'Target.process.Ext.memory_region.malware_signature.identifier', + 'Target.process.Ext.memory_region.malware_signature.primary.matches', + 'Target.process.Ext.memory_region.malware_signature.primary.signature.hash.sha256', + 'Target.process.Ext.memory_region.malware_signature.primary.signature.id', + 'Target.process.Ext.memory_region.malware_signature.primary.signature.name', + 'Target.process.Ext.memory_region.malware_signature.version', + 'Target.process.Ext.memory_region.mapped_path', + 'Target.process.Ext.memory_region.mapped_pe.Ext.dotnet', + 'Target.process.Ext.memory_region.mapped_pe.Ext.sections.hash.md5', + 'Target.process.Ext.memory_region.mapped_pe.Ext.sections.hash.sha1', + 'Target.process.Ext.memory_region.mapped_pe.Ext.sections.hash.sha256', + 'Target.process.Ext.memory_region.mapped_pe.Ext.sections.hash.sha384', + 'Target.process.Ext.memory_region.mapped_pe.Ext.sections.hash.sha512', + 'Target.process.Ext.memory_region.mapped_pe.Ext.sections.hash.ssdeep', + 'Target.process.Ext.memory_region.mapped_pe.Ext.sections.hash.tlsh', + 'Target.process.Ext.memory_region.mapped_pe.Ext.sections.name', + 'Target.process.Ext.memory_region.mapped_pe.Ext.streams.hash.md5', + 'Target.process.Ext.memory_region.mapped_pe.Ext.streams.hash.sha1', + 'Target.process.Ext.memory_region.mapped_pe.Ext.streams.hash.sha256', + 'Target.process.Ext.memory_region.mapped_pe.Ext.streams.hash.sha384', + 'Target.process.Ext.memory_region.mapped_pe.Ext.streams.hash.sha512', + 'Target.process.Ext.memory_region.mapped_pe.Ext.streams.hash.ssdeep', + 'Target.process.Ext.memory_region.mapped_pe.Ext.streams.hash.tlsh', + 'Target.process.Ext.memory_region.mapped_pe.Ext.streams.name', + 'Target.process.Ext.memory_region.mapped_pe.architecture', + 'Target.process.Ext.memory_region.mapped_pe.company', + 'Target.process.Ext.memory_region.mapped_pe.description', + 'Target.process.Ext.memory_region.mapped_pe.file_version', + 'Target.process.Ext.memory_region.mapped_pe.go_import_hash', + 'Target.process.Ext.memory_region.mapped_pe.go_imports', + 'Target.process.Ext.memory_region.mapped_pe.go_imports_names_entropy', + 'Target.process.Ext.memory_region.mapped_pe.go_imports_names_var_entropy', + 'Target.process.Ext.memory_region.mapped_pe.go_stripped', + 'Target.process.Ext.memory_region.mapped_pe.imphash', + 'Target.process.Ext.memory_region.mapped_pe.import_hash', + 'Target.process.Ext.memory_region.mapped_pe.imports', + 'Target.process.Ext.memory_region.mapped_pe.imports_names_entropy', + 'Target.process.Ext.memory_region.mapped_pe.imports_names_var_entropy', + 'Target.process.Ext.memory_region.mapped_pe.original_file_name', + 'Target.process.Ext.memory_region.mapped_pe.pehash', + 'Target.process.Ext.memory_region.mapped_pe.product', + 'Target.process.Ext.memory_region.mapped_pe.sections.entropy', + 'Target.process.Ext.memory_region.mapped_pe.sections.name', + 'Target.process.Ext.memory_region.mapped_pe.sections.physical_size', + 'Target.process.Ext.memory_region.mapped_pe.sections.var_entropy', + 'Target.process.Ext.memory_region.mapped_pe.sections.virtual_size', + 'Target.process.Ext.memory_region.mapped_pe_detected', + 'Target.process.Ext.memory_region.memory_pe.Ext.dotnet', + 'Target.process.Ext.memory_region.memory_pe.Ext.sections.hash.md5', + 'Target.process.Ext.memory_region.memory_pe.Ext.sections.hash.sha1', + 'Target.process.Ext.memory_region.memory_pe.Ext.sections.hash.sha256', + 'Target.process.Ext.memory_region.memory_pe.Ext.sections.hash.sha384', + 'Target.process.Ext.memory_region.memory_pe.Ext.sections.hash.sha512', + 'Target.process.Ext.memory_region.memory_pe.Ext.sections.hash.ssdeep', + 'Target.process.Ext.memory_region.memory_pe.Ext.sections.hash.tlsh', + 'Target.process.Ext.memory_region.memory_pe.Ext.sections.name', + 'Target.process.Ext.memory_region.memory_pe.Ext.streams.hash.md5', + 'Target.process.Ext.memory_region.memory_pe.Ext.streams.hash.sha1', + 'Target.process.Ext.memory_region.memory_pe.Ext.streams.hash.sha256', + 'Target.process.Ext.memory_region.memory_pe.Ext.streams.hash.sha384', + 'Target.process.Ext.memory_region.memory_pe.Ext.streams.hash.sha512', + 'Target.process.Ext.memory_region.memory_pe.Ext.streams.hash.ssdeep', + 'Target.process.Ext.memory_region.memory_pe.Ext.streams.hash.tlsh', + 'Target.process.Ext.memory_region.memory_pe.Ext.streams.name', + 'Target.process.Ext.memory_region.memory_pe.architecture', + 'Target.process.Ext.memory_region.memory_pe.company', + 'Target.process.Ext.memory_region.memory_pe.description', + 'Target.process.Ext.memory_region.memory_pe.file_version', + 'Target.process.Ext.memory_region.memory_pe.go_import_hash', + 'Target.process.Ext.memory_region.memory_pe.go_imports', + 'Target.process.Ext.memory_region.memory_pe.go_imports_names_entropy', + 'Target.process.Ext.memory_region.memory_pe.go_imports_names_var_entropy', + 'Target.process.Ext.memory_region.memory_pe.go_stripped', + 'Target.process.Ext.memory_region.memory_pe.imphash', + 'Target.process.Ext.memory_region.memory_pe.import_hash', + 'Target.process.Ext.memory_region.memory_pe.imports', + 'Target.process.Ext.memory_region.memory_pe.imports_names_entropy', + 'Target.process.Ext.memory_region.memory_pe.imports_names_var_entropy', + 'Target.process.Ext.memory_region.memory_pe.original_file_name', + 'Target.process.Ext.memory_region.memory_pe.pehash', + 'Target.process.Ext.memory_region.memory_pe.product', + 'Target.process.Ext.memory_region.memory_pe.sections.entropy', + 'Target.process.Ext.memory_region.memory_pe.sections.name', + 'Target.process.Ext.memory_region.memory_pe.sections.physical_size', + 'Target.process.Ext.memory_region.memory_pe.sections.var_entropy', + 'Target.process.Ext.memory_region.memory_pe.sections.virtual_size', + 'Target.process.Ext.memory_region.memory_pe_detected', + 'Target.process.Ext.memory_region.region_base', + 'Target.process.Ext.memory_region.region_protection', + 'Target.process.Ext.memory_region.region_size', + 'Target.process.Ext.memory_region.region_state', + 'Target.process.Ext.memory_region.strings', + 'Target.process.Ext.token.integrity_level_name', + 'Target.process.entity_id', + 'Target.process.executable', + 'Target.process.executable.caseless', + 'Target.process.executable.text', + 'Target.process.name', + 'Target.process.name.caseless', + 'Target.process.name.text', + 'Target.process.pid', + '_id', + '_index', + '_score', + '_source', + 'agent.ephemeral_id', + 'agent.id', + 'agent.name', + 'agent.type', + 'agent.version', + 'cloud.account.id', + 'cloud.instance.name', + 'cloud.project.id', + 'cloud.provider', + 'cloud.region', + 'container.id', + 'container.image.hash.all', + 'container.image.name', + 'container.image.tag', + 'container.name', + 'data_stream.dataset', + 'data_stream.namespace', + 'data_stream.type', + 'destination.address', + 'destination.as.number', + 'destination.as.organization.name', + 'destination.as.organization.name.text', + 'destination.bytes', + 'destination.domain', + 'destination.geo.city_name', + 'destination.geo.continent_code', + 'destination.geo.continent_name', + 'destination.geo.country_iso_code', + 'destination.geo.country_name', + 'destination.geo.location', + 'destination.geo.name', + 'destination.geo.postal_code', + 'destination.geo.region_iso_code', + 'destination.geo.region_name', + 'destination.geo.timezone', + 'destination.ip', + 'destination.packets', + 'destination.port', + 'destination.registered_domain', + 'destination.top_level_domain', + 'dll.Ext.code_signature.exists', + 'dll.Ext.code_signature.status', + 'dll.Ext.code_signature.subject_name', + 'dll.Ext.code_signature.trusted', + 'dll.Ext.code_signature.valid', + 'dll.Ext.defense_evasions', + 'dll.Ext.device.bus_type', + 'dll.Ext.device.dos_name', + 'dll.Ext.device.file_system_type', + 'dll.Ext.device.nt_name', + 'dll.Ext.device.product_id', + 'dll.Ext.device.serial_number', + 'dll.Ext.device.vendor_id', + 'dll.Ext.device.volume_device_type', + 'dll.Ext.load_index', + 'dll.Ext.relative_file_creation_time', + 'dll.Ext.relative_file_name_modify_time', + 'dll.Ext.size', + 'dll.code_signature.exists', + 'dll.code_signature.signing_id', + 'dll.code_signature.status', + 'dll.code_signature.subject_name', + 'dll.code_signature.team_id', + 'dll.code_signature.trusted', + 'dll.code_signature.valid', + 'dll.hash.md5', + 'dll.hash.sha1', + 'dll.hash.sha256', + 'dll.hash.sha512', + 'dll.name', + 'dll.path', + 'dll.pe.company', + 'dll.pe.description', + 'dll.pe.file_version', + 'dll.pe.imphash', + 'dll.pe.original_file_name', + 'dll.pe.product', + 'dns.Ext.options', + 'dns.Ext.status', + 'dns.question.name', + 'dns.question.registered_domain', + 'dns.question.subdomain', + 'dns.question.top_level_domain', + 'dns.question.type', + 'dns.resolved_ip', + 'ecs.version', + 'event.Ext.correlation.id', + 'event.action', + 'event.agent_id_status', + 'event.category', + 'event.code', + 'event.created', + 'event.dataset', + 'event.end', + 'event.hash', + 'event.id', + 'event.ingested', + 'event.kind', + 'event.module', + 'event.outcome', + 'event.provider', + 'event.sequence', + 'event.severity', + 'event.start', + 'event.type', + 'file.Ext.code_signature.exists', + 'file.Ext.code_signature.status', + 'file.Ext.code_signature.subject_name', + 'file.Ext.code_signature.trusted', + 'file.Ext.code_signature.valid', + 'file.Ext.device.bus_type', + 'file.Ext.device.dos_name', + 'file.Ext.device.file_system_type', + 'file.Ext.device.nt_name', + 'file.Ext.device.product_id', + 'file.Ext.device.serial_number', + 'file.Ext.device.vendor_id', + 'file.Ext.device.volume_device_type', + 'file.Ext.entropy', + 'file.Ext.header_bytes', + 'file.Ext.header_data', + 'file.Ext.malware_signature.all_names', + 'file.Ext.malware_signature.identifier', + 'file.Ext.malware_signature.primary.signature.hash.sha256', + 'file.Ext.malware_signature.primary.signature.id', + 'file.Ext.malware_signature.primary.signature.name', + 'file.Ext.malware_signature.version', + 'file.Ext.monotonic_id', + 'file.Ext.original.extension', + 'file.Ext.original.gid', + 'file.Ext.original.group', + 'file.Ext.original.mode', + 'file.Ext.original.name', + 'file.Ext.original.owner', + 'file.Ext.original.path', + 'file.Ext.original.uid', + 'file.Ext.windows.zone_identifier', + 'file.accessed', + 'file.attributes', + 'file.code_signature.exists', + 'file.code_signature.signing_id', + 'file.code_signature.status', + 'file.code_signature.subject_name', + 'file.code_signature.team_id', + 'file.code_signature.trusted', + 'file.code_signature.valid', + 'file.created', + 'file.ctime', + 'file.device', + 'file.directory', + 'file.drive_letter', + 'file.extension', + 'file.gid', + 'file.group', + 'file.hash.md5', + 'file.hash.sha1', + 'file.hash.sha256', + 'file.hash.sha512', + 'file.inode', + 'file.mime_type', + 'file.mode', + 'file.mtime', + 'file.name', + 'file.owner', + 'file.path', + 'file.path.caseless', + 'file.path.text', + 'file.pe.company', + 'file.pe.description', + 'file.pe.file_version', + 'file.pe.imphash', + 'file.pe.original_file_name', + 'file.pe.product', + 'file.size', + 'file.target_path', + 'file.target_path.caseless', + 'file.target_path.text', + 'file.type', + 'file.uid', + 'group.Ext.real.id', + 'group.Ext.real.name', + 'group.domain', + 'group.id', + 'group.name', + 'host.architecture', + 'host.boot.id', + 'host.domain', + 'host.hostname', + 'host.id', + 'host.ip', + 'host.mac', + 'host.name', + 'host.os.Ext.variant', + 'host.os.family', + 'host.os.full', + 'host.os.full.caseless', + 'host.os.full.text', + 'host.os.kernel', + 'host.os.name', + 'host.os.name.caseless', + 'host.os.name.text', + 'host.os.platform', + 'host.os.type', + 'host.os.version', + 'host.pid_ns_ino', + 'host.type', + 'host.uptime', + 'http.request.body.bytes', + 'http.request.body.content', + 'http.request.body.content.text', + 'http.request.bytes', + 'http.response.Ext.version', + 'http.response.body.bytes', + 'http.response.body.content', + 'http.response.body.content.text', + 'http.response.bytes', + 'http.response.status_code', + 'message', + 'network.bytes', + 'network.community_id', + 'network.direction', + 'network.iana_number', + 'network.packets', + 'network.protocol', + 'network.transport', + 'network.type', + 'orchestrator.cluster.id', + 'orchestrator.cluster.name', + 'orchestrator.namespace', + 'orchestrator.resource.ip', + 'orchestrator.resource.name', + 'orchestrator.resource.parent.type', + 'orchestrator.resource.type', + 'package.name', + 'process.Ext.ancestry', + 'process.Ext.api.behaviors', + 'process.Ext.api.metadata.background_callcount', + 'process.Ext.api.metadata.ms_since_last_keyevent', + 'process.Ext.api.metadata.procedure_symbol', + 'process.Ext.api.metadata.return_value', + 'process.Ext.api.metadata.start_address_allocation_protection', + 'process.Ext.api.metadata.start_address_module', + 'process.Ext.api.metadata.target_address_name', + 'process.Ext.api.metadata.target_address_path', + 'process.Ext.api.metadata.thread_info_flags', + 'process.Ext.api.metadata.visible_windows_count', + 'process.Ext.api.metadata.windows_count', + 'process.Ext.api.name', + 'process.Ext.api.parameters.address', + 'process.Ext.api.parameters.allocation_type', + 'process.Ext.api.parameters.argument1', + 'process.Ext.api.parameters.argument2', + 'process.Ext.api.parameters.argument3', + 'process.Ext.api.parameters.context_flags', + 'process.Ext.api.parameters.desired_access', + 'process.Ext.api.parameters.desired_access_numeric', + 'process.Ext.api.parameters.device', + 'process.Ext.api.parameters.driver', + 'process.Ext.api.parameters.eax', + 'process.Ext.api.parameters.ebp', + 'process.Ext.api.parameters.ebx', + 'process.Ext.api.parameters.ecx', + 'process.Ext.api.parameters.edi', + 'process.Ext.api.parameters.edx', + 'process.Ext.api.parameters.eip', + 'process.Ext.api.parameters.esi', + 'process.Ext.api.parameters.esp', + 'process.Ext.api.parameters.flags', + 'process.Ext.api.parameters.handle_type', + 'process.Ext.api.parameters.hook_module', + 'process.Ext.api.parameters.hook_type', + 'process.Ext.api.parameters.procedure', + 'process.Ext.api.parameters.protection', + 'process.Ext.api.parameters.protection_old', + 'process.Ext.api.parameters.r8', + 'process.Ext.api.parameters.r9', + 'process.Ext.api.parameters.rax', + 'process.Ext.api.parameters.rbp', + 'process.Ext.api.parameters.rbx', + 'process.Ext.api.parameters.rcx', + 'process.Ext.api.parameters.rdi', + 'process.Ext.api.parameters.rdx', + 'process.Ext.api.parameters.rip', + 'process.Ext.api.parameters.rsi', + 'process.Ext.api.parameters.rsp', + 'process.Ext.api.parameters.size', + 'process.Ext.api.parameters.usage', + 'process.Ext.api.parameters.usage_page', + 'process.Ext.api.summary', + 'process.Ext.architecture', + 'process.Ext.authentication_id', + 'process.Ext.code_signature.exists', + 'process.Ext.code_signature.status', + 'process.Ext.code_signature.subject_name', + 'process.Ext.code_signature.trusted', + 'process.Ext.code_signature.valid', + 'process.Ext.defense_evasions', + 'process.Ext.device.bus_type', + 'process.Ext.device.dos_name', + 'process.Ext.device.file_system_type', + 'process.Ext.device.nt_name', + 'process.Ext.device.product_id', + 'process.Ext.device.serial_number', + 'process.Ext.device.vendor_id', + 'process.Ext.device.volume_device_type', + 'process.Ext.dll.Ext.mapped_address', + 'process.Ext.dll.Ext.mapped_size', + 'process.Ext.dll.name', + 'process.Ext.dll.path', + 'process.Ext.effective_parent.entity_id', + 'process.Ext.effective_parent.executable', + 'process.Ext.effective_parent.name', + 'process.Ext.effective_parent.pid', + 'process.Ext.memory_region.allocation_base', + 'process.Ext.memory_region.allocation_protection', + 'process.Ext.memory_region.allocation_size', + 'process.Ext.memory_region.allocation_type', + 'process.Ext.memory_region.bytes_address', + 'process.Ext.memory_region.bytes_allocation_offset', + 'process.Ext.memory_region.bytes_compressed', + 'process.Ext.memory_region.bytes_compressed_present', + 'process.Ext.memory_region.hash.sha256', + 'process.Ext.memory_region.malware_signature.all_names', + 'process.Ext.memory_region.malware_signature.identifier', + 'process.Ext.memory_region.malware_signature.primary.matches', + 'process.Ext.memory_region.malware_signature.primary.signature.hash.sha256', + 'process.Ext.memory_region.malware_signature.primary.signature.id', + 'process.Ext.memory_region.malware_signature.primary.signature.name', + 'process.Ext.memory_region.malware_signature.version', + 'process.Ext.memory_region.mapped_path', + 'process.Ext.memory_region.mapped_pe.Ext.dotnet', + 'process.Ext.memory_region.mapped_pe.Ext.sections.hash.md5', + 'process.Ext.memory_region.mapped_pe.Ext.sections.hash.sha1', + 'process.Ext.memory_region.mapped_pe.Ext.sections.hash.sha256', + 'process.Ext.memory_region.mapped_pe.Ext.sections.hash.sha384', + 'process.Ext.memory_region.mapped_pe.Ext.sections.hash.sha512', + 'process.Ext.memory_region.mapped_pe.Ext.sections.hash.ssdeep', + 'process.Ext.memory_region.mapped_pe.Ext.sections.hash.tlsh', + 'process.Ext.memory_region.mapped_pe.Ext.sections.name', + 'process.Ext.memory_region.mapped_pe.Ext.streams.hash.md5', + 'process.Ext.memory_region.mapped_pe.Ext.streams.hash.sha1', + 'process.Ext.memory_region.mapped_pe.Ext.streams.hash.sha256', + 'process.Ext.memory_region.mapped_pe.Ext.streams.hash.sha384', + 'process.Ext.memory_region.mapped_pe.Ext.streams.hash.sha512', + 'process.Ext.memory_region.mapped_pe.Ext.streams.hash.ssdeep', + 'process.Ext.memory_region.mapped_pe.Ext.streams.hash.tlsh', + 'process.Ext.memory_region.mapped_pe.Ext.streams.name', + 'process.Ext.memory_region.mapped_pe.architecture', + 'process.Ext.memory_region.mapped_pe.company', + 'process.Ext.memory_region.mapped_pe.description', + 'process.Ext.memory_region.mapped_pe.file_version', + 'process.Ext.memory_region.mapped_pe.go_import_hash', + 'process.Ext.memory_region.mapped_pe.go_imports', + 'process.Ext.memory_region.mapped_pe.go_imports_names_entropy', + 'process.Ext.memory_region.mapped_pe.go_imports_names_var_entropy', + 'process.Ext.memory_region.mapped_pe.go_stripped', + 'process.Ext.memory_region.mapped_pe.imphash', + 'process.Ext.memory_region.mapped_pe.import_hash', + 'process.Ext.memory_region.mapped_pe.imports', + 'process.Ext.memory_region.mapped_pe.imports_names_entropy', + 'process.Ext.memory_region.mapped_pe.imports_names_var_entropy', + 'process.Ext.memory_region.mapped_pe.original_file_name', + 'process.Ext.memory_region.mapped_pe.pehash', + 'process.Ext.memory_region.mapped_pe.product', + 'process.Ext.memory_region.mapped_pe.sections.entropy', + 'process.Ext.memory_region.mapped_pe.sections.name', + 'process.Ext.memory_region.mapped_pe.sections.physical_size', + 'process.Ext.memory_region.mapped_pe.sections.var_entropy', + 'process.Ext.memory_region.mapped_pe.sections.virtual_size', + 'process.Ext.memory_region.mapped_pe_detected', + 'process.Ext.memory_region.memory_pe.Ext.dotnet', + 'process.Ext.memory_region.memory_pe.Ext.sections.hash.md5', + 'process.Ext.memory_region.memory_pe.Ext.sections.hash.sha1', + 'process.Ext.memory_region.memory_pe.Ext.sections.hash.sha256', + 'process.Ext.memory_region.memory_pe.Ext.sections.hash.sha384', + 'process.Ext.memory_region.memory_pe.Ext.sections.hash.sha512', + 'process.Ext.memory_region.memory_pe.Ext.sections.hash.ssdeep', + 'process.Ext.memory_region.memory_pe.Ext.sections.hash.tlsh', + 'process.Ext.memory_region.memory_pe.Ext.sections.name', + 'process.Ext.memory_region.memory_pe.Ext.streams.hash.md5', + 'process.Ext.memory_region.memory_pe.Ext.streams.hash.sha1', + 'process.Ext.memory_region.memory_pe.Ext.streams.hash.sha256', + 'process.Ext.memory_region.memory_pe.Ext.streams.hash.sha384', + 'process.Ext.memory_region.memory_pe.Ext.streams.hash.sha512', + 'process.Ext.memory_region.memory_pe.Ext.streams.hash.ssdeep', + 'process.Ext.memory_region.memory_pe.Ext.streams.hash.tlsh', + 'process.Ext.memory_region.memory_pe.Ext.streams.name', + 'process.Ext.memory_region.memory_pe.architecture', + 'process.Ext.memory_region.memory_pe.company', + 'process.Ext.memory_region.memory_pe.description', + 'process.Ext.memory_region.memory_pe.file_version', + 'process.Ext.memory_region.memory_pe.go_import_hash', + 'process.Ext.memory_region.memory_pe.go_imports', + 'process.Ext.memory_region.memory_pe.go_imports_names_entropy', + 'process.Ext.memory_region.memory_pe.go_imports_names_var_entropy', + 'process.Ext.memory_region.memory_pe.go_stripped', + 'process.Ext.memory_region.memory_pe.imphash', + 'process.Ext.memory_region.memory_pe.import_hash', + 'process.Ext.memory_region.memory_pe.imports', + 'process.Ext.memory_region.memory_pe.imports_names_entropy', + 'process.Ext.memory_region.memory_pe.imports_names_var_entropy', + 'process.Ext.memory_region.memory_pe.original_file_name', + 'process.Ext.memory_region.memory_pe.pehash', + 'process.Ext.memory_region.memory_pe.product', + 'process.Ext.memory_region.memory_pe.sections.entropy', + 'process.Ext.memory_region.memory_pe.sections.name', + 'process.Ext.memory_region.memory_pe.sections.physical_size', + 'process.Ext.memory_region.memory_pe.sections.var_entropy', + 'process.Ext.memory_region.memory_pe.sections.virtual_size', + 'process.Ext.memory_region.memory_pe_detected', + 'process.Ext.memory_region.region_base', + 'process.Ext.memory_region.region_protection', + 'process.Ext.memory_region.region_size', + 'process.Ext.memory_region.region_state', + 'process.Ext.memory_region.strings', + 'process.Ext.mitigation_policies', + 'process.Ext.protection', + 'process.Ext.relative_file_creation_time', + 'process.Ext.relative_file_name_modify_time', + 'process.Ext.session', + 'process.Ext.session_info.authentication_package', + 'process.Ext.session_info.client_address', + 'process.Ext.session_info.id', + 'process.Ext.session_info.logon_type', + 'process.Ext.session_info.relative_logon_time', + 'process.Ext.session_info.relative_password_age', + 'process.Ext.session_info.user_flags', + 'process.Ext.token.elevation', + 'process.Ext.token.elevation_level', + 'process.Ext.token.elevation_type', + 'process.Ext.token.integrity_level_name', + 'process.Ext.token.security_attributes', + 'process.Ext.trusted', + 'process.Ext.trusted_descendant', + 'process.args', + 'process.args_count', + 'process.code_signature.exists', + 'process.code_signature.signing_id', + 'process.code_signature.status', + 'process.code_signature.subject_name', + 'process.code_signature.team_id', + 'process.code_signature.trusted', + 'process.code_signature.valid', + 'process.command_line', + 'process.command_line.caseless', + 'process.command_line.text', + 'process.end', + 'process.entity_id', + 'process.entry_leader.args', + 'process.entry_leader.args_count', + 'process.entry_leader.attested_groups.name', + 'process.entry_leader.attested_user.id', + 'process.entry_leader.attested_user.name', + 'process.entry_leader.attested_user.name.text', + 'process.entry_leader.command_line', + 'process.entry_leader.command_line.caseless', + 'process.entry_leader.command_line.text', + 'process.entry_leader.entity_id', + 'process.entry_leader.entry_meta.source.ip', + 'process.entry_leader.entry_meta.type', + 'process.entry_leader.executable', + 'process.entry_leader.executable.caseless', + 'process.entry_leader.executable.text', + 'process.entry_leader.group.id', + 'process.entry_leader.group.name', + 'process.entry_leader.interactive', + 'process.entry_leader.name', + 'process.entry_leader.name.caseless', + 'process.entry_leader.name.text', + 'process.entry_leader.parent.entity_id', + 'process.entry_leader.parent.pid', + 'process.entry_leader.parent.session_leader.entity_id', + 'process.entry_leader.parent.session_leader.pid', + 'process.entry_leader.parent.session_leader.start', + 'process.entry_leader.parent.start', + 'process.entry_leader.pid', + 'process.entry_leader.real_group.id', + 'process.entry_leader.real_group.name', + 'process.entry_leader.real_user.id', + 'process.entry_leader.real_user.name', + 'process.entry_leader.real_user.name.text', + 'process.entry_leader.same_as_process', + 'process.entry_leader.saved_group.id', + 'process.entry_leader.saved_group.name', + 'process.entry_leader.saved_user.id', + 'process.entry_leader.saved_user.name', + 'process.entry_leader.saved_user.name.text', + 'process.entry_leader.start', + 'process.entry_leader.supplemental_groups.id', + 'process.entry_leader.supplemental_groups.name', + 'process.entry_leader.tty.char_device.major', + 'process.entry_leader.tty.char_device.minor', + 'process.entry_leader.user.id', + 'process.entry_leader.user.name', + 'process.entry_leader.user.name.text', + 'process.entry_leader.working_directory', + 'process.entry_leader.working_directory.caseless', + 'process.entry_leader.working_directory.text', + 'process.env_vars', + 'process.executable', + 'process.executable.caseless', + 'process.executable.text', + 'process.exit_code', + 'process.group.id', + 'process.group.name', + 'process.group_leader.args', + 'process.group_leader.args_count', + 'process.group_leader.command_line', + 'process.group_leader.command_line.caseless', + 'process.group_leader.command_line.text', + 'process.group_leader.entity_id', + 'process.group_leader.executable', + 'process.group_leader.executable.caseless', + 'process.group_leader.executable.text', + 'process.group_leader.group.id', + 'process.group_leader.group.name', + 'process.group_leader.interactive', + 'process.group_leader.name', + 'process.group_leader.name.caseless', + 'process.group_leader.name.text', + 'process.group_leader.pid', + 'process.group_leader.real_group.id', + 'process.group_leader.real_group.name', + 'process.group_leader.real_user.id', + 'process.group_leader.real_user.name', + 'process.group_leader.real_user.name.text', + 'process.group_leader.same_as_process', + 'process.group_leader.saved_group.id', + 'process.group_leader.saved_group.name', + 'process.group_leader.saved_user.id', + 'process.group_leader.saved_user.name', + 'process.group_leader.saved_user.name.text', + 'process.group_leader.start', + 'process.group_leader.supplemental_groups.id', + 'process.group_leader.supplemental_groups.name', + 'process.group_leader.tty.char_device.major', + 'process.group_leader.tty.char_device.minor', + 'process.group_leader.user.id', + 'process.group_leader.user.name', + 'process.group_leader.user.name.text', + 'process.group_leader.working_directory', + 'process.group_leader.working_directory.caseless', + 'process.group_leader.working_directory.text', + 'process.hash.md5', + 'process.hash.sha1', + 'process.hash.sha256', + 'process.hash.sha512', + 'process.interactive', + 'process.io.max_bytes_per_process_exceeded', + 'process.io.text', + 'process.io.total_bytes_captured', + 'process.io.total_bytes_skipped', + 'process.name', + 'process.name.caseless', + 'process.name.text', + 'process.parent.Ext.architecture', + 'process.parent.Ext.code_signature.exists', + 'process.parent.Ext.code_signature.status', + 'process.parent.Ext.code_signature.subject_name', + 'process.parent.Ext.code_signature.trusted', + 'process.parent.Ext.code_signature.valid', + 'process.parent.Ext.protection', + 'process.parent.Ext.real.pid', + 'process.parent.Ext.user', + 'process.parent.args', + 'process.parent.args_count', + 'process.parent.code_signature.exists', + 'process.parent.code_signature.signing_id', + 'process.parent.code_signature.status', + 'process.parent.code_signature.subject_name', + 'process.parent.code_signature.team_id', + 'process.parent.code_signature.trusted', + 'process.parent.code_signature.valid', + 'process.parent.command_line', + 'process.parent.command_line.caseless', + 'process.parent.command_line.text', + 'process.parent.entity_id', + 'process.parent.executable', + 'process.parent.executable.caseless', + 'process.parent.executable.text', + 'process.parent.exit_code', + 'process.parent.group.id', + 'process.parent.group.name', + 'process.parent.group_leader.entity_id', + 'process.parent.group_leader.pid', + 'process.parent.group_leader.start', + 'process.parent.hash.md5', + 'process.parent.hash.sha1', + 'process.parent.hash.sha256', + 'process.parent.hash.sha512', + 'process.parent.interactive', + 'process.parent.name', + 'process.parent.name.caseless', + 'process.parent.name.text', + 'process.parent.pe.company', + 'process.parent.pe.description', + 'process.parent.pe.file_version', + 'process.parent.pe.imphash', + 'process.parent.pe.original_file_name', + 'process.parent.pe.product', + 'process.parent.pgid', + 'process.parent.pid', + 'process.parent.ppid', + 'process.parent.real_group.id', + 'process.parent.real_group.name', + 'process.parent.real_user.id', + 'process.parent.real_user.name', + 'process.parent.real_user.name.text', + 'process.parent.saved_group.id', + 'process.parent.saved_group.name', + 'process.parent.saved_user.id', + 'process.parent.saved_user.name', + 'process.parent.saved_user.name.text', + 'process.parent.start', + 'process.parent.supplemental_groups.id', + 'process.parent.supplemental_groups.name', + 'process.parent.thread.Ext.call_stack.allocation_private_bytes', + 'process.parent.thread.Ext.call_stack.callsite_leading_bytes', + 'process.parent.thread.Ext.call_stack.callsite_trailing_bytes', + 'process.parent.thread.Ext.call_stack.protection', + 'process.parent.thread.Ext.call_stack.symbol_info', + 'process.parent.thread.Ext.call_stack_contains_unbacked', + 'process.parent.thread.Ext.call_stack_summary', + 'process.parent.thread.id', + 'process.parent.thread.name', + 'process.parent.title', + 'process.parent.title.text', + 'process.parent.tty.char_device.major', + 'process.parent.tty.char_device.minor', + 'process.parent.uptime', + 'process.parent.user.id', + 'process.parent.user.name', + 'process.parent.user.name.text', + 'process.parent.working_directory', + 'process.parent.working_directory.caseless', + 'process.parent.working_directory.text', + 'process.pe.company', + 'process.pe.description', + 'process.pe.file_version', + 'process.pe.imphash', + 'process.pe.original_file_name', + 'process.pe.product', + 'process.pgid', + 'process.pid', + 'process.ppid', + 'process.previous.args', + 'process.previous.args_count', + 'process.previous.executable', + 'process.previous.executable.caseless', + 'process.previous.executable.text', + 'process.real_group.id', + 'process.real_group.name', + 'process.real_user.id', + 'process.real_user.name', + 'process.real_user.name.text', + 'process.saved_group.id', + 'process.saved_group.name', + 'process.saved_user.id', + 'process.saved_user.name', + 'process.saved_user.name.text', + 'process.session_leader.args', + 'process.session_leader.args_count', + 'process.session_leader.command_line', + 'process.session_leader.command_line.caseless', + 'process.session_leader.command_line.text', + 'process.session_leader.entity_id', + 'process.session_leader.executable', + 'process.session_leader.executable.caseless', + 'process.session_leader.executable.text', + 'process.session_leader.group.id', + 'process.session_leader.group.name', + 'process.session_leader.interactive', + 'process.session_leader.name', + 'process.session_leader.name.caseless', + 'process.session_leader.name.text', + 'process.session_leader.parent.entity_id', + 'process.session_leader.parent.pid', + 'process.session_leader.parent.session_leader.entity_id', + 'process.session_leader.parent.session_leader.pid', + 'process.session_leader.parent.session_leader.start', + 'process.session_leader.parent.start', + 'process.session_leader.pid', + 'process.session_leader.real_group.id', + 'process.session_leader.real_group.name', + 'process.session_leader.real_user.id', + 'process.session_leader.real_user.name', + 'process.session_leader.real_user.name.text', + 'process.session_leader.same_as_process', + 'process.session_leader.saved_group.id', + 'process.session_leader.saved_group.name', + 'process.session_leader.saved_user.id', + 'process.session_leader.saved_user.name', + 'process.session_leader.saved_user.name.text', + 'process.session_leader.start', + 'process.session_leader.supplemental_groups.id', + 'process.session_leader.supplemental_groups.name', + 'process.session_leader.tty.char_device.major', + 'process.session_leader.tty.char_device.minor', + 'process.session_leader.user.id', + 'process.session_leader.user.name', + 'process.session_leader.user.name.text', + 'process.session_leader.working_directory', + 'process.session_leader.working_directory.caseless', + 'process.session_leader.working_directory.text', + 'process.start', + 'process.supplemental_groups.id', + 'process.supplemental_groups.name', + 'process.thread.Ext.call_stack.allocation_private_bytes', + 'process.thread.Ext.call_stack.callsite_leading_bytes', + 'process.thread.Ext.call_stack.callsite_trailing_bytes', + 'process.thread.Ext.call_stack.instruction_pointer', + 'process.thread.Ext.call_stack.module_path', + 'process.thread.Ext.call_stack.protection', + 'process.thread.Ext.call_stack.protection_provenance', + 'process.thread.Ext.call_stack.symbol_info', + 'process.thread.Ext.call_stack_contains_unbacked', + 'process.thread.Ext.call_stack_final_user_module.code_signature.exists', + 'process.thread.Ext.call_stack_final_user_module.code_signature.status', + 'process.thread.Ext.call_stack_final_user_module.code_signature.subject_name', + 'process.thread.Ext.call_stack_final_user_module.code_signature.trusted', + 'process.thread.Ext.call_stack_final_user_module.code_signature.valid', + 'process.thread.Ext.call_stack_final_user_module.hash.sha256', + 'process.thread.Ext.call_stack_final_user_module.name', + 'process.thread.Ext.call_stack_final_user_module.path', + 'process.thread.Ext.call_stack_final_user_module.protection_provenance', + 'process.thread.Ext.call_stack_summary', + 'process.thread.capabilities.effective', + 'process.thread.capabilities.permitted', + 'process.thread.id', + 'process.thread.name', + 'process.title', + 'process.title.text', + 'process.tty.char_device.major', + 'process.tty.char_device.minor', + 'process.tty.columns', + 'process.tty.rows', + 'process.uptime', + 'process.user.id', + 'process.user.name', + 'process.user.name.text', + 'process.working_directory', + 'process.working_directory.caseless', + 'process.working_directory.text', + 'registry.data.bytes', + 'registry.data.strings', + 'registry.data.type', + 'registry.hive', + 'registry.key', + 'registry.path', + 'registry.value', + 'source.address', + 'source.as.number', + 'source.as.organization.name', + 'source.as.organization.name.text', + 'source.bytes', + 'source.domain', + 'source.geo.city_name', + 'source.geo.continent_code', + 'source.geo.continent_name', + 'source.geo.country_iso_code', + 'source.geo.country_name', + 'source.geo.location', + 'source.geo.name', + 'source.geo.postal_code', + 'source.geo.region_iso_code', + 'source.geo.region_name', + 'source.geo.timezone', + 'source.ip', + 'source.packets', + 'source.port', + 'source.registered_domain', + 'source.top_level_domain', + 'user.Ext.real.id', + 'user.Ext.real.name', + 'user.domain', + 'user.email', + 'user.full_name', + 'user.full_name.text', + 'user.group.Ext.real.id', + 'user.group.Ext.real.name', + 'user.group.domain', + 'user.group.id', + 'user.group.name', + 'user.hash', + 'user.id', + 'user.name', + 'user.name.text', +]; diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/common/artifact_list_item_entry_values.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/common/artifact_list_item_entry_values.ts new file mode 100644 index 0000000000000..bd0321fda8f30 --- /dev/null +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/common/artifact_list_item_entry_values.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ListOperator, ListOperatorType } from '@kbn/securitysolution-io-ts-list-types'; +import { ListOperatorEnum, ListOperatorTypeEnum } from '@kbn/securitysolution-io-ts-list-types'; + +export const LIST_ITEM_ENTRY_OPERATOR_TYPES: readonly ListOperatorType[] = Object.freeze([ + ListOperatorTypeEnum.NESTED, + ListOperatorTypeEnum.MATCH, + ListOperatorTypeEnum.MATCH_ANY, + ListOperatorTypeEnum.WILDCARD, + ListOperatorTypeEnum.EXISTS, + ListOperatorTypeEnum.LIST, +]); + +export const LIST_ITEM_ENTRY_OPERATOR: readonly ListOperator[] = Object.freeze([ + ListOperatorEnum.INCLUDED, + ListOperatorEnum.EXCLUDED, +]); diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/endpoint_exceptions_generator.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/endpoint_exceptions_generator.ts new file mode 100644 index 0000000000000..99be8d51e195b --- /dev/null +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/endpoint_exceptions_generator.ts @@ -0,0 +1,85 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { + CreateExceptionListItemSchema, + ExceptionListItemSchema, + ListOperatorType, +} from '@kbn/securitysolution-io-ts-list-types'; +import { ListOperatorTypeEnum } from '@kbn/securitysolution-io-ts-list-types'; +import { ENDPOINT_LIST_ID } from '@kbn/securitysolution-list-constants'; +import { LIST_ITEM_ENTRY_OPERATOR_TYPES } from './common/artifact_list_item_entry_values'; +import { exceptionItemToCreateExceptionItem } from './exceptions_list_item_generator'; +import { BaseDataGenerator } from './base_data_generator'; +import { GLOBAL_ARTIFACT_TAG } from '../service/artifacts'; +import { ENDPOINT_EVENTS_LOG_INDEX_FIELDS } from './common/alerts_ecs_fields'; + +export class EndpointExceptionsGenerator extends BaseDataGenerator { + generate(overrides: Partial = {}): ExceptionListItemSchema { + return { + name: `Generated Exception (${this.randomString(5)})`, + comments: [], + description: 'created by EndpointExceptionsGenerator', + id: this.seededUUIDv4(), + item_id: this.seededUUIDv4(), + list_id: ENDPOINT_LIST_ID, + tags: [GLOBAL_ARTIFACT_TAG], + entries: this.randomEndpointExceptionEntries(1), + meta: undefined, + namespace_type: 'agnostic', + os_types: [this.randomOSFamily()] as ExceptionListItemSchema['os_types'], + created_at: this.randomPastDate(), + created_by: this.randomUser(), + updated_at: '2020-04-20T15:25:31.830Z', + expire_time: undefined, + updated_by: this.randomUser(), + _version: this.randomString(5), + type: 'simple', + tie_breaker_id: this.seededUUIDv4(), + ...overrides, + }; + } + + generateEndpointExceptionForCreate( + overrides: Partial = {} + ): CreateExceptionListItemSchema { + return { + ...exceptionItemToCreateExceptionItem(this.generate()), + ...overrides, + }; + } + + protected randomEndpointExceptionEntries( + count: number = this.randomN(5) + ): ExceptionListItemSchema['entries'] { + const operatorTypes = LIST_ITEM_ENTRY_OPERATOR_TYPES.filter( + (item) => + !( + [ + ListOperatorTypeEnum.LIST, + ListOperatorTypeEnum.NESTED, + ListOperatorTypeEnum.EXISTS, + ] as ListOperatorType[] + ).includes(item) + ); + const fieldList = ENDPOINT_EVENTS_LOG_INDEX_FIELDS.filter((field) => field.endsWith('.text')); + + return Array.from({ length: count || 1 }, () => { + const operatorType = this.randomChoice(operatorTypes); + + return { + field: this.randomChoice(fieldList), + operator: 'included', + type: operatorType, + value: + operatorType === ListOperatorTypeEnum.MATCH_ANY + ? [this.randomString(10), this.randomString(10)] + : this.randomString(10), + }; + }) as ExceptionListItemSchema['entries']; + } +} diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/event_filters_generator.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/event_filters_generator.ts new file mode 100644 index 0000000000000..5b87f282ec3c7 --- /dev/null +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/event_filters_generator.ts @@ -0,0 +1,85 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { + ExceptionListItemSchema, + CreateExceptionListItemSchema, + ListOperator, +} from '@kbn/securitysolution-io-ts-list-types'; +import { ENDPOINT_ARTIFACT_LISTS } from '@kbn/securitysolution-list-constants'; +import { exceptionItemToCreateExceptionItem } from './exceptions_list_item_generator'; +import { GLOBAL_ARTIFACT_TAG } from '../service/artifacts'; +import { BaseDataGenerator } from './base_data_generator'; +import { ENDPOINT_EVENTS_LOG_INDEX_FIELDS } from './common/alerts_ecs_fields'; + +const ENTRY_OPERATORS: readonly ListOperator[] = ['included', 'excluded']; + +export class EventFiltersGenerator extends BaseDataGenerator { + generate(overrides: Partial = {}): ExceptionListItemSchema { + return { + id: this.seededUUIDv4(), + item_id: this.seededUUIDv4(), + list_id: ENDPOINT_ARTIFACT_LISTS.eventFilters.id, + meta: undefined, + name: `Event filter (${this.randomString(5)})`, + description: `created by ${this.constructor.name}`, + tags: [GLOBAL_ARTIFACT_TAG], + entries: this.randomEventFilterEntries(), + expire_time: undefined, + namespace_type: 'agnostic', + type: 'simple', + os_types: [this.randomOSFamily()] as ExceptionListItemSchema['os_types'], + tie_breaker_id: this.seededUUIDv4(), + _version: this.randomString(5), + comments: [], + created_at: this.randomPastDate(), + created_by: this.randomUser(), + updated_at: '2020-04-20T15:25:31.830Z', + updated_by: this.randomUser(), + ...overrides, + }; + } + + generateEventFilterForCreate( + overrides: Partial = {} + ): CreateExceptionListItemSchema { + return { + ...exceptionItemToCreateExceptionItem(this.generate()), + ...overrides, + }; + } + + protected randomEventFilterEntries( + count: number = this.randomN(5) + ): ExceptionListItemSchema['entries'] { + return Array.from({ length: count || 1 }, () => { + if (this.randomBoolean()) { + // single entry + return { + field: this.randomChoice(ENDPOINT_EVENTS_LOG_INDEX_FIELDS), + operator: this.randomChoice(ENTRY_OPERATORS), + type: 'match', + value: this.randomString(10), + }; + } else { + // nested entry + return { + field: this.randomChoice(ENDPOINT_EVENTS_LOG_INDEX_FIELDS), + type: 'nested', + entries: [ + { + field: this.randomChoice(ENDPOINT_EVENTS_LOG_INDEX_FIELDS), + operator: this.randomChoice(ENTRY_OPERATORS), + type: 'match', + value: this.randomString(10), + }, + ], + }; + } + }); + } +} diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts index a9b2cbd697f4a..cb332f8dea55a 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts @@ -39,7 +39,7 @@ type UpdateExceptionListItemSchemaWithNonNullProps = NonNullableTypeProperties< > & Pick; -const exceptionItemToCreateExceptionItem = ( +export const exceptionItemToCreateExceptionItem = ( exceptionItem: ExceptionListItemSchema ): CreateExceptionListItemSchemaWithNonNullProps => { const { diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_agent_generator.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_agent_generator.ts index 2df3db5b70eeb..806ae7f289f26 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_agent_generator.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_agent_generator.ts @@ -247,4 +247,8 @@ export class FleetAgentGenerator extends BaseDataGenerator { public randomAgentStatus() { return this.randomChoice(agentStatusList); } + + public randomString(length: number = 5) { + return super.randomString(length); + } } diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts index fa51e50cb6226..12505dc87a2b0 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts @@ -104,7 +104,7 @@ export const setupFleetForEndpoint = usageTracker.track( export const installOrUpgradeEndpointFleetPackage = usageTracker.track( 'installOrUpgradeEndpointFleetPackage', async (kbnClient: KbnClient, logger: ToolingLog): Promise => { - logger.info(`installOrUpgradeEndpointFleetPackage(): starting`); + logger.debug(`installOrUpgradeEndpointFleetPackage(): starting`); const updatePackages = async () => { const installEndpointPackageResp = (await kbnClient diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts index 0586aca1d0c76..01974b85d6f65 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts @@ -9,6 +9,7 @@ import { mergeWith } from 'lodash'; import type { ToolingLogTextWriterConfig } from '@kbn/tooling-log'; import { ToolingLog } from '@kbn/tooling-log'; import type { Flags } from '@kbn/dev-cli-runner'; +import moment from 'moment/moment'; export const RETRYABLE_TRANSIENT_ERRORS: Readonly> = [ 'no_shard_available_action_exception', @@ -76,18 +77,18 @@ export const retryOnError = async ( const thisAttempt = attempt; attempt++; - log.info(msg(`attempt ${thisAttempt} started at: ${new Date().toISOString()}`)); + log.debug(msg(`attempt ${thisAttempt} started at: ${new Date().toISOString()}`)); try { responsePromise = callback(); // store promise so that if it fails and no more attempts, we return the last failure const result = await responsePromise; - log.info(msg(`attempt ${thisAttempt} was successful. Exiting retry`)); + log.debug(msg(`attempt ${thisAttempt} was successful. Exiting retry`)); log.indent(-4); return result; } catch (err) { - log.info(msg(`attempt ${thisAttempt} failed with: ${err.message}`), err); + log.warning(msg(`attempt ${thisAttempt} failed with: ${err.message}`), err); // If not an error that is retryable, then end loop here and return that error; if (!isRetryableError(err)) { @@ -157,3 +158,26 @@ createToolingLogger.setDefaultLogLevelFromCliFlags = (flags) => { ? 'error' : 'info'; }; + +/** + * Get human readable string of time elapsed between to dates. Return value will be in the format + * of `hh:mm:ss.ms` + * @param startDate + * @param endTime + */ +export const getElapsedTime = ( + startDate: string | Date, + endTime: string | Date = new Date() +): string => { + const durationObj = moment.duration(moment(endTime).diff(startDate)); + const pad = (num: number, max = 2): string => { + return String(num).padStart(max, '0'); + }; + + const hours = pad(durationObj.hours()); + const minutes = pad(durationObj.minutes()); + const seconds = pad(durationObj.seconds()); + const milliseconds = pad(durationObj.milliseconds(), 3); + + return `${hours}:${minutes}:${seconds}.${milliseconds}`; +}; diff --git a/x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/isolate_form.tsx b/x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/isolate_form.tsx index e485dde1bd2fe..fe0889e80cda7 100644 --- a/x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/isolate_form.tsx +++ b/x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/isolate_form.tsx @@ -31,20 +31,10 @@ export interface EndpointIsolatedFormProps { messageAppend?: ReactNode; /** If true, then `Confirm` and `Cancel` buttons will be disabled, and `Confirm` button will loading loading style */ isLoading?: boolean; - hideCommentField?: boolean; } export const EndpointIsolateForm = memo( - ({ - hostName, - onCancel, - onConfirm, - onChange, - comment = '', - messageAppend, - isLoading = false, - hideCommentField = false, - }) => { + ({ hostName, onCancel, onConfirm, onChange, comment = '', messageAppend, isLoading = false }) => { const handleCommentChange: ChangeEventHandler = useCallback( (event) => { onChange({ comment: event.target.value }); @@ -76,17 +66,15 @@ export const EndpointIsolateForm = memo( - {!hideCommentField && ( - - - - )} + + + diff --git a/x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/unisolate_form.tsx b/x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/unisolate_form.tsx index aa5591f7b5d27..b1ffb60c6bbff 100644 --- a/x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/unisolate_form.tsx +++ b/x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/unisolate_form.tsx @@ -23,16 +23,7 @@ import { CANCEL, COMMENT, COMMENT_PLACEHOLDER, CONFIRM, UNISOLATE, ISOLATED } fr import type { EndpointIsolatedFormProps } from './isolate_form'; export const EndpointUnisolateForm = memo( - ({ - hostName, - onCancel, - onConfirm, - onChange, - comment = '', - messageAppend, - isLoading = false, - hideCommentField = false, - }) => { + ({ hostName, onCancel, onConfirm, onChange, comment = '', messageAppend, isLoading = false }) => { const handleCommentChange: ChangeEventHandler = useCallback( (event) => { onChange({ comment: event.target.value }); @@ -61,17 +52,15 @@ export const EndpointUnisolateForm = memo( - {!hideCommentField && ( - - - - )} + + + diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/overview/index.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/overview/index.tsx index 1ce8e1ef03c60..0091246a114cb 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/overview/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/overview/index.tsx @@ -30,7 +30,6 @@ import { OverviewCardWithActions, OverviewCard } from './overview_card'; import { StatusPopoverButton } from './status_popover_button'; import { SeverityBadge } from '../../severity_badge'; import { useThrottledResizeObserver } from '../../utils'; -import { isNotNull } from '../../../../timelines/store/helpers'; export const NotGrowingFlexGroup = euiStyled(EuiFlexGroup)` flex-grow: 0; @@ -219,4 +218,8 @@ function hasData(fieldInfo?: EnrichedFieldInfo): fieldInfo is EnrichedFieldInfoW return !!fieldInfo && Array.isArray(fieldInfo.values); } +function isNotNull(value: T | null): value is T { + return value !== null; +} + Overview.displayName = 'Overview'; diff --git a/x-pack/plugins/security_solution/public/common/store/epic.ts b/x-pack/plugins/security_solution/public/common/store/epic.ts deleted file mode 100644 index a5cebee7c96b6..0000000000000 --- a/x-pack/plugins/security_solution/public/common/store/epic.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { Epic } from 'redux-observable'; -import { combineEpics } from 'redux-observable'; -import type { Action } from 'redux'; -import type { Observable } from 'rxjs'; -import type { CoreStart } from '@kbn/core/public'; -import { createTimelineEpic } from '../../timelines/store/epic'; -import { createTimelineFavoriteEpic } from '../../timelines/store/epic_favorite'; -import { createTimelineNoteEpic } from '../../timelines/store/epic_note'; -import { createTimelinePinnedEventEpic } from '../../timelines/store/epic_pinned_event'; -import type { TimelineEpicDependencies } from '../../timelines/store/types'; -import type { State } from './types'; - -export interface RootEpicDependencies { - kibana$: Observable; -} - -export const createRootEpic = (): Epic< - Action, - Action, - StateT, - TimelineEpicDependencies -> => - combineEpics( - createTimelineEpic(), - createTimelineFavoriteEpic(), - createTimelineNoteEpic(), - createTimelinePinnedEventEpic() - ); diff --git a/x-pack/plugins/security_solution/public/common/store/middlewares.ts b/x-pack/plugins/security_solution/public/common/store/middlewares.ts index f65cc2abe0a53..76c290a3c895c 100644 --- a/x-pack/plugins/security_solution/public/common/store/middlewares.ts +++ b/x-pack/plugins/security_solution/public/common/store/middlewares.ts @@ -4,16 +4,18 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + +import type { CoreStart } from '@kbn/core/public'; import type { Storage } from '@kbn/kibana-utils-plugin/public'; import { createTimelineMiddlewares } from '../../timelines/store/middlewares/create_timeline_middlewares'; import { dataTableLocalStorageMiddleware } from './data_table/middleware_local_storage'; import { userAssetTableLocalStorageMiddleware } from '../../explore/users/store/middleware_storage'; -export function createMiddlewares(storage: Storage) { +export function createMiddlewares(kibana: CoreStart, storage: Storage) { return [ dataTableLocalStorageMiddleware(storage), userAssetTableLocalStorageMiddleware(storage), - ...createTimelineMiddlewares(), + ...createTimelineMiddlewares(kibana), ]; } diff --git a/x-pack/plugins/security_solution/public/common/store/store.ts b/x-pack/plugins/security_solution/public/common/store/store.ts index bcdd7b67b3b44..ed1b7844dec0b 100644 --- a/x-pack/plugins/security_solution/public/common/store/store.ts +++ b/x-pack/plugins/security_solution/public/common/store/store.ts @@ -11,14 +11,12 @@ import type { Middleware, Dispatch, PreloadedState, - CombinedState, AnyAction, Reducer, } from 'redux'; import { applyMiddleware, createStore as createReduxStore } from 'redux'; import { composeWithDevTools } from 'redux-devtools-extension/developmentOnly'; import type { EnhancerOptions } from 'redux-devtools-extension'; -import { createEpicMiddleware } from 'redux-observable'; import type { Observable } from 'rxjs'; import { BehaviorSubject, pluck } from 'rxjs'; import type { Storage } from '@kbn/kibana-utils-plugin/public'; @@ -33,18 +31,14 @@ import { SERVER_APP_ID, } from '../../../common/constants'; import { telemetryMiddleware } from '../lib/telemetry'; -import { appSelectors } from './app'; -import { timelineSelectors } from '../../timelines/store'; import * as timelineActions from '../../timelines/store/actions'; import type { TimelineModel } from '../../timelines/store/model'; -import { inputsSelectors } from './inputs'; import type { SubPluginsInitReducer } from './reducer'; import { createInitialState, createReducer } from './reducer'; -import { createRootEpic } from './epic'; import type { AppAction } from './actions'; import type { Immutable } from '../../../common/endpoint/types'; import type { State } from './types'; -import type { TimelineEpicDependencies, TimelineState } from '../../timelines/store/types'; +import type { TimelineState } from '../../timelines/store/types'; import type { KibanaDataView, SourcererModel, SourcererDataView } from './sourcerer/model'; import { initDataView } from './sourcerer/model'; import type { AppObservableLibs, StartedSubPlugins, StartPlugins } from '../../types'; @@ -255,7 +249,7 @@ const stateSanitizer = (state: State) => { export const createStore = ( state: State, pluginsReducer: SubPluginsInitReducer, - kibana: Observable, + kibana$: Observable, storage: Storage, additionalMiddleware?: Array>>> ): Store => { @@ -272,23 +266,18 @@ export const createStore = ( const composeEnhancers = composeWithDevTools(enhancerOptions); - const middlewareDependencies: TimelineEpicDependencies = { - kibana$: kibana, - selectAllTimelineQuery: inputsSelectors.globalQueryByIdSelector, - selectNotesByIdSelector: appSelectors.selectNotesByIdSelector, - timelineByIdSelector: timelineSelectors.timelineByIdSelector, - timelineTimeRangeSelector: inputsSelectors.timelineTimeRangeSelector, - }; - - const epicMiddleware = createEpicMiddleware( - { - dependencies: middlewareDependencies, - } - ); + // TODO: Once `createStore` does not use redux-observable, we will not need to pass a + // kibana observable anymore. Then we can remove this `any` cast and replace kibana$ + // with a regular kibana instance. + // I'm not doing it in this PR, as this will have an impact on literally hundreds of test files. + // A separate PR will be created to clean this up. + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const kibanaObsv = kibana$ as any; + const kibana = + 'source' in kibanaObsv ? kibanaObsv.source._value.kibana : kibanaObsv._value.kibana; const middlewareEnhancer = applyMiddleware( - ...createMiddlewares(storage), - epicMiddleware, + ...createMiddlewares(kibana, storage), telemetryMiddleware, ...(additionalMiddleware ?? []) ); @@ -299,8 +288,6 @@ export const createStore = ( composeEnhancers(middlewareEnhancer) ); - epicMiddleware.run(createRootEpic>()); - return store; }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/rules_tables.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/rules_tables.tsx index 3c2c79ef20d3f..707846c8a492a 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/rules_tables.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/rules_tables.tsx @@ -10,7 +10,6 @@ import { FormattedMessage } from '@kbn/i18n-react'; import React, { useCallback, useMemo, useRef } from 'react'; import { Loader } from '../../../../common/components/loader'; import { useBoolState } from '../../../../common/hooks/use_bool_state'; -import { useValueChanged } from '../../../../common/hooks/use_value_changed'; import { PrePackagedRulesPrompt } from '../../../../detections/components/rules/pre_packaged_rules/load_empty_prompt'; import type { Rule } from '../../../rule_management/logic'; import * as i18n from '../../../../detections/pages/detection_engine/rules/translations'; @@ -61,7 +60,6 @@ export const RulesTables = React.memo(({ selectedTab }) => { const hasPermissions = hasUserCRUDPermission(canUserCRUD); const isUpgradingSecurityPackages = useIsUpgradingSecurityPackages(); - const tableRef = useRef(null); const rulesTableContext = useRulesTableContext(); const { data: ruleManagementFilters } = useRuleManagementFilters(); @@ -171,14 +169,6 @@ export const RulesTables = React.memo(({ selectedTab }) => { const isSelectAllCalled = useRef(false); - // TODO Remove this synchronization logic after https://github.com/elastic/eui/issues/6184 is implemented - // Synchronize selectedRuleIds with EuiBasicTable's selected rows - useValueChanged((ruleIds) => { - if (tableRef.current != null) { - tableRef.current.setSelection(rules.filter((rule) => ruleIds.includes(rule.id))); - } - }, selectedRuleIds); - const isTableSelectable = hasPermissions && (selectedTab === AllRulesTabs.management || selectedTab === AllRulesTabs.monitoring); @@ -187,30 +177,12 @@ export const RulesTables = React.memo(({ selectedTab }) => { () => ({ selectable: (item: Rule) => !loadingRuleIds.includes(item.id), onSelectionChange: (selected: Rule[]) => { - /** - * EuiBasicTable doesn't provide declarative API to control selected rows. - * This limitation requires us to synchronize selection state manually using setSelection(). - * But it creates a chain reaction when the user clicks Select All: - * selectAll() -> setSelection() -> onSelectionChange() -> setSelection(). - * To break the chain we should check whether the onSelectionChange was triggered - * by the Select All action or not. - * - */ - if (isSelectAllCalled.current) { - isSelectAllCalled.current = false; - // Handle special case of unselecting all rules via checkbox - // after all rules were selected via Bulk select. - if (selected.length === 0) { - setIsAllSelected(false); - setSelectedRuleIds([]); - } - } else { - setSelectedRuleIds(selected.map(({ id }) => id)); - setIsAllSelected(false); - } + setSelectedRuleIds(selected.map(({ id }) => id)); + setIsAllSelected(false); }, + selected: selectedRuleIds.map((id) => ({ id } as Rule)), // EuiBasicTable only needs the itemId }), - [loadingRuleIds, setIsAllSelected, setSelectedRuleIds] + [loadingRuleIds, setIsAllSelected, setSelectedRuleIds, selectedRuleIds] ); const toggleSelectAll = useCallback(() => { @@ -329,7 +301,6 @@ export const RulesTables = React.memo(({ selectedTab }) => { noItemsMessage={NO_ITEMS_MESSAGE} onChange={tableOnChangeCallback} pagination={paginationMemo} - ref={tableRef} selection={isTableSelectable ? euiBasicTableSelectionProps : undefined} sorting={{ sort: { diff --git a/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx b/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx index 7950c60a809fe..0bb767b65275b 100644 --- a/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx @@ -6,11 +6,10 @@ */ import React, { useMemo } from 'react'; +import type { ResponseActionAgentType } from '../../../../common/endpoint/service/response_actions/constants'; import { getSentinelOneAgentId } from '../../../common/utils/sentinelone_alert_check'; import { useCasesFromAlerts } from '../../containers/detection_engine/alerts/use_cases_from_alerts'; import type { TimelineEventsDetailsItem } from '../../../../common/search_strategy'; -import { IsolateSentinelOneHost } from './isolate_sentinelone'; -import { UnisolateSentinelOneHost } from './unisolate_sentinelone'; import { getFieldValue } from './helpers'; import { IsolateHost } from './isolate'; import { UnisolateHost } from './unisolate'; @@ -27,7 +26,7 @@ export const HostIsolationPanel = React.memo( successCallback?: () => void; isolateAction: string; }) => { - const endpointId = useMemo( + const elasticAgentId = useMemo( () => getFieldValue({ category: 'agent', field: 'agent.id' }, details), [details] ); @@ -46,29 +45,22 @@ export const HostIsolationPanel = React.memo( const { casesInfo } = useCasesFromAlerts({ alertId }); - if (sentinelOneAgentId) { - return isolateAction === 'isolateHost' ? ( - - ) : ( - - ); - } + const agentType: ResponseActionAgentType = useMemo( + () => (sentinelOneAgentId ? 'sentinel_one' : 'endpoint'), + [sentinelOneAgentId] + ); + + const endpointId = useMemo( + () => sentinelOneAgentId ?? elasticAgentId, + [elasticAgentId, sentinelOneAgentId] + ); return isolateAction === 'isolateHost' ? ( @@ -77,6 +69,7 @@ export const HostIsolationPanel = React.memo( endpointId={endpointId} hostName={hostName} casesInfo={casesInfo} + agentType={agentType} cancelCallback={cancelCallback} successCallback={successCallback} /> diff --git a/x-pack/plugins/security_solution/public/detections/components/host_isolation/isolate.tsx b/x-pack/plugins/security_solution/public/detections/components/host_isolation/isolate.tsx index 76e0ef2750963..37fa3ad4bfccc 100644 --- a/x-pack/plugins/security_solution/public/detections/components/host_isolation/isolate.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/host_isolation/isolate.tsx @@ -8,6 +8,7 @@ import React, { useMemo, useState, useCallback } from 'react'; import { EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; +import type { ResponseActionAgentType } from '../../../../common/endpoint/service/response_actions/constants'; import { useHostIsolation } from '../../containers/detection_engine/alerts/use_host_isolation'; import { CASES_ASSOCIATED_WITH_ALERT, RETURN_TO_ALERT_DETAILS } from './translations'; import type { EndpointIsolatedFormProps } from '../../../common/components/endpoint/host_isolation'; @@ -22,12 +23,14 @@ export const IsolateHost = React.memo( endpointId, hostName, casesInfo, + agentType, cancelCallback, successCallback, }: { endpointId: string; hostName: string; casesInfo: CasesFromAlertsResponse; + agentType: ResponseActionAgentType; cancelCallback: () => void; successCallback?: () => void; }) => { @@ -42,6 +45,7 @@ export const IsolateHost = React.memo( endpointId, comment, caseIds, + agentType, }); const confirmHostIsolation = useCallback(async () => { diff --git a/x-pack/plugins/security_solution/public/detections/components/host_isolation/isolate_sentinelone.tsx b/x-pack/plugins/security_solution/public/detections/components/host_isolation/isolate_sentinelone.tsx deleted file mode 100644 index 17f50418d187a..0000000000000 --- a/x-pack/plugins/security_solution/public/detections/components/host_isolation/isolate_sentinelone.tsx +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useMemo, useState, useCallback } from 'react'; -import { EuiSpacer } from '@elastic/eui'; -import { SENTINELONE_CONNECTOR_ID, SUB_ACTION } from '@kbn/stack-connectors-plugin/public/common'; -import { useLoadConnectors } from '../../../common/components/response_actions/use_load_connectors'; -import { useSubActionMutation } from '../../../timelines/components/side_panel/event_details/flyout/use_sub_action_mutation'; -import { RETURN_TO_ALERT_DETAILS } from './translations'; -import { - EndpointIsolateForm, - ActionCompletionReturnButton, -} from '../../../common/components/endpoint/host_isolation'; - -export const IsolateSentinelOneHost = React.memo( - ({ - sentinelOneAgentId, - hostName, - cancelCallback, - successCallback, - }: { - sentinelOneAgentId: string; - hostName: string; - cancelCallback: () => void; - successCallback?: () => void; - }) => { - const { data: connectors } = useLoadConnectors({ actionTypeId: SENTINELONE_CONNECTOR_ID }); - const connector = useMemo(() => connectors?.[0], [connectors]); - - const [isIsolated, setIsIsolated] = useState(false); - - const { mutateAsync: isolateHost, isLoading } = useSubActionMutation({ - connectorId: connector?.id as string, - subAction: SUB_ACTION.ISOLATE_HOST, - subActionParams: { - uuid: sentinelOneAgentId, - }, - }); - - const onChange = useCallback(() => {}, []); - - const confirmHostIsolation = useCallback(async () => { - const response = await isolateHost(); - - if (response.status === 'ok') { - setIsIsolated(true); - - if (successCallback) { - successCallback(); - } - } - }, [isolateHost, successCallback]); - - const backToAlertDetails = useCallback(() => cancelCallback(), [cancelCallback]); - - const hostIsolatedSuccessButton = useMemo( - () => ( - - ), - [backToAlertDetails] - ); - - const hostNotIsolated = useMemo( - () => ( - <> - - - - ), - [hostName, backToAlertDetails, confirmHostIsolation, isLoading, onChange] - ); - - return isIsolated ? hostIsolatedSuccessButton : hostNotIsolated; - } -); - -IsolateSentinelOneHost.displayName = 'IsolateSentinelOneHost'; diff --git a/x-pack/plugins/security_solution/public/detections/components/host_isolation/unisolate.tsx b/x-pack/plugins/security_solution/public/detections/components/host_isolation/unisolate.tsx index 0cfdffb559d31..15c59da521579 100644 --- a/x-pack/plugins/security_solution/public/detections/components/host_isolation/unisolate.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/host_isolation/unisolate.tsx @@ -8,6 +8,7 @@ import React, { useMemo, useState, useCallback } from 'react'; import { EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; +import type { ResponseActionAgentType } from '../../../../common/endpoint/service/response_actions/constants'; import { CASES_ASSOCIATED_WITH_ALERT, RETURN_TO_ALERT_DETAILS } from './translations'; import type { EndpointIsolatedFormProps } from '../../../common/components/endpoint/host_isolation'; import { @@ -22,12 +23,14 @@ export const UnisolateHost = React.memo( endpointId, hostName, casesInfo, + agentType, cancelCallback, successCallback, }: { endpointId: string; hostName: string; casesInfo: CasesFromAlertsResponse; + agentType: ResponseActionAgentType; cancelCallback: () => void; successCallback?: () => void; }) => { @@ -42,6 +45,7 @@ export const UnisolateHost = React.memo( endpointId, comment, caseIds, + agentType, }); const confirmHostUnIsolation = useCallback(async () => { diff --git a/x-pack/plugins/security_solution/public/detections/components/host_isolation/unisolate_sentinelone.tsx b/x-pack/plugins/security_solution/public/detections/components/host_isolation/unisolate_sentinelone.tsx deleted file mode 100644 index d58fa83e08abd..0000000000000 --- a/x-pack/plugins/security_solution/public/detections/components/host_isolation/unisolate_sentinelone.tsx +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useMemo, useState, useCallback } from 'react'; -import { EuiSpacer } from '@elastic/eui'; -import { SENTINELONE_CONNECTOR_ID, SUB_ACTION } from '@kbn/stack-connectors-plugin/public/common'; -import { useLoadConnectors } from '../../../common/components/response_actions/use_load_connectors'; -import { useSubActionMutation } from '../../../timelines/components/side_panel/event_details/flyout/use_sub_action_mutation'; -import { RETURN_TO_ALERT_DETAILS } from './translations'; -import { - EndpointUnisolateForm, - ActionCompletionReturnButton, -} from '../../../common/components/endpoint/host_isolation'; - -export const UnisolateSentinelOneHost = React.memo( - ({ - sentinelOneAgentId, - hostName, - cancelCallback, - successCallback, - }: { - sentinelOneAgentId: string; - hostName: string; - cancelCallback: () => void; - successCallback?: () => void; - }) => { - const [isUnIsolated, setIsUnIsolated] = useState(false); - const { data: connectors } = useLoadConnectors({ actionTypeId: SENTINELONE_CONNECTOR_ID }); - const connector = useMemo(() => connectors?.[0], [connectors]); - - const { mutateAsync: unIsolateHost, isLoading } = useSubActionMutation({ - // @ts-expect-error update types - connectorId: connector?.id, - subAction: SUB_ACTION.RELEASE_HOST, - subActionParams: { - uuid: sentinelOneAgentId, - }, - }); - - const confirmHostUnIsolation = useCallback(async () => { - const response = await unIsolateHost(); - - if (response.status === 'ok') { - setIsUnIsolated(true); - - if (successCallback) { - successCallback(); - } - } - }, [successCallback, unIsolateHost]); - - const onChange = useCallback(() => {}, []); - - const backToAlertDetails = useCallback(() => cancelCallback(), [cancelCallback]); - - const hostUnisolatedSuccessButton = useMemo(() => { - return ( - - ); - }, [backToAlertDetails]); - - const hostNotUnisolated = useMemo(() => { - return ( - <> - - - - ); - }, [hostName, backToAlertDetails, confirmHostUnIsolation, onChange, isLoading]); - - return isUnIsolated ? hostUnisolatedSuccessButton : hostNotUnisolated; - } -); - -UnisolateSentinelOneHost.displayName = 'UnisolateSentinelOneHost'; diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.test.ts b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.test.ts index 92801daeba514..c87c69c062720 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.test.ts +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.test.ts @@ -245,11 +245,12 @@ describe('Detections Alerts API', () => { endpointId: 'fd8a122b-4c54-4c05-b295-e5f8381fc59d', comment: 'commento', caseIds: ['88c04a90-b19c-11eb-b838-bf3c7840b969'], + agentType: 'endpoint', }); expect(postMock).toHaveBeenCalledWith( '/api/endpoint/action/isolate', expect.objectContaining({ - body: '{"endpoint_ids":["fd8a122b-4c54-4c05-b295-e5f8381fc59d"],"comment":"commento","case_ids":["88c04a90-b19c-11eb-b838-bf3c7840b969"]}', + body: '{"endpoint_ids":["fd8a122b-4c54-4c05-b295-e5f8381fc59d"],"comment":"commento","case_ids":["88c04a90-b19c-11eb-b838-bf3c7840b969"],"agent_type":"endpoint"}', version: '2023-10-31', }) ); @@ -260,6 +261,7 @@ describe('Detections Alerts API', () => { endpointId: 'fd8a122b-4c54-4c05-b295-e5f8381fc59d', comment: 'commento', caseIds: ['88c04a90-b19c-11eb-b838-bf3c7840b969'], + agentType: 'endpoint', }); expect(hostIsolationResponse).toEqual(mockHostIsolation); }); diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.ts b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.ts index ecd53bbf76a89..e54e4f8e8ef39 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.ts +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.ts @@ -7,6 +7,7 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { getCasesFromAlertsUrl } from '@kbn/cases-plugin/common'; +import type { ResponseActionAgentType } from '../../../../../common/endpoint/service/response_actions/constants'; import type { ResponseActionApiResponse, HostInfo } from '../../../../../common/endpoint/types'; import { DETECTION_ENGINE_QUERY_SIGNALS_URL, @@ -188,15 +189,18 @@ export const createHostIsolation = async ({ endpointId, comment = '', caseIds, + agentType, }: { endpointId: string; comment?: string; caseIds?: string[]; + agentType: ResponseActionAgentType; }): Promise => isolateHost({ endpoint_ids: [endpointId], comment, case_ids: caseIds, + agent_type: agentType, }); /** @@ -212,15 +216,18 @@ export const createHostUnIsolation = async ({ endpointId, comment = '', caseIds, + agentType, }: { endpointId: string; comment?: string; caseIds?: string[]; + agentType: ResponseActionAgentType; }): Promise => unIsolateHost({ endpoint_ids: [endpointId], comment, case_ids: caseIds, + agent_type: agentType, }); /** diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation.tsx b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation.tsx index 64b6d4afb428f..85b2bea5d2695 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation.tsx +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation.tsx @@ -6,6 +6,7 @@ */ import { useCallback, useState } from 'react'; +import type { ResponseActionAgentType } from '../../../../../common/endpoint/service/response_actions/constants'; import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; import { HOST_ISOLATION_FAILURE } from './translations'; import { createHostIsolation } from './api'; @@ -20,12 +21,14 @@ interface UseHostIsolationProps { endpointId: string; comment: string; caseIds?: string[]; + agentType: ResponseActionAgentType; } export const useHostIsolation = ({ endpointId, comment, caseIds, + agentType, }: UseHostIsolationProps): HostIsolationStatus => { const [loading, setLoading] = useState(false); const { addError } = useAppToasts(); @@ -37,6 +40,7 @@ export const useHostIsolation = ({ endpointId, comment, caseIds: caseIds && caseIds.length > 0 ? caseIds : undefined, + agentType, }); setLoading(false); return isolationStatus.action ? true : false; @@ -45,6 +49,6 @@ export const useHostIsolation = ({ addError(error.message, { title: HOST_ISOLATION_FAILURE }); return false; } - }, [endpointId, comment, caseIds, addError]); + }, [endpointId, comment, caseIds, agentType, addError]); return { loading, isolateHost }; }; diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_unisolation.tsx b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_unisolation.tsx index f630ccb13c38c..47c09186f7cba 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_unisolation.tsx +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_unisolation.tsx @@ -6,6 +6,7 @@ */ import { useCallback, useState } from 'react'; +import type { ResponseActionAgentType } from '../../../../../common/endpoint/service/response_actions/constants'; import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; import { HOST_ISOLATION_FAILURE } from './translations'; import { createHostUnIsolation } from './api'; @@ -19,12 +20,14 @@ interface UseHostIsolationProps { endpointId: string; comment: string; caseIds?: string[]; + agentType: ResponseActionAgentType; } export const useHostUnisolation = ({ endpointId, comment, caseIds, + agentType, }: UseHostIsolationProps): HostUnisolationStatus => { const [loading, setLoading] = useState(false); const { addError } = useAppToasts(); @@ -36,6 +39,7 @@ export const useHostUnisolation = ({ endpointId, comment, caseIds: caseIds && caseIds.length > 0 ? caseIds : undefined, + agentType, }); setLoading(false); return isolationStatus.action ? true : false; @@ -44,6 +48,6 @@ export const useHostUnisolation = ({ addError(error.message, { title: HOST_ISOLATION_FAILURE }); return false; } - }, [endpointId, comment, caseIds, addError]); + }, [endpointId, comment, caseIds, agentType, addError]); return { loading, unIsolateHost }; }; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/common.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/common.tsx index 7ee80b8b695c9..f9b62d8801a56 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/common.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/common.tsx @@ -8,6 +8,7 @@ import type { EuiBasicTableColumn } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import React from 'react'; import { i18n } from '@kbn/i18n'; +import { sumBy } from 'lodash/fp'; import type { HostRiskScore, @@ -18,7 +19,7 @@ import type { interface TableItem { category: string; count: number; - score: string; + score: number; } interface EntityData { @@ -38,6 +39,12 @@ export const buildColumns: () => Array> = () => [ truncateText: false, mobileOptions: { show: true }, sortable: true, + footer: ( + + ), }, { field: 'score', @@ -51,6 +58,13 @@ export const buildColumns: () => Array> = () => [ mobileOptions: { show: true }, sortable: true, dataType: 'number', + align: 'right', + render: (score: number) => displayNumber(score), + footer: (props) => ( + + {displayNumber(sumBy((i) => i.score, props.items))} + + ), }, { field: 'count', @@ -64,6 +78,10 @@ export const buildColumns: () => Array> = () => [ mobileOptions: { show: true }, sortable: true, dataType: 'number', + align: 'right', + footer: (props) => ( + {sumBy((i) => i.count, props.items)} + ), }, ]; @@ -73,14 +91,14 @@ export const getItems: (entityData: EntityData | undefined) => TableItem[] = (en category: i18n.translate('xpack.securitySolution.flyout.entityDetails.alertsGroupLabel', { defaultMessage: 'Alerts', }), - score: displayNumber(entityData?.risk.category_1_score ?? 0), + score: entityData?.risk.category_1_score ?? 0, count: entityData?.risk.category_1_count ?? 0, }, { category: i18n.translate('xpack.securitySolution.flyout.entityDetails.contextGroupLabel', { defaultMessage: 'Contexts', }), - score: displayNumber(entityData?.risk.category_2_score ?? 0), + score: entityData?.risk.category_2_score ?? 0, count: entityData?.risk.category_2_count ?? 0, }, ]; @@ -109,4 +127,6 @@ export const getEntityData = ( const displayNumber = (num: number) => num.toFixed(2); export const LENS_VISUALIZATION_HEIGHT = 126; // Static height in pixels specified by design +export const LENS_VISUALIZATION_MIN_WIDTH = 160; // Lens visualization min-width in pixels +export const SUMMARY_TABLE_MIN_WIDTH = 180; // Summary table min-width in pixels export const LAST_30_DAYS = { from: 'now-30d', to: 'now' }; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.test.tsx index 5160b99f850e7..37f5d3c1d47f4 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.test.tsx @@ -44,18 +44,37 @@ describe('RiskSummary', () => { ); expect(getByTestId('risk-summary-table')).toBeInTheDocument(); + + // Alerts expect(getByTestId('risk-summary-table')).toHaveTextContent( `Inputs${mockHostRiskScoreState.data?.[0].host.risk.category_1_count ?? 0}` ); expect(getByTestId('risk-summary-table')).toHaveTextContent( `AlertsScore${mockHostRiskScoreState.data?.[0].host.risk.category_1_score ?? 0}` ); + + // Context expect(getByTestId('risk-summary-table')).toHaveTextContent( `Inputs${mockHostRiskScoreState.data?.[0].host.risk.category_2_count ?? 0}` ); expect(getByTestId('risk-summary-table')).toHaveTextContent( `ContextsScore${mockHostRiskScoreState.data?.[0].host.risk.category_2_score ?? 0}` ); + + // Result + expect(getByTestId('risk-summary-result-count')).toHaveTextContent( + `${ + (mockHostRiskScoreState.data?.[0].host.risk.category_1_count ?? 0) + + (mockHostRiskScoreState.data?.[0].host.risk.category_2_count ?? 0) + }` + ); + + expect(getByTestId('risk-summary-result-score')).toHaveTextContent( + `${ + (mockHostRiskScoreState.data?.[0].host.risk.category_1_score ?? 0) + + (mockHostRiskScoreState.data?.[0].host.risk.category_2_score ?? 0) + }` + ); }); it('renders risk summary table when riskScoreData is empty', () => { diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx index 1e0300d3ae917..36abf4b6e581f 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx @@ -42,6 +42,8 @@ import { isUserRiskData, LAST_30_DAYS, LENS_VISUALIZATION_HEIGHT, + LENS_VISUALIZATION_MIN_WIDTH, + SUMMARY_TABLE_MIN_WIDTH, } from './common'; export interface RiskSummaryProps { @@ -184,12 +186,14 @@ const RiskSummaryComponent = ({ expandable: false, }} > - - + +
{riskData && ( @@ -212,7 +216,12 @@ const RiskSummaryComponent = ({ )}
- +
= ({ field, value, isObjectArray, children }) => { + const { dataFormattedForFieldBrowser, scopeId, isPreview } = useLeftPanelContext(); + const { isAlert } = useBasicDataFromDetailsData(dataFormattedForFieldBrowser); + + const triggerId = isAlert + ? SecurityCellActionsTrigger.DETAILS_FLYOUT + : SecurityCellActionsTrigger.DEFAULT; + + const data = useMemo(() => ({ field, value }), [field, value]); + const metadata = useMemo(() => ({ scopeId, isObjectArray }), [scopeId, isObjectArray]); + const disabledActionTypes = useMemo( + () => (isPreview ? [SecurityCellActionType.FILTER, SecurityCellActionType.TOGGLE_COLUMN] : []), + [isPreview] + ); + + return ( + + {children} + + ); +}; + +CellActions.displayName = 'CellActions'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.test.tsx index 2c1a6c27a52d3..aad62c152773a 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.test.tsx @@ -67,7 +67,7 @@ describe('CorrelationsDetails', () => { it('renders all sections', () => { jest .mocked(useShowRelatedAlertsByAncestry) - .mockReturnValue({ show: true, indices: ['index1'] }); + .mockReturnValue({ show: true, documentId: 'event-id', indices: ['index1'] }); jest .mocked(useShowRelatedAlertsBySameSourceEvent) .mockReturnValue({ show: true, originalEventId: 'originalEventId' }); @@ -115,7 +115,7 @@ describe('CorrelationsDetails', () => { it('should render no section and show error message if show values are false', () => { jest .mocked(useShowRelatedAlertsByAncestry) - .mockReturnValue({ show: false, indices: ['index1'] }); + .mockReturnValue({ show: false, documentId: 'event-id', indices: ['index1'] }); jest .mocked(useShowRelatedAlertsBySameSourceEvent) .mockReturnValue({ show: false, originalEventId: 'originalEventId' }); @@ -144,7 +144,9 @@ describe('CorrelationsDetails', () => { }); it('should render no section if values are null', () => { - jest.mocked(useShowRelatedAlertsByAncestry).mockReturnValue({ show: true }); + jest + .mocked(useShowRelatedAlertsByAncestry) + .mockReturnValue({ show: true, documentId: 'event-id' }); jest.mocked(useShowRelatedAlertsBySameSourceEvent).mockReturnValue({ show: true }); jest.mocked(useShowRelatedAlertsBySession).mockReturnValue({ show: true }); jest.mocked(useShowRelatedCases).mockReturnValue(false); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.tsx index 739a17b7699a8..9d6eb29c3b57f 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.tsx @@ -27,13 +27,25 @@ export const CORRELATIONS_TAB_ID = 'correlations-details'; * Correlations displayed in the document details expandable flyout left section under the Insights tab */ export const CorrelationsDetails: React.FC = () => { - const { dataAsNestedObject, dataFormattedForFieldBrowser, eventId, getFieldsData, scopeId } = - useLeftPanelContext(); + const { + dataAsNestedObject, + dataFormattedForFieldBrowser, + eventId, + getFieldsData, + scopeId, + isPreview, + } = useLeftPanelContext(); - const { show: showAlertsByAncestry, indices } = useShowRelatedAlertsByAncestry({ + const { + show: showAlertsByAncestry, + indices, + documentId, + } = useShowRelatedAlertsByAncestry({ getFieldsData, dataAsNestedObject, dataFormattedForFieldBrowser, + eventId, + isPreview, }); const { show: showSameSourceAlerts, originalEventId } = useShowRelatedAlertsBySameSourceEvent({ getFieldsData, @@ -82,9 +94,13 @@ export const CorrelationsDetails: React.FC = () => { )} - {showAlertsByAncestry && indices && ( + {showAlertsByAncestry && documentId && indices && ( - + )} diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx index e8dfa71d0b4c2..bc3105bedaba5 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx @@ -8,6 +8,7 @@ import React from 'react'; import { render } from '@testing-library/react'; import type { Anomalies } from '../../../../common/components/ml/types'; +import { LeftPanelContext } from '../context'; import { TestProviders } from '../../../../common/mock'; import { HostDetails } from './host_details'; import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml_capabilities'; @@ -22,6 +23,7 @@ import { } from './test_ids'; import { EXPANDABLE_PANEL_CONTENT_TEST_ID } from '../../../shared/components/test_ids'; import { useRiskScore } from '../../../../entity_analytics/api/hooks/use_risk_score'; +import { mockContextValue } from '../mocks/mock_context'; jest.mock('react-router-dom', () => { const actual = jest.requireActual('react-router-dom'); @@ -122,10 +124,12 @@ const mockRelatedUsersResponse = { loading: false, }; -const renderHostDetails = () => +const renderHostDetails = (contextValue: LeftPanelContext) => render( - + + + ); @@ -139,13 +143,13 @@ describe('', () => { }); it('should render host details correctly', () => { - const { getByTestId } = renderHostDetails(); + const { getByTestId } = renderHostDetails(mockContextValue); expect(getByTestId(EXPANDABLE_PANEL_CONTENT_TEST_ID(HOST_DETAILS_TEST_ID))).toBeInTheDocument(); }); describe('Host overview', () => { it('should render the HostOverview with correct dates and indices', () => { - const { getByTestId } = renderHostDetails(); + const { getByTestId } = renderHostDetails(mockContextValue); expect(mockUseHostDetails).toBeCalledWith({ id: 'entities-hosts-details-uuid', startDate: from, @@ -164,20 +168,20 @@ describe('', () => { }); mockUseRiskScore.mockReturnValue({ data: [], isAuthorized: true }); - const { getByText } = renderHostDetails(); + const { getByText } = renderHostDetails(mockContextValue); expect(getByText('Host risk score')).toBeInTheDocument(); }); it('should not render host risk score when unauthorized', () => { mockUseRiskScore.mockReturnValue({ data: [], isAuthorized: false }); - const { queryByText } = renderHostDetails(); + const { queryByText } = renderHostDetails(mockContextValue); expect(queryByText('Host risk score')).not.toBeInTheDocument(); }); }); describe('Related users', () => { it('should render the related user table with correct dates and indices', () => { - const { getByTestId } = renderHostDetails(); + const { getByTestId } = renderHostDetails(mockContextValue); expect(mockUseHostsRelatedUsers).toBeCalledWith({ from: timestamp, hostName: 'test host', @@ -194,7 +198,7 @@ describe('', () => { }); mockUseHasSecurityCapability.mockReturnValue(true); - const { queryAllByRole } = renderHostDetails(); + const { queryAllByRole } = renderHostDetails(mockContextValue); expect(queryAllByRole('columnheader').length).toBe(3); expect(queryAllByRole('row')[1].textContent).toContain('test user'); expect(queryAllByRole('row')[1].textContent).toContain('100.XXX.XXX'); @@ -208,12 +212,12 @@ describe('', () => { }); mockUseHasSecurityCapability.mockReturnValue(false); - const { queryAllByRole } = renderHostDetails(); + const { queryAllByRole } = renderHostDetails(mockContextValue); expect(queryAllByRole('columnheader').length).toBe(2); }); it('should not render host risk score column when license is not valid', () => { - const { queryAllByRole } = renderHostDetails(); + const { queryAllByRole } = renderHostDetails(mockContextValue); expect(queryAllByRole('columnheader').length).toBe(2); }); @@ -224,7 +228,7 @@ describe('', () => { loading: false, }); - const { getByTestId } = renderHostDetails(); + const { getByTestId } = renderHostDetails(mockContextValue); expect(getByTestId(HOST_DETAILS_RELATED_USERS_TABLE_TEST_ID).textContent).toContain( 'No users identified' ); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx index 711eb2a6500f1..bcae491eb2229 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx @@ -21,7 +21,6 @@ import { } from '@elastic/eui'; import type { EuiBasicTableColumn } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { getSourcererScopeId } from '../../../../helpers'; import { ExpandablePanel } from '../../../shared/components/expandable_panel'; import type { RelatedUser } from '../../../../../common/search_strategy/security_solution/related_entities/related_users'; import type { RiskSeverity } from '../../../../../common/search_strategy'; @@ -33,11 +32,7 @@ import { RiskScoreEntity } from '../../../../../common/search_strategy'; import { RiskScoreLevel } from '../../../../entity_analytics/components/severity/common'; import { DefaultFieldRenderer } from '../../../../timelines/components/field_renderers/field_renderers'; import { InputsModelId } from '../../../../common/store/inputs/constants'; -import { - SecurityCellActions, - CellActionsMode, - SecurityCellActionsTrigger, -} from '../../../../common/components/cell_actions'; +import { CellActions } from './cell_actions'; import { useGlobalTime } from '../../../../common/containers/use_global_time'; import { useSourcererDataView } from '../../../../common/containers/sourcerer'; import { manageQuery } from '../../../../common/components/page/manage_query'; @@ -135,20 +130,9 @@ export const HostDetails: React.FC = ({ hostName, timestamp, s ), render: (user: string) => ( - + {user} - + ), }, @@ -190,7 +174,7 @@ export const HostDetails: React.FC = ({ hostName, timestamp, s ] : []), ], - [isEntityAnalyticsAuthorized, scopeId] + [isEntityAnalyticsAuthorized] ); const relatedUsersCount = useMemo( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx index 77e42400001f3..03102e00f753b 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx @@ -9,6 +9,7 @@ import React from 'react'; import { render } from '@testing-library/react'; import type { Anomalies } from '../../../../common/components/ml/types'; import { TestProviders } from '../../../../common/mock'; +import { LeftPanelContext } from '../context'; import { UserDetails } from './user_details'; import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml_capabilities'; import { mockAnomalies } from '../../../../common/components/ml/mock'; @@ -22,6 +23,7 @@ import { } from './test_ids'; import { EXPANDABLE_PANEL_CONTENT_TEST_ID } from '../../../shared/components/test_ids'; import { useRiskScore } from '../../../../entity_analytics/api/hooks/use_risk_score'; +import { mockContextValue } from '../mocks/mock_context'; jest.mock('react-router-dom', () => { const actual = jest.requireActual('react-router-dom'); @@ -119,10 +121,12 @@ const mockRelatedHostsResponse = { loading: false, }; -const renderUserDetails = () => +const renderUserDetails = (contextValue: LeftPanelContext) => render( - + + + ); @@ -136,13 +140,13 @@ describe('', () => { }); it('should render host details correctly', () => { - const { getByTestId } = renderUserDetails(); + const { getByTestId } = renderUserDetails(mockContextValue); expect(getByTestId(EXPANDABLE_PANEL_CONTENT_TEST_ID(USER_DETAILS_TEST_ID))).toBeInTheDocument(); }); describe('Host overview', () => { it('should render the HostOverview with correct dates and indices', () => { - const { getByTestId } = renderUserDetails(); + const { getByTestId } = renderUserDetails(mockContextValue); expect(mockUseObservedUserDetails).toBeCalledWith({ id: 'entities-users-details-uuid', startDate: from, @@ -159,20 +163,20 @@ describe('', () => { isPlatinumOrTrialLicense: true, capabilities: {}, }); - const { getByText } = renderUserDetails(); + const { getByText } = renderUserDetails(mockContextValue); expect(getByText('User risk score')).toBeInTheDocument(); }); it('should not render user risk score when license is not valid', () => { mockUseRiskScore.mockReturnValue({ data: [], isAuthorized: false }); - const { queryByText } = renderUserDetails(); + const { queryByText } = renderUserDetails(mockContextValue); expect(queryByText('User risk score')).not.toBeInTheDocument(); }); }); describe('Related hosts', () => { it('should render the related host table with correct dates and indices', () => { - const { getByTestId } = renderUserDetails(); + const { getByTestId } = renderUserDetails(mockContextValue); expect(mockUseUsersRelatedHosts).toBeCalledWith({ from: timestamp, userName: 'test user', @@ -187,7 +191,7 @@ describe('', () => { isPlatinumOrTrialLicense: true, capabilities: {}, }); - const { queryAllByRole } = renderUserDetails(); + const { queryAllByRole } = renderUserDetails(mockContextValue); expect(queryAllByRole('columnheader').length).toBe(3); expect(queryAllByRole('row')[1].textContent).toContain('test host'); expect(queryAllByRole('row')[1].textContent).toContain('100.XXX.XXX'); @@ -195,7 +199,7 @@ describe('', () => { }); it('should not render host risk score column when license is not valid', () => { - const { queryAllByRole } = renderUserDetails(); + const { queryAllByRole } = renderUserDetails(mockContextValue); expect(queryAllByRole('columnheader').length).toBe(2); }); @@ -206,7 +210,7 @@ describe('', () => { loading: false, }); - const { getByTestId } = renderUserDetails(); + const { getByTestId } = renderUserDetails(mockContextValue); expect(getByTestId(USER_DETAILS_RELATED_HOSTS_TABLE_TEST_ID).textContent).toContain( 'No hosts identified' ); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx index 0aa2624f202ff..08c4606b1fa6d 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx @@ -21,7 +21,6 @@ import { } from '@elastic/eui'; import type { EuiBasicTableColumn } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { getSourcererScopeId } from '../../../../helpers'; import { ExpandablePanel } from '../../../shared/components/expandable_panel'; import type { RelatedHost } from '../../../../../common/search_strategy/security_solution/related_entities/related_hosts'; import type { RiskSeverity } from '../../../../../common/search_strategy'; @@ -32,11 +31,7 @@ import { NetworkDetailsLink } from '../../../../common/components/links'; import { RiskScoreEntity } from '../../../../../common/search_strategy'; import { RiskScoreLevel } from '../../../../entity_analytics/components/severity/common'; import { DefaultFieldRenderer } from '../../../../timelines/components/field_renderers/field_renderers'; -import { - SecurityCellActions, - CellActionsMode, - SecurityCellActionsTrigger, -} from '../../../../common/components/cell_actions'; +import { CellActions } from './cell_actions'; import { InputsModelId } from '../../../../common/store/inputs/constants'; import { useGlobalTime } from '../../../../common/containers/use_global_time'; import { useSourcererDataView } from '../../../../common/containers/sourcerer'; @@ -136,20 +131,9 @@ export const UserDetails: React.FC = ({ userName, timestamp, s ), render: (host: string) => ( - + {host} - + ), }, @@ -191,7 +175,7 @@ export const UserDetails: React.FC = ({ userName, timestamp, s ] : []), ], - [isEntityAnalyticsAuthorized, scopeId] + [isEntityAnalyticsAuthorized] ); const relatedHostsCount = useMemo( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview.test.tsx index eb20cb3e7d495..50b9a5b1643a4 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview.test.tsx @@ -59,6 +59,30 @@ describe('', () => { expect(wrapper.getByTestId(ANALYZER_PREVIEW_TEST_ID)).toBeInTheDocument(); }); + it('should use ancestor id when in preview', () => { + mockUseAlertPrevalenceFromProcessTree.mockReturnValue({ + loading: false, + error: false, + alertIds: ['alertid'], + statsNodes: mock.mockStatsNodes, + }); + const contextValue = { + ...mockContextValue, + getFieldsData: () => 'ancestors-id', + dataFormattedForFieldBrowser: mockDataFormattedForFieldBrowser, + isPreview: true, + }; + + const wrapper = renderAnalyzerPreview(contextValue); + + expect(mockUseAlertPrevalenceFromProcessTree).toHaveBeenCalledWith({ + isActiveTimeline: false, + documentId: 'ancestors-id', + indices: ['rule-indices'], + }); + expect(wrapper.getByTestId(ANALYZER_PREVIEW_TEST_ID)).toBeInTheDocument(); + }); + it('shows error message when index is not present', () => { mockUseAlertPrevalenceFromProcessTree.mockReturnValue({ loading: false, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview.tsx index 0beb237f17cf2..5eeac1d9315a8 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview.tsx @@ -11,11 +11,12 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { ANALYZER_PREVIEW_TEST_ID, ANALYZER_PREVIEW_LOADING_TEST_ID } from './test_ids'; import { getTreeNodes } from '../utils/analyzer_helpers'; -import { RULE_INDICES } from '../../shared/constants/field_names'; +import { ANCESTOR_ID, RULE_INDICES } from '../../shared/constants/field_names'; import { useRightPanelContext } from '../context'; import { useAlertPrevalenceFromProcessTree } from '../../../../common/containers/alerts/use_alert_prevalence_from_process_tree'; import type { StatsNode } from '../../../../common/containers/alerts/use_alert_prevalence_from_process_tree'; import { isActiveTimeline } from '../../../../helpers'; +import { getField } from '../../shared/utils'; const CHILD_COUNT_LIMIT = 3; const ANCESTOR_LEVEL = 3; @@ -33,14 +34,23 @@ interface Cache { */ export const AnalyzerPreview: React.FC = () => { const [cache, setCache] = useState>({}); - const { dataFormattedForFieldBrowser: data, scopeId, eventId } = useRightPanelContext(); + const { + dataFormattedForFieldBrowser: data, + getFieldsData, + scopeId, + eventId, + isPreview, + } = useRightPanelContext(); + const ancestorId = getField(getFieldsData(ANCESTOR_ID)) ?? ''; + + const documentId = isPreview ? ancestorId : eventId; // use ancestor as fallback for alert preview const index = find({ category: 'kibana', field: RULE_INDICES }, data); const indices = index?.values ?? []; const { statsNodes, loading, error } = useAlertPrevalenceFromProcessTree({ isActiveTimeline: isActiveTimeline(scopeId), - documentId: eventId, + documentId, indices, }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/assignees.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/assignees.tsx index 39429c96b0534..e01713576f5ae 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/assignees.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/assignees.tsx @@ -130,7 +130,7 @@ export const Assignees: FC = memo( {isPreview ? ( getEmptyTagValue() ) : ( - <> + {assignedUsers && ( @@ -159,7 +159,7 @@ export const Assignees: FC = memo( onAssigneesApply={onAssigneesApply} /> - + )} ); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/cell_actions.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/cell_actions.tsx new file mode 100644 index 0000000000000..dde0fb83326a6 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/cell_actions.tsx @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { FC } from 'react'; +import React, { useMemo } from 'react'; +import { useRightPanelContext } from '../context'; +import { getSourcererScopeId } from '../../../../helpers'; +import { useBasicDataFromDetailsData } from '../../../../timelines/components/side_panel/event_details/helpers'; +import { SecurityCellActionType } from '../../../../actions/constants'; +import { + CellActionsMode, + SecurityCellActions, + SecurityCellActionsTrigger, +} from '../../../../common/components/cell_actions'; + +interface CellActionsProps { + /** + * Field name + */ + field: string; + /** + * Field value + */ + value: string[] | string | null | undefined; + /** + * Boolean to indicate if value is an object array + */ + isObjectArray?: boolean; + /** + * React components to render + */ + children: React.ReactNode | string; +} + +/** + * Security cell action wrapper for document details flyout + */ +export const CellActions: FC = ({ field, value, isObjectArray, children }) => { + const { dataFormattedForFieldBrowser, scopeId, isPreview } = useRightPanelContext(); + const { isAlert } = useBasicDataFromDetailsData(dataFormattedForFieldBrowser); + + const triggerId = isAlert + ? SecurityCellActionsTrigger.DETAILS_FLYOUT + : SecurityCellActionsTrigger.DEFAULT; + + const data = useMemo(() => ({ field, value }), [field, value]); + const metadata = useMemo(() => ({ scopeId, isObjectArray }), [scopeId, isObjectArray]); + const disabledActionTypes = useMemo( + () => (isPreview ? [SecurityCellActionType.FILTER, SecurityCellActionType.TOGGLE_COLUMN] : []), + [isPreview] + ); + + return ( + + {children} + + ); +}; + +CellActions.displayName = 'CellActions'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.test.tsx index 3a91938ac2f65..531639235bbfb 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.test.tsx @@ -99,7 +99,9 @@ describe('', () => { }); it('should render wrapper component', () => { - jest.mocked(useShowRelatedAlertsByAncestry).mockReturnValue({ show: false }); + jest + .mocked(useShowRelatedAlertsByAncestry) + .mockReturnValue({ show: false, documentId: 'event-id' }); jest.mocked(useShowRelatedAlertsBySameSourceEvent).mockReturnValue({ show: false }); jest.mocked(useShowRelatedAlertsBySession).mockReturnValue({ show: false }); jest.mocked(useShowRelatedCases).mockReturnValue(false); @@ -115,7 +117,7 @@ describe('', () => { it('should show component with all rows in expandable panel', () => { jest .mocked(useShowRelatedAlertsByAncestry) - .mockReturnValue({ show: true, indices: ['index1'] }); + .mockReturnValue({ show: true, documentId: 'event-id', indices: ['index1'] }); jest .mocked(useShowRelatedAlertsBySameSourceEvent) .mockReturnValue({ show: true, originalEventId: 'originalEventId' }); @@ -158,7 +160,7 @@ describe('', () => { it('should hide rows and show error message if show values are false', () => { jest .mocked(useShowRelatedAlertsByAncestry) - .mockReturnValue({ show: false, indices: ['index1'] }); + .mockReturnValue({ show: false, documentId: 'event-id', indices: ['index1'] }); jest .mocked(useShowRelatedAlertsBySameSourceEvent) .mockReturnValue({ show: false, originalEventId: 'originalEventId' }); @@ -178,7 +180,9 @@ describe('', () => { }); it('should hide rows if values are null', () => { - jest.mocked(useShowRelatedAlertsByAncestry).mockReturnValue({ show: true }); + jest + .mocked(useShowRelatedAlertsByAncestry) + .mockReturnValue({ show: true, documentId: 'event-id' }); jest.mocked(useShowRelatedAlertsBySameSourceEvent).mockReturnValue({ show: true }); jest.mocked(useShowRelatedAlertsBySession).mockReturnValue({ show: true }); jest.mocked(useShowRelatedCases).mockReturnValue(false); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.tsx index 0bf8639d71ca8..d70094c0e9467 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.tsx @@ -38,6 +38,7 @@ export const CorrelationsOverview: React.FC = () => { indexName, getFieldsData, scopeId, + isPreview, } = useRightPanelContext(); const { openLeftPanel } = useExpandableFlyoutApi(); @@ -56,10 +57,16 @@ export const CorrelationsOverview: React.FC = () => { }); }, [eventId, openLeftPanel, indexName, scopeId]); - const { show: showAlertsByAncestry, indices } = useShowRelatedAlertsByAncestry({ + const { + show: showAlertsByAncestry, + documentId, + indices, + } = useShowRelatedAlertsByAncestry({ getFieldsData, dataAsNestedObject, dataFormattedForFieldBrowser, + eventId, + isPreview, }); const { show: showSameSourceAlerts, originalEventId } = useShowRelatedAlertsBySameSourceEvent({ getFieldsData, @@ -111,8 +118,8 @@ export const CorrelationsOverview: React.FC = () => { {showAlertsBySession && entityId && ( )} - {showAlertsByAncestry && indices && ( - + {showAlertsByAncestry && documentId && indices && ( + )} ) : ( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/entities_overview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/entities_overview.tsx index f3a3685d26e70..df6f5fbfc93ce 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/entities_overview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/entities_overview.tsx @@ -68,11 +68,13 @@ export const EntitiesOverview: React.FC = () => { {userName || hostName ? ( {userName && ( - - - + <> + + + + + )} - {hostName && ( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields.tsx index 059de0cc1f736..02f7ac73665ad 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields.tsx @@ -10,17 +10,11 @@ import React, { useMemo } from 'react'; import type { EuiBasicTableColumn } from '@elastic/eui'; import { EuiFlexGroup, EuiFlexItem, EuiInMemoryTable, EuiPanel, EuiTitle } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { getSourcererScopeId } from '../../../../helpers'; import { convertHighlightedFieldsToTableRow } from '../../shared/utils/highlighted_fields_helpers'; import { useRuleWithFallback } from '../../../../detection_engine/rule_management/logic/use_rule_with_fallback'; import { useBasicDataFromDetailsData } from '../../../../timelines/components/side_panel/event_details/helpers'; import { HighlightedFieldsCell } from './highlighted_fields_cell'; -import { SecurityCellActionType } from '../../../../actions/constants'; -import { - CellActionsMode, - SecurityCellActions, - SecurityCellActionsTrigger, -} from '../../../../common/components/cell_actions'; +import { CellActions } from './cell_actions'; import { HIGHLIGHTED_FIELDS_DETAILS_TEST_ID, HIGHLIGHTED_FIELDS_TITLE_TEST_ID } from './test_ids'; import { useRightPanelContext } from '../context'; import { useHighlightedFields } from '../../shared/hooks/use_highlighted_fields'; @@ -83,28 +77,13 @@ const columns: Array> = [ scopeId: string; isPreview: boolean; }) => ( - + - + ), }, ]; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx index 9af526a30d42d..d9568de7bf4dc 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx @@ -28,13 +28,14 @@ import { } from '../../../../common/components/first_last_seen/first_last_seen'; import { buildHostNamesFilter, RiskScoreEntity } from '../../../../../common/search_strategy'; import { getEmptyTagValue } from '../../../../common/components/empty_value'; -import { DefaultFieldRenderer } from '../../../../timelines/components/field_renderers/field_renderers'; import { DescriptionListStyled } from '../../../../common/components/page'; import { OverviewDescriptionList } from '../../../../common/components/overview_description_list'; import { RiskScoreLevel } from '../../../../entity_analytics/components/severity/common'; import { useSourcererDataView } from '../../../../common/containers/sourcerer'; import { useGlobalTime } from '../../../../common/containers/use_global_time'; import { useHostDetails } from '../../../../explore/hosts/containers/hosts/details'; +import { getField } from '../../shared/utils'; +import { CellActions } from './cell_actions'; import { FAMILY, LAST_SEEN, @@ -53,7 +54,6 @@ import { LeftPanelInsightsTab, DocumentDetailsLeftPanelKey } from '../../left'; import { RiskScoreDocTooltip } from '../../../../overview/components/common'; const HOST_ICON = 'storage'; -const CONTEXT_ID = `flyout-host-entity-overview`; export interface HostEntityOverviewProps { /** @@ -114,21 +114,24 @@ export const HostEntityOverview: React.FC = ({ hostName endDate: to, }); + const hostOSFamilyValue = useMemo( + () => getField(getOr([], 'host.os.family', hostDetails)), + [hostDetails] + ); const hostOSFamily: DescriptionList[] = useMemo( () => [ { title: FAMILY, - description: ( - + description: hostOSFamilyValue ? ( + + {hostOSFamilyValue} + + ) : ( + getEmptyTagValue() ), }, ], - [hostDetails] + [hostOSFamilyValue] ); const hostLastSeen: DescriptionList[] = useMemo( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/severity.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/severity.tsx index 710875f7aa971..31295b00c7955 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/severity.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/severity.tsx @@ -9,10 +9,7 @@ import type { FC } from 'react'; import React, { memo } from 'react'; import { ALERT_SEVERITY } from '@kbn/rule-data-utils'; import type { Severity } from '@kbn/securitysolution-io-ts-alerting-types'; -import { CellActionsMode } from '@kbn/cell-actions'; -import { getSourcererScopeId } from '../../../../helpers'; -import { SecurityCellActions } from '../../../../common/components/cell_actions'; -import { SecurityCellActionsTrigger } from '../../../../actions/constants'; +import { CellActions } from './cell_actions'; import { useRightPanelContext } from '../context'; import { SeverityBadge } from '../../../../common/components/severity_badge'; @@ -23,7 +20,7 @@ const isSeverity = (x: unknown): x is Severity => * Document details severity displayed in flyout right section header */ export const DocumentSeverity: FC = memo(() => { - const { getFieldsData, scopeId } = useRightPanelContext(); + const { getFieldsData } = useRightPanelContext(); const fieldsData = getFieldsData(ALERT_SEVERITY); if (!fieldsData) { @@ -40,19 +37,9 @@ export const DocumentSeverity: FC = memo(() => { } return ( - + - + ); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/status.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/status.tsx index 553dfd5834a0e..a97e009e11556 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/status.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/status.tsx @@ -10,10 +10,7 @@ import React, { useMemo } from 'react'; import { find } from 'lodash/fp'; import { FormattedMessage } from '@kbn/i18n-react'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; -import { CellActionsMode } from '@kbn/cell-actions'; import { EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui'; -import { getSourcererScopeId } from '../../../../helpers'; -import { SecurityCellActions } from '../../../../common/components/cell_actions'; import { getEmptyTagValue } from '../../../../common/components/empty_value'; import type { EnrichedFieldInfo, @@ -23,7 +20,7 @@ import { SIGNAL_STATUS_FIELD_NAME } from '../../../../timelines/components/timel import { StatusPopoverButton } from '../../../../common/components/event_details/overview/status_popover_button'; import { useRightPanelContext } from '../context'; import { getEnrichedFieldInfo } from '../../../../common/components/event_details/helpers'; -import { SecurityCellActionsTrigger } from '../../../../actions/constants'; +import { CellActions } from './cell_actions'; import { STATUS_TITLE_TEST_ID } from './test_ids'; /** @@ -74,17 +71,7 @@ export const DocumentStatus: FC = () => { {!statusData || !hasData(statusData) || isPreview ? ( getEmptyTagValue() ) : ( - + { scopeId={scopeId} handleOnEventClosed={closeFlyout} /> - + )} diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx index d420992f36949..5293536f54011 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx @@ -23,13 +23,14 @@ import { LeftPanelInsightsTab, DocumentDetailsLeftPanelKey } from '../../left'; import { ENTITIES_TAB_ID } from '../../left/components/entities_details'; import { useRightPanelContext } from '../context'; import type { DescriptionList } from '../../../../../common/utility_types'; +import { getField } from '../../shared/utils'; +import { CellActions } from './cell_actions'; import { FirstLastSeen, FirstLastSeenType, } from '../../../../common/components/first_last_seen/first_last_seen'; import { buildUserNamesFilter, RiskScoreEntity } from '../../../../../common/search_strategy'; import { getEmptyTagValue } from '../../../../common/components/empty_value'; -import { DefaultFieldRenderer } from '../../../../timelines/components/field_renderers/field_renderers'; import { DescriptionListStyled } from '../../../../common/components/page'; import { OverviewDescriptionList } from '../../../../common/components/overview_description_list'; import { RiskScoreLevel } from '../../../../entity_analytics/components/severity/common'; @@ -54,7 +55,6 @@ import { useObservedUserDetails } from '../../../../explore/users/containers/use import { RiskScoreDocTooltip } from '../../../../overview/components/common'; const USER_ICON = 'user'; -const CONTEXT_ID = `flyout-user-entity-overview`; export interface UserEntityOverviewProps { /** @@ -113,21 +113,24 @@ export const UserEntityOverview: React.FC = ({ userName timerange, }); + const userDomainValue = useMemo( + () => getField(getOr([], 'user.domain', userDetails)), + [userDetails] + ); const userDomain: DescriptionList[] = useMemo( () => [ { title: USER_DOMAIN, - description: ( - + description: userDomainValue ? ( + + {userDomainValue} + + ) : ( + getEmptyTagValue() ), }, ], - [userDetails] + [userDomainValue] ); const userLastSeen: DescriptionList[] = useMemo( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/table_tab.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/table_tab.tsx index c0083d8f80b2d..cf2b0e98853c9 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/table_tab.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/table_tab.tsx @@ -14,12 +14,7 @@ import type { EventFieldsData } from '../../../../common/components/event_detail import { FieldValueCell } from '../../../../common/components/event_details/table/field_value_cell'; import type { BrowserField, BrowserFields } from '../../../../../common/search_strategy'; import { FieldNameCell } from '../../../../common/components/event_details/table/field_name_cell'; -import { - CellActionsMode, - SecurityCellActions, - SecurityCellActionsTrigger, -} from '../../../../common/components/cell_actions'; -import { getSourcererScopeId } from '../../../../helpers'; +import { CellActions } from '../components/cell_actions'; import * as i18n from '../../../../common/components/event_details/translations'; import { useRightPanelContext } from '../context'; import type { ColumnsProvider } from '../../../../common/components/event_details/event_fields_browser'; @@ -68,17 +63,7 @@ export const getColumns: ColumnsProvider = ({ browserFields ); return ( - + - + ); }, }, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.test.tsx index 8b70fcebdefb7..e0a8f2ddb7ba0 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.test.tsx @@ -34,7 +34,7 @@ jest.mock( '../../../../detections/components/alerts_table/timeline_actions/investigate_in_resolver' ); const licenseServiceMock = licenseService as jest.Mocked; - +const eventId = 'event-id'; const dataAsNestedObject = mockDataAsNestedObject; const dataFormattedForFieldBrowser = mockDataFormattedForFieldBrowser; @@ -54,10 +54,16 @@ describe('useShowRelatedAlertsByAncestry', () => { getFieldsData, dataAsNestedObject, dataFormattedForFieldBrowser, + eventId, + isPreview: false, }) ); - expect(hookResult.result.current).toEqual({ show: false, indices: ['rule-parameters-index'] }); + expect(hookResult.result.current).toEqual({ + show: false, + documentId: 'event-id', + indices: ['rule-parameters-index'], + }); }); it(`should return false if feature isn't enabled`, () => { @@ -69,11 +75,14 @@ describe('useShowRelatedAlertsByAncestry', () => { getFieldsData, dataAsNestedObject, dataFormattedForFieldBrowser, + eventId, + isPreview: false, }) ); expect(hookResult.result.current).toEqual({ show: false, + documentId: 'event-id', indices: ['rule-parameters-index'], }); }); @@ -87,11 +96,58 @@ describe('useShowRelatedAlertsByAncestry', () => { getFieldsData, dataAsNestedObject, dataFormattedForFieldBrowser, + eventId, + isPreview: false, }) ); expect(hookResult.result.current).toEqual({ show: false, + documentId: 'event-id', + indices: ['rule-parameters-index'], + }); + }); + + it('should return true and event id as document id by default ', () => { + (useIsExperimentalFeatureEnabled as jest.Mock).mockReturnValue(true); + (useIsInvestigateInResolverActionEnabled as jest.Mock).mockReturnValue(true); + licenseServiceMock.isPlatinumPlus.mockReturnValue(true); + const getFieldsData = () => 'ancestors-id'; + hookResult = renderHook(() => + useShowRelatedAlertsByAncestry({ + getFieldsData, + dataAsNestedObject, + dataFormattedForFieldBrowser, + eventId, + isPreview: false, + }) + ); + + expect(hookResult.result.current).toEqual({ + show: true, + documentId: 'event-id', + indices: ['rule-parameters-index'], + }); + }); + + it('should return true and ancestor id as document id if flyout is open in preview', () => { + (useIsExperimentalFeatureEnabled as jest.Mock).mockReturnValue(true); + (useIsInvestigateInResolverActionEnabled as jest.Mock).mockReturnValue(true); + licenseServiceMock.isPlatinumPlus.mockReturnValue(true); + const getFieldsData = () => 'ancestors-id'; + hookResult = renderHook(() => + useShowRelatedAlertsByAncestry({ + getFieldsData, + dataAsNestedObject, + dataFormattedForFieldBrowser, + eventId, + isPreview: true, + }) + ); + + expect(hookResult.result.current).toEqual({ + show: true, + documentId: 'ancestors-id', indices: ['rule-parameters-index'], }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.ts b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.ts index f1627b749bfe1..5a3f9c4f0b657 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.ts @@ -13,7 +13,8 @@ import type { GetFieldsData } from '../../../../common/hooks/use_get_fields_data import { useIsInvestigateInResolverActionEnabled } from '../../../../detections/components/alerts_table/timeline_actions/investigate_in_resolver'; import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { useLicense } from '../../../../common/hooks/use_license'; -import { RULE_PARAMETERS_INDEX } from '../constants/field_names'; +import { ANCESTOR_ID, RULE_PARAMETERS_INDEX } from '../constants/field_names'; +import { getField } from '../utils'; export interface UseShowRelatedAlertsByAncestryParams { /** @@ -28,6 +29,14 @@ export interface UseShowRelatedAlertsByAncestryParams { * An array of field objects with category and value */ dataFormattedForFieldBrowser: TimelineEventsDetailsItem[]; + /** + * Id of the event document + */ + eventId: string; + /** + * Boolean indicating if the flyout is open in preview + */ + isPreview: boolean; } export interface UseShowRelatedAlertsByAncestryResult { @@ -39,6 +48,10 @@ export interface UseShowRelatedAlertsByAncestryResult { * Values of the kibana.alert.rule.parameters.index field */ indices?: string[]; + /** + * Value of the document id for fetching ancestry alerts + */ + documentId: string; } /** @@ -48,12 +61,16 @@ export const useShowRelatedAlertsByAncestry = ({ getFieldsData, dataAsNestedObject, dataFormattedForFieldBrowser, + eventId, + isPreview, }: UseShowRelatedAlertsByAncestryParams): UseShowRelatedAlertsByAncestryResult => { const isRelatedAlertsByProcessAncestryEnabled = useIsExperimentalFeatureEnabled( 'insightsRelatedAlertsByProcessAncestry' ); const hasProcessEntityInfo = useIsInvestigateInResolverActionEnabled(dataAsNestedObject); + const ancestorId = getField(getFieldsData(ANCESTOR_ID)) ?? ''; + const documentId = isPreview ? ancestorId : eventId; // can't use getFieldsData here as the kibana.alert.rule.parameters is different and can be nested const originalDocumentIndex = useMemo( () => find({ category: 'kibana', field: RULE_PARAMETERS_INDEX }, dataFormattedForFieldBrowser), @@ -70,6 +87,7 @@ export const useShowRelatedAlertsByAncestry = ({ return { show, + documentId, ...(originalDocumentIndex && originalDocumentIndex.values && { indices: originalDocumentIndex.values }), }; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.test.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.test.tsx new file mode 100644 index 0000000000000..32d4b2f6c2f86 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.test.tsx @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { TestProviders } from '../../../common/mock'; +import { render } from '@testing-library/react'; +import React from 'react'; +import { UserDetailsPanel } from '.'; +import { EntityDetailsLeftPanelTab } from '../shared/components/left_panel/left_panel_header'; + +describe('LeftPanel', () => { + it('renders', () => { + const { queryByText } = render( + , + { + wrapper: TestProviders, + } + ); + + const tabElement = queryByText('Risk Inputs'); + + expect(tabElement).toBeInTheDocument(); + }); + + it('does not render the tab if tab is not found', () => { + const { queryByText } = render( + , + { + wrapper: TestProviders, + } + ); + + const tabElement = queryByText('Risk Inputs'); + + expect(tabElement).not.toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.tsx index 7cab4350e667c..3a682ba125864 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.tsx @@ -41,6 +41,10 @@ export const UserDetailsPanel = ({ isRiskScoreExist, user, path }: UserDetailsPa if (managedUser.isLoading) return ; + if (!selectedTabId) { + return null; + } + return ( <> { - const defaultTab = tabs[0].id; + const defaultTab = tabs.length > 0 ? tabs[0].id : undefined; if (!path) return defaultTab; return tabs.find((tab) => tab.id === path.tab)?.id ?? defaultTab; diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks/use_managed_user.test.ts b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks/use_managed_user.test.ts index 1e40f66b70242..5a26600948267 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks/use_managed_user.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks/use_managed_user.test.ts @@ -38,18 +38,28 @@ jest.mock('../../../../../common/hooks/use_space_id', () => ({ useSpaceId: () => 'test-space-id', })); +const mockUseIsExperimentalFeatureEnabled = jest.fn().mockReturnValue(true); + +jest.mock('../../../../../common/hooks/use_experimental_features', () => ({ + useIsExperimentalFeatureEnabled: () => mockUseIsExperimentalFeatureEnabled(), +})); + const mockSearch = jest.fn().mockReturnValue({ data: [], }); +const useSearchStrategyDefaultResponse = { + loading: false, + result: { users: [] }, + search: (...params: unknown[]) => mockSearch(...params), + refetch: () => {}, + inspect: {}, +}; + +const mockUseSearchStrategy = jest.fn().mockReturnValue(useSearchStrategyDefaultResponse); + jest.mock('../../../../../common/containers/use_search_strategy', () => ({ - useSearchStrategy: () => ({ - loading: false, - result: { users: [] }, - search: (...params: unknown[]) => mockSearch(...params), - refetch: () => {}, - inspect: {}, - }), + useSearchStrategy: () => mockUseSearchStrategy(), })); describe('useManagedUser', () => { @@ -108,4 +118,28 @@ describe('useManagedUser', () => { }) ); }); + + it('should not search if the feature is disabled', () => { + mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); + renderHook(() => useManagedUser('test-userName', undefined, false), { + wrapper: TestProviders, + }); + + expect(mockSearch).not.toHaveBeenCalled(); + }); + + it('should return loading false when the feature is disabled', () => { + mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); + mockUseInstalledIntegrations.mockReturnValue({ + data: [], + isLoading: true, + }); + mockUseSearchStrategy.mockReturnValue({ ...useSearchStrategyDefaultResponse, loading: true }); + + const { result } = renderHook(() => useManagedUser('test-userName', undefined, false), { + wrapper: TestProviders, + }); + + expect(result.current.isLoading).toBeFalsy(); + }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks/use_managed_user.ts b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks/use_managed_user.ts index 6eb7e385ea0b1..2b98529163895 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks/use_managed_user.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks/use_managed_user.ts @@ -37,7 +37,7 @@ export const useManagedUser = ( email: string[] | undefined, isLoading?: boolean ): ManagedUserData => { - const skip = useIsExperimentalFeatureEnabled('newUserDetailsFlyoutManagedUser'); + const skip = !useIsExperimentalFeatureEnabled('newUserDetailsFlyoutManagedUser'); const { to, from, isInitializing, deleteQuery, setQuery } = useGlobalTime(); const spaceId = useSpaceId(); const { @@ -95,9 +95,9 @@ export const useManagedUser = ( return useMemo( () => ({ data: managedUserData, - isLoading: loadingManagedUser || loadingIntegrations, + isLoading: skip ? false : loadingManagedUser || loadingIntegrations, isIntegrationEnabled, }), - [isIntegrationEnabled, loadingIntegrations, loadingManagedUser, managedUserData] + [isIntegrationEnabled, loadingIntegrations, loadingManagedUser, managedUserData, skip] ); }; diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user_accordion.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user_accordion.tsx index ad8b089adc168..6de3c45fc5786 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user_accordion.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user_accordion.tsx @@ -38,6 +38,7 @@ export const ManagedUserAccordion: React.FC = ({ return ( - .c0 { + .c14 svg { + position: relative; + top: -1px; +} + +.c0 { display: inline-block; font-size: 12px; line-height: 1.5; @@ -16,11 +21,6 @@ exports[`netflowRowRenderer renders correctly against snapshot 1`] = ` border-radius: 4px; } -.c14 svg { - position: relative; - top: -1px; -} - .c12, .c12 * { display: inline-block; diff --git a/x-pack/plugins/security_solution/public/timelines/store/epic.ts b/x-pack/plugins/security_solution/public/timelines/store/epic.ts deleted file mode 100644 index d3c14c3a1e2c5..0000000000000 --- a/x-pack/plugins/security_solution/public/timelines/store/epic.ts +++ /dev/null @@ -1,422 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { get, getOr, has, set, omit, isObject, toString as fpToString } from 'lodash/fp'; -import type { Action } from 'redux'; -import type { Epic } from 'redux-observable'; -import { from, EMPTY, merge } from 'rxjs'; -import type { Filter, MatchAllFilter } from '@kbn/es-query'; -import { - isScriptedRangeFilter, - isExistsFilter, - isRangeFilter, - isMatchAllFilter, - isPhraseFilter, - isQueryStringFilter, - isPhrasesFilter, -} from '@kbn/es-query'; -import { - filter, - map, - startWith, - withLatestFrom, - mergeMap, - concatMap, - takeUntil, -} from 'rxjs/operators'; - -import type { TimelineErrorResponse, TimelineResponse } from '../../../common/api/timeline'; -import type { ColumnHeaderOptions } from '../../../common/types/timeline'; -import { TimelineStatus, TimelineType } from '../../../common/api/timeline'; -import type { inputsModel } from '../../common/store/inputs'; -import { addError } from '../../common/store/app/actions'; - -import { copyTimeline, persistTimeline } from '../containers/api'; -import { ALL_TIMELINE_QUERY_ID } from '../containers/all'; -import * as i18n from '../pages/translations'; - -import { - updateTimeline, - startTimelineSaving, - endTimelineSaving, - createTimeline, - showCallOutUnauthorizedMsg, - addTimeline, - saveTimeline, - setChanged, -} from './actions'; -import type { TimelineModel } from './model'; -import { epicPersistNote, isNoteAction } from './epic_note'; -import { epicPersistPinnedEvent, isPinnedEventAction } from './epic_pinned_event'; -import { epicPersistTimelineFavorite, isFavoriteTimelineAction } from './epic_favorite'; -import { isNotNull } from './helpers'; -import { dispatcherTimelinePersistQueue } from './epic_dispatcher_timeline_persistence_queue'; -import { myEpicTimelineId } from './my_epic_timeline_id'; -import type { TimelineEpicDependencies } from './types'; -import type { TimelineInput } from '../../../common/search_strategy'; - -const isItAtimelineAction = (timelineId: string | undefined) => - timelineId && timelineId.toLowerCase().startsWith('timeline'); - -export const createTimelineEpic = - (): Epic> => - ( - action$, - state$, - { - selectAllTimelineQuery, - selectNotesByIdSelector, - timelineByIdSelector, - timelineTimeRangeSelector, - kibana$, - } - ) => { - const timeline$ = state$.pipe(map(timelineByIdSelector), filter(isNotNull)); - - const allTimelineQuery$ = state$.pipe( - map((state) => { - const getQuery = selectAllTimelineQuery(); - return getQuery(state, ALL_TIMELINE_QUERY_ID); - }), - filter(isNotNull) - ); - - const notes$ = state$.pipe(map(selectNotesByIdSelector), filter(isNotNull)); - - const timelineTimeRange$ = state$.pipe(map(timelineTimeRangeSelector), filter(isNotNull)); - - return merge( - action$.pipe( - withLatestFrom(timeline$), - filter(([action, timeline]) => { - const timelineId: string = get('payload.id', action); - const timelineObj: TimelineModel = timeline[timelineId]; - if (action.type === addError.type) { - return true; - } - if ( - isItAtimelineAction(timelineId) && - timelineObj != null && - timelineObj.status != null && - TimelineStatus.immutable === timelineObj.status - ) { - return false; - } else if (action.type === createTimeline.type && isItAtimelineAction(timelineId)) { - myEpicTimelineId.setTimelineVersion(null); - myEpicTimelineId.setTimelineId(null); - myEpicTimelineId.setTemplateTimelineId(null); - myEpicTimelineId.setTemplateTimelineVersion(null); - } else if (action.type === addTimeline.type && isItAtimelineAction(timelineId)) { - const addNewTimeline: TimelineModel = get('payload.timeline', action); - myEpicTimelineId.setTimelineId(addNewTimeline.savedObjectId); - myEpicTimelineId.setTimelineVersion(addNewTimeline.version); - myEpicTimelineId.setTemplateTimelineId(addNewTimeline.templateTimelineId); - myEpicTimelineId.setTemplateTimelineVersion(addNewTimeline.templateTimelineVersion); - return getOr(false, 'payload.savedTimeline', action); - } else if ( - action.type === saveTimeline.type && - !timelineObj.isSaving && - isItAtimelineAction(timelineId) - ) { - return true; - } - }), - mergeMap(([action]) => { - dispatcherTimelinePersistQueue.next({ action }); - return EMPTY; - }) - ), - dispatcherTimelinePersistQueue.pipe( - withLatestFrom(timeline$, notes$, timelineTimeRange$), - concatMap(([objAction, timeline, notes, timelineTimeRange]) => { - const action: Action = get('action', objAction); - const timelineId = myEpicTimelineId.getTimelineId(); - const version = myEpicTimelineId.getTimelineVersion(); - const templateTimelineId = myEpicTimelineId.getTemplateTimelineId(); - const templateTimelineVersion = myEpicTimelineId.getTemplateTimelineVersion(); - - if (isNoteAction(action)) { - return epicPersistNote(action, notes, action$, timeline$, notes$, allTimelineQuery$); - } else if (isPinnedEventAction(action)) { - return epicPersistPinnedEvent(action, timeline, action$, timeline$, allTimelineQuery$); - } else if (isFavoriteTimelineAction(action)) { - return epicPersistTimelineFavorite( - action, - timeline, - action$, - timeline$, - allTimelineQuery$ - ); - } else if (isSaveTimelineAction(action)) { - const saveAction = action as unknown as ReturnType; - const savedSearch = timeline[action.payload.id].savedSearch; - return from( - saveAction.payload.saveAsNew && timelineId - ? copyTimeline({ - timelineId, - timeline: { - ...convertTimelineAsInput(timeline[action.payload.id], timelineTimeRange), - templateTimelineId, - templateTimelineVersion, - }, - savedSearch, - }) - : persistTimeline({ - timelineId, - version, - timeline: { - ...convertTimelineAsInput(timeline[action.payload.id], timelineTimeRange), - templateTimelineId, - templateTimelineVersion, - }, - savedSearch, - }) - ).pipe( - withLatestFrom(timeline$, allTimelineQuery$, kibana$), - mergeMap(([response, recentTimeline, allTimelineQuery, kibana]) => { - if (isTimelineErrorResponse(response)) { - const error = getErrorFromResponse(response); - switch (error?.errorCode) { - // conflict - case 409: - kibana.notifications.toasts.addDanger({ - title: i18n.TIMELINE_VERSION_CONFLICT_TITLE, - text: i18n.TIMELINE_VERSION_CONFLICT_DESCRIPTION, - }); - break; - default: - kibana.notifications.toasts.addDanger({ - title: i18n.UPDATE_TIMELINE_ERROR_TITLE, - text: error?.message ?? i18n.UPDATE_TIMELINE_ERROR_TEXT, - }); - } - return [ - endTimelineSaving({ - id: action.payload.id, - }), - ]; - } - - const unwrappedResponse = response.data.persistTimeline; - if (unwrappedResponse == null) { - kibana.notifications.toasts.addDanger({ - title: i18n.UPDATE_TIMELINE_ERROR_TITLE, - text: i18n.UPDATE_TIMELINE_ERROR_TEXT, - }); - return [ - endTimelineSaving({ - id: action.payload.id, - }), - ]; - } - - if (unwrappedResponse.code === 403) { - return [ - showCallOutUnauthorizedMsg(), - endTimelineSaving({ - id: action.payload.id, - }), - ]; - } - - if (allTimelineQuery.refetch != null) { - (allTimelineQuery.refetch as inputsModel.Refetch)(); - } - - return [ - updateTimeline({ - id: action.payload.id, - timeline: { - ...recentTimeline[action.payload.id], - updated: unwrappedResponse.timeline.updated ?? undefined, - savedObjectId: unwrappedResponse.timeline.savedObjectId, - version: unwrappedResponse.timeline.version, - status: unwrappedResponse.timeline.status ?? TimelineStatus.active, - timelineType: unwrappedResponse.timeline.timelineType ?? TimelineType.default, - templateTimelineId: unwrappedResponse.timeline.templateTimelineId ?? null, - templateTimelineVersion: - unwrappedResponse.timeline.templateTimelineVersion ?? null, - savedSearchId: unwrappedResponse.timeline.savedSearchId ?? null, - isSaving: false, - }, - }), - setChanged({ - id: action.payload.id, - changed: false, - }), - endTimelineSaving({ - id: action.payload.id, - }), - ]; - }), - startWith(startTimelineSaving({ id: action.payload.id })), - takeUntil( - action$.pipe( - withLatestFrom(timeline$), - filter(([checkAction, updatedTimeline]) => { - if ( - checkAction.type === endTimelineSaving.type && - updatedTimeline[get('payload.id', checkAction)].savedObjectId != null - ) { - myEpicTimelineId.setTimelineId( - updatedTimeline[get('payload.id', checkAction)].savedObjectId - ); - myEpicTimelineId.setTimelineVersion( - updatedTimeline[get('payload.id', checkAction)].version - ); - myEpicTimelineId.setTemplateTimelineId( - updatedTimeline[get('payload.id', checkAction)].templateTimelineId - ); - myEpicTimelineId.setTemplateTimelineVersion( - updatedTimeline[get('payload.id', checkAction)].templateTimelineVersion - ); - return true; - } - return false; - }) - ) - ) - ); - } - return EMPTY; - }) - ) - ); - }; - -function isSaveTimelineAction(action: Action): action is ReturnType { - return action.type === saveTimeline.type; -} - -const timelineInput: TimelineInput = { - columns: null, - dataProviders: null, - dataViewId: null, - description: null, - eqlOptions: null, - eventType: null, - excludedRowRendererIds: null, - filters: null, - kqlMode: null, - kqlQuery: null, - indexNames: null, - title: null, - timelineType: TimelineType.default, - templateTimelineVersion: null, - templateTimelineId: null, - dateRange: null, - savedQueryId: null, - sort: null, - status: null, - savedSearchId: null, -}; - -export const convertTimelineAsInput = ( - timeline: TimelineModel, - timelineTimeRange: inputsModel.TimeRange -): TimelineInput => - Object.keys(timelineInput).reduce((acc, key) => { - if (has(key, timeline)) { - if (key === 'kqlQuery') { - return set(`${key}.filterQuery`, get(`${key}.filterQuery`, timeline), acc); - } else if (key === 'dateRange') { - return set(`${key}`, { start: timelineTimeRange.from, end: timelineTimeRange.to }, acc); - } else if (key === 'columns' && get(key, timeline) != null) { - return set( - key, - get(key, timeline).map((col: ColumnHeaderOptions) => - omit(['initialWidth', 'width', '__typename', 'esTypes'], col) - ), - acc - ); - } else if (key === 'filters' && get(key, timeline) != null) { - const filters = get(key, timeline); - return set( - key, - filters != null - ? filters.map((myFilter: Filter) => { - const basicFilter = omit(['$state'], myFilter); - return { - ...basicFilter, - meta: { - ...basicFilter.meta, - field: - (isMatchAllFilter(basicFilter) || - isPhraseFilter(basicFilter) || - isPhrasesFilter(basicFilter) || - isRangeFilter(basicFilter)) && - basicFilter.meta.field != null - ? convertToString(basicFilter.meta.field) - : null, - value: - basicFilter.meta.value != null - ? convertToString(basicFilter.meta.value) - : null, - params: - basicFilter.meta.params != null - ? convertToString(basicFilter.meta.params) - : null, - }, - ...(isMatchAllFilter(basicFilter) - ? { - query: { - match_all: convertToString( - (basicFilter as MatchAllFilter).query.match_all - ), - }, - } - : { match_all: null }), - ...(isExistsFilter(basicFilter) && basicFilter.query.exists != null - ? { query: { exists: convertToString(basicFilter.query.exists) } } - : { exists: null }), - ...((isQueryStringFilter(basicFilter) || get('query', basicFilter) != null) && - basicFilter.query != null - ? { query: convertToString(basicFilter.query) } - : { query: null }), - ...(isRangeFilter(basicFilter) && basicFilter.query.range != null - ? { query: { range: convertToString(basicFilter.query.range) } } - : { range: null }), - ...(isScriptedRangeFilter(basicFilter) && - basicFilter.query.script != - null /* TODO remove it when PR50713 is merged || esFilters.isPhraseFilter(basicFilter) */ - ? { query: { script: convertToString(basicFilter.query.script) } } - : { script: null }), - }; - }) - : [], - acc - ); - } - return set(key, get(key, timeline), acc); - } - return acc; - }, timelineInput); - -const convertToString = (obj: unknown) => { - try { - if (isObject(obj)) { - return JSON.stringify(obj); - } - return fpToString(obj); - } catch { - return ''; - } -}; - -type PossibleResponse = TimelineResponse | TimelineErrorResponse; - -function isTimelineErrorResponse(response: PossibleResponse): response is TimelineErrorResponse { - return 'status_code' in response || 'statusCode' in response; -} - -function getErrorFromResponse(response: TimelineErrorResponse) { - if ('status_code' in response) { - return { errorCode: response.status_code, message: response.message }; - } else if ('statusCode' in response) { - return { errorCode: response.statusCode, message: response.message }; - } -} diff --git a/x-pack/plugins/security_solution/public/timelines/store/epic_favorite.ts b/x-pack/plugins/security_solution/public/timelines/store/epic_favorite.ts deleted file mode 100644 index c6bd77d222a6c..0000000000000 --- a/x-pack/plugins/security_solution/public/timelines/store/epic_favorite.ts +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { get } from 'lodash/fp'; -import type { Action } from 'redux'; -import type { Epic } from 'redux-observable'; -import type { Observable } from 'rxjs'; -import { from, EMPTY } from 'rxjs'; -import { filter, mergeMap, withLatestFrom, startWith, takeUntil } from 'rxjs/operators'; - -import { addError } from '../../common/store/app/actions'; -import { - endTimelineSaving, - updateIsFavorite, - updateTimeline, - startTimelineSaving, - showCallOutUnauthorizedMsg, -} from './actions'; -import { dispatcherTimelinePersistQueue } from './epic_dispatcher_timeline_persistence_queue'; -import { myEpicTimelineId } from './my_epic_timeline_id'; -import type { TimelineById } from './types'; -import type { inputsModel } from '../../common/store/inputs'; -import type { ResponseFavoriteTimeline } from '../../../common/api/timeline'; -import { TimelineType } from '../../../common/api/timeline'; -import { persistFavorite } from '../containers/api'; - -type FavoriteTimelineAction = ReturnType; - -const timelineFavoriteActionsType = new Set([updateIsFavorite.type]); - -export function isFavoriteTimelineAction(action: Action): action is FavoriteTimelineAction { - return timelineFavoriteActionsType.has(action.type); -} - -export const epicPersistTimelineFavorite = ( - action: FavoriteTimelineAction, - timeline: TimelineById, - action$: Observable, - timeline$: Observable, - allTimelineQuery$: Observable - // eslint-disable-next-line @typescript-eslint/no-explicit-any -): Observable => - from( - persistFavorite({ - timelineId: myEpicTimelineId.getTimelineId(), - templateTimelineId: timeline[action.payload.id].templateTimelineId, - templateTimelineVersion: timeline[action.payload.id].templateTimelineVersion, - timelineType: timeline[action.payload.id].timelineType ?? TimelineType.default, - }) - ).pipe( - withLatestFrom(timeline$, allTimelineQuery$), - mergeMap(([result, recentTimelines, allTimelineQuery]) => { - const savedTimeline = recentTimelines[action.payload.id]; - const response: ResponseFavoriteTimeline = get('data.persistFavorite', result); - const callOutMsg = response.code === 403 ? [showCallOutUnauthorizedMsg()] : []; - - if (allTimelineQuery.refetch != null) { - (allTimelineQuery.refetch as inputsModel.Refetch)(); - } - - return [ - ...callOutMsg, - updateTimeline({ - id: action.payload.id, - timeline: { - ...savedTimeline, - isFavorite: response.favorite != null && response.favorite.length > 0, - savedObjectId: response.savedObjectId || null, - version: response.version || null, - }, - }), - endTimelineSaving({ - id: action.payload.id, - }), - ].filter(Boolean); - }), - startWith(startTimelineSaving({ id: action.payload.id })), - takeUntil( - action$.pipe( - withLatestFrom(timeline$), - filter(([checkAction, updatedTimeline]) => { - if (checkAction.type === addError.type) { - return true; - } - if ( - checkAction.type === endTimelineSaving.type && - updatedTimeline[get('payload.id', checkAction)].savedObjectId != null - ) { - myEpicTimelineId.setTimelineId( - updatedTimeline[get('payload.id', checkAction)].savedObjectId - ); - myEpicTimelineId.setTimelineVersion( - updatedTimeline[get('payload.id', checkAction)].version - ); - myEpicTimelineId.setTemplateTimelineId( - updatedTimeline[get('payload.id', checkAction)].templateTimelineId - ); - myEpicTimelineId.setTemplateTimelineVersion( - updatedTimeline[get('payload.id', checkAction)].templateTimelineVersion - ); - return true; - } - return false; - }) - ) - ) - ); - -export const createTimelineFavoriteEpic = - (): Epic => - (action$) => { - return action$.pipe( - filter(isFavoriteTimelineAction), - mergeMap((action) => { - dispatcherTimelinePersistQueue.next({ action }); - return EMPTY; - }) - ); - }; diff --git a/x-pack/plugins/security_solution/public/timelines/store/epic_note.ts b/x-pack/plugins/security_solution/public/timelines/store/epic_note.ts deleted file mode 100644 index 98c4f90bfa1dd..0000000000000 --- a/x-pack/plugins/security_solution/public/timelines/store/epic_note.ts +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { get } from 'lodash/fp'; -import type { Action } from 'redux'; -import type { Epic } from 'redux-observable'; -import type { Observable } from 'rxjs'; -import { from, EMPTY } from 'rxjs'; -import { filter, mergeMap, switchMap, withLatestFrom, startWith, takeUntil } from 'rxjs/operators'; - -import { updateNote, addError } from '../../common/store/app/actions'; -import type { NotesById } from '../../common/store/app/model'; -import type { inputsModel } from '../../common/store/inputs'; - -import { - addNote, - addNoteToEvent, - endTimelineSaving, - updateTimeline, - startTimelineSaving, - showCallOutUnauthorizedMsg, -} from './actions'; -import { myEpicTimelineId } from './my_epic_timeline_id'; -import { dispatcherTimelinePersistQueue } from './epic_dispatcher_timeline_persistence_queue'; -import type { TimelineById } from './types'; -import { persistNote } from '../containers/notes/api'; -import type { ResponseNote } from '../../../common/api/timeline'; - -type NoteAction = ReturnType; - -const timelineNoteActionsType = new Set([addNote.type, addNoteToEvent.type]); - -export function isNoteAction(action: Action): action is NoteAction { - return timelineNoteActionsType.has(action.type); -} - -export const epicPersistNote = ( - action: NoteAction, - notes: NotesById, - action$: Observable, - timeline$: Observable, - notes$: Observable, - allTimelineQuery$: Observable - // eslint-disable-next-line @typescript-eslint/no-explicit-any -): Observable => - from( - persistNote({ - noteId: null, - version: null, - note: { - eventId: 'eventId' in action.payload ? action.payload.eventId : undefined, - note: getNote(action.payload.noteId, notes), - timelineId: myEpicTimelineId.getTimelineId(), - }, - }) - ).pipe( - withLatestFrom(timeline$, notes$, allTimelineQuery$), - mergeMap(([result, recentTimeline, recentNotes, allTimelineQuery]) => { - const noteIdRedux = action.payload.noteId; - const response: ResponseNote = get('data.persistNote', result); - const callOutMsg = response.code === 403 ? [showCallOutUnauthorizedMsg()] : []; - - if (allTimelineQuery.refetch != null) { - (allTimelineQuery.refetch as inputsModel.Refetch)(); - } - - return [ - ...callOutMsg, - recentTimeline[action.payload.id].savedObjectId == null - ? updateTimeline({ - id: action.payload.id, - timeline: { - ...recentTimeline[action.payload.id], - savedObjectId: response.note.timelineId || null, - version: response.note.timelineVersion || null, - }, - }) - : null, - updateNote({ - note: { - ...recentNotes[noteIdRedux], - created: - response.note.updated != null - ? new Date(response.note.updated) - : recentNotes[noteIdRedux].created, - user: - response.note.updatedBy != null - ? response.note.updatedBy - : recentNotes[noteIdRedux].user, - saveObjectId: response.note.noteId, - version: response.note.version, - }, - }), - endTimelineSaving({ - id: action.payload.id, - }), - ].filter(Boolean); - }), - startWith(startTimelineSaving({ id: action.payload.id })), - takeUntil( - action$.pipe( - withLatestFrom(timeline$), - filter(([checkAction, updatedTimeline]) => { - if (checkAction.type === addError.type) { - return true; - } - if ( - checkAction.type === endTimelineSaving.type && - updatedTimeline[get('payload.id', checkAction)].savedObjectId != null - ) { - myEpicTimelineId.setTimelineId( - updatedTimeline[get('payload.id', checkAction)].savedObjectId - ); - myEpicTimelineId.setTimelineVersion( - updatedTimeline[get('payload.id', checkAction)].version - ); - return true; - } - return false; - }) - ) - ) - ); - -export const createTimelineNoteEpic = - (): Epic => - (action$) => - action$.pipe( - filter(isNoteAction), - switchMap((action) => { - dispatcherTimelinePersistQueue.next({ action }); - return EMPTY; - }) - ); - -const getNote = (noteId: string | undefined | null, notes: NotesById): string => { - if (noteId != null) { - return notes[noteId].note; - } - return ''; -}; diff --git a/x-pack/plugins/security_solution/public/timelines/store/epic_pinned_event.ts b/x-pack/plugins/security_solution/public/timelines/store/epic_pinned_event.ts deleted file mode 100644 index 0808479bd5f24..0000000000000 --- a/x-pack/plugins/security_solution/public/timelines/store/epic_pinned_event.ts +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { get, omit } from 'lodash/fp'; -import type { Action } from 'redux'; -import type { Epic } from 'redux-observable'; -import type { Observable } from 'rxjs'; -import { from, EMPTY } from 'rxjs'; -import { filter, mergeMap, startWith, withLatestFrom, takeUntil } from 'rxjs/operators'; - -import { addError } from '../../common/store/app/actions'; -import type { inputsModel } from '../../common/store/inputs'; -import type { PinnedEventResponse } from '../../../common/api/timeline'; -import { - pinEvent, - endTimelineSaving, - unPinEvent, - updateTimeline, - startTimelineSaving, - showCallOutUnauthorizedMsg, -} from './actions'; -import { myEpicTimelineId } from './my_epic_timeline_id'; -import { dispatcherTimelinePersistQueue } from './epic_dispatcher_timeline_persistence_queue'; -import type { TimelineById } from './types'; -import { persistPinnedEvent } from '../containers/pinned_event/api'; - -type PinnedEventAction = ReturnType; - -const timelinePinnedEventActionsType = new Set([pinEvent.type, unPinEvent.type]); - -export function isPinnedEventAction(action: Action): action is PinnedEventAction { - return timelinePinnedEventActionsType.has(action.type); -} - -export const epicPersistPinnedEvent = ( - action: PinnedEventAction, - timeline: TimelineById, - action$: Observable, - timeline$: Observable, - allTimelineQuery$: Observable - // eslint-disable-next-line @typescript-eslint/no-explicit-any -): Observable => - from( - persistPinnedEvent({ - pinnedEventId: - timeline[action.payload.id].pinnedEventsSaveObject[action.payload.eventId] != null - ? timeline[action.payload.id].pinnedEventsSaveObject[action.payload.eventId].pinnedEventId - : null, - eventId: action.payload.eventId, - timelineId: myEpicTimelineId.getTimelineId(), - }) - ).pipe( - withLatestFrom(timeline$, allTimelineQuery$), - mergeMap(([result, recentTimeline, allTimelineQuery]) => { - const savedTimeline = recentTimeline[action.payload.id]; - const response: PinnedEventResponse = get('data.persistPinnedEventOnTimeline', result); - const callOutMsg = response && response.code === 403 ? [showCallOutUnauthorizedMsg()] : []; - - if (allTimelineQuery.refetch != null) { - (allTimelineQuery.refetch as inputsModel.Refetch)(); - } - - return [ - response != null - ? updateTimeline({ - id: action.payload.id, - timeline: { - ...savedTimeline, - savedObjectId: - savedTimeline.savedObjectId == null && response.timelineId != null - ? response.timelineId - : savedTimeline.savedObjectId, - version: - savedTimeline.version == null && response.timelineVersion != null - ? response.timelineVersion - : savedTimeline.version, - pinnedEventIds: { - ...savedTimeline.pinnedEventIds, - [action.payload.eventId]: true, - }, - pinnedEventsSaveObject: { - ...savedTimeline.pinnedEventsSaveObject, - [action.payload.eventId]: response, - }, - }, - }) - : updateTimeline({ - id: action.payload.id, - timeline: { - ...savedTimeline, - pinnedEventIds: omit(action.payload.eventId, savedTimeline.pinnedEventIds), - pinnedEventsSaveObject: omit( - action.payload.eventId, - savedTimeline.pinnedEventsSaveObject - ), - }, - }), - ...callOutMsg, - endTimelineSaving({ - id: action.payload.id, - }), - ].filter(Boolean); - }), - startWith(startTimelineSaving({ id: action.payload.id })), - takeUntil( - action$.pipe( - withLatestFrom(timeline$), - filter(([checkAction, updatedTimeline]) => { - if (checkAction.type === addError.type) { - return true; - } - if ( - checkAction.type === endTimelineSaving.type && - updatedTimeline[get('payload.id', checkAction)].savedObjectId != null - ) { - myEpicTimelineId.setTimelineId( - updatedTimeline[get('payload.id', checkAction)].savedObjectId - ); - myEpicTimelineId.setTimelineVersion( - updatedTimeline[get('payload.id', checkAction)].version - ); - return true; - } - return false; - }) - ) - ) - ); - -export const createTimelinePinnedEventEpic = - (): Epic => - (action$) => - action$.pipe( - filter(isPinnedEventAction), - mergeMap((action) => { - dispatcherTimelinePersistQueue.next({ action }); - return EMPTY; - }) - ); diff --git a/x-pack/plugins/security_solution/public/timelines/store/helpers.ts b/x-pack/plugins/security_solution/public/timelines/store/helpers.ts index ad26606964601..5ce65a5b7091b 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/helpers.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/helpers.ts @@ -44,7 +44,6 @@ import { import { activeTimeline } from '../containers/active_timeline_context'; import type { ResolveTimelineConfig } from '../components/open_timeline/types'; import { getDisplayValue } from '../components/timeline/data_providers/helpers'; -export const isNotNull = (value: T | null): value is T => value !== null; interface AddTimelineNoteParams { id: string; diff --git a/x-pack/plugins/security_solution/public/timelines/store/manage_timeline_id.tsx b/x-pack/plugins/security_solution/public/timelines/store/manage_timeline_id.tsx deleted file mode 100644 index ee81b776cb33d..0000000000000 --- a/x-pack/plugins/security_solution/public/timelines/store/manage_timeline_id.tsx +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export class ManageEpicTimelineId { - private timelineId: string | null = null; - private version: string | null = null; - private templateTimelineId: string | null = null; - private templateVersion: number | null = null; - - public getTimelineId(): string | null { - return this.timelineId; - } - - public getTimelineVersion(): string | null { - return this.version; - } - - public getTemplateTimelineId(): string | null { - return this.templateTimelineId; - } - - public getTemplateTimelineVersion(): number | null { - return this.templateVersion; - } - - public setTimelineId(timelineId: string | null) { - this.timelineId = timelineId; - } - - public setTimelineVersion(version: string | null) { - this.version = version; - } - - public setTemplateTimelineId(templateTimelineId: string | null) { - this.templateTimelineId = templateTimelineId; - } - - public setTemplateTimelineVersion(templateVersion: number | null) { - this.templateVersion = templateVersion; - } -} diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/create_timeline_middlewares.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/create_timeline_middlewares.ts index 80f320b755c7e..d473f509c688c 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/middlewares/create_timeline_middlewares.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/create_timeline_middlewares.ts @@ -5,8 +5,20 @@ * 2.0. */ -import { timelineChangedMiddleware } from './changed'; +import type { CoreStart } from '@kbn/core/public'; -export function createTimelineMiddlewares() { - return [timelineChangedMiddleware]; +import { timelineChangedMiddleware } from './timeline_changed'; +import { favoriteTimelineMiddleware } from './timeline_favorite'; +import { addNoteToTimelineMiddleware } from './timeline_note'; +import { addPinnedEventToTimelineMiddleware } from './timeline_pinned_event'; +import { saveTimelineMiddleware } from './timeline_save'; + +export function createTimelineMiddlewares(kibana: CoreStart) { + return [ + timelineChangedMiddleware, + favoriteTimelineMiddleware(kibana), + addNoteToTimelineMiddleware(kibana), + addPinnedEventToTimelineMiddleware(kibana), + saveTimelineMiddleware(kibana), + ]; } diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/helpers.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/helpers.ts new file mode 100644 index 0000000000000..1123985bca77d --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/helpers.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { State } from '../../../common/store/types'; +import { ALL_TIMELINE_QUERY_ID } from '../../containers/all'; +import type { inputsModel } from '../../../common/store/inputs'; +import { inputsSelectors } from '../../../common/store/inputs'; + +/** + * Refreshes all timelines, so changes are propagated to everywhere on the page + */ +export function refreshTimelines(state: State) { + const allTimelineQuery = inputsSelectors.globalQueryByIdSelector()(state, ALL_TIMELINE_QUERY_ID); + if (allTimelineQuery.refetch != null) { + (allTimelineQuery.refetch as inputsModel.Refetch)(); + } +} diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/changed.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_changed.ts similarity index 100% rename from x-pack/plugins/security_solution/public/timelines/store/middlewares/changed.ts rename to x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_changed.ts diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_favorite.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_favorite.ts new file mode 100644 index 0000000000000..8cf58908bb2ed --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_favorite.ts @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { get } from 'lodash/fp'; +import type { Action, Middleware } from 'redux'; +import type { CoreStart } from '@kbn/core/public'; + +import type { State } from '../../../common/store/types'; +import { + endTimelineSaving, + updateIsFavorite, + updateTimeline, + startTimelineSaving, + showCallOutUnauthorizedMsg, +} from '../actions'; +import type { ResponseFavoriteTimeline } from '../../../../common/api/timeline'; +import { TimelineType } from '../../../../common/api/timeline'; +import { persistFavorite } from '../../containers/api'; +import { selectTimelineById } from '../selectors'; +import * as i18n from '../../pages/translations'; +import { refreshTimelines } from './helpers'; + +type FavoriteTimelineAction = ReturnType; + +function isFavoriteTimelineAction(action: Action): action is FavoriteTimelineAction { + return action.type === updateIsFavorite.type; +} + +export const favoriteTimelineMiddleware: (kibana: CoreStart) => Middleware<{}, State> = + (kibana: CoreStart) => (store) => (next) => async (action: Action) => { + // perform the action + const ret = next(action); + + if (isFavoriteTimelineAction(action)) { + const { id } = action.payload; + const timeline = selectTimelineById(store.getState(), id); + + store.dispatch(startTimelineSaving({ id })); + + try { + const result = await persistFavorite({ + timelineId: timeline.id, + templateTimelineId: timeline.templateTimelineId, + templateTimelineVersion: timeline.templateTimelineVersion, + timelineType: timeline.timelineType ?? TimelineType.default, + }); + + const response: ResponseFavoriteTimeline = get('data.persistFavorite', result); + + if (response.code === 403) { + store.dispatch(showCallOutUnauthorizedMsg()); + } + + refreshTimelines(store.getState()); + + store.dispatch( + updateTimeline({ + id, + timeline: { + ...timeline, + isFavorite: response.favorite != null && response.favorite.length > 0, + savedObjectId: response.savedObjectId || null, + version: response.version || null, + }, + }) + ); + } catch (error) { + kibana.notifications.toasts.addDanger({ + title: i18n.UPDATE_TIMELINE_ERROR_TITLE, + text: error?.message ?? i18n.UPDATE_TIMELINE_ERROR_TEXT, + }); + } finally { + store.dispatch( + endTimelineSaving({ + id, + }) + ); + } + } + + return ret; + }; diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_note.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_note.ts new file mode 100644 index 0000000000000..5d77a5082b82c --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_note.ts @@ -0,0 +1,104 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { get } from 'lodash/fp'; +import type { Action, Middleware } from 'redux'; +import type { CoreStart } from '@kbn/core/public'; + +import { appSelectors } from '../../../common/store/app'; +import type { NotesById } from '../../../common/store/app/model'; +import type { State } from '../../../common/store/types'; +import { updateNote } from '../../../common/store/app/actions'; +import { + addNote, + addNoteToEvent, + endTimelineSaving, + startTimelineSaving, + showCallOutUnauthorizedMsg, +} from '../actions'; +import { persistNote } from '../../containers/notes/api'; +import type { ResponseNote } from '../../../../common/api/timeline'; +import { selectTimelineById } from '../selectors'; +import * as i18n from '../../pages/translations'; +import { refreshTimelines } from './helpers'; + +type NoteAction = ReturnType; + +const timelineNoteActionsType = new Set([addNote.type, addNoteToEvent.type]); + +function isNoteAction(action: Action): action is NoteAction { + return timelineNoteActionsType.has(action.type); +} + +export const addNoteToTimelineMiddleware: (kibana: CoreStart) => Middleware<{}, State> = + (kibana: CoreStart) => (store) => (next) => async (action: Action) => { + // perform the action + const ret = next(action); + + if (isNoteAction(action)) { + const { id, noteId: localNoteId } = action.payload; + const timeline = selectTimelineById(store.getState(), id); + const notes = appSelectors.selectNotesByIdSelector(store.getState()); + + store.dispatch(startTimelineSaving({ id })); + + try { + const result = await persistNote({ + noteId: null, + version: null, + note: { + eventId: 'eventId' in action.payload ? action.payload.eventId : undefined, + note: getNoteText(localNoteId, notes), + timelineId: timeline.id, + }, + }); + + const response: ResponseNote = get('data.persistNote', result); + if (response.code === 403) { + store.dispatch(showCallOutUnauthorizedMsg()); + } + + refreshTimelines(store.getState()); + + store.dispatch( + updateNote({ + note: { + ...notes[localNoteId], + created: + response.note.updated != null + ? new Date(response.note.updated) + : notes[localNoteId].created, + user: + response.note.updatedBy != null ? response.note.updatedBy : notes[localNoteId].user, + saveObjectId: response.note.noteId, + version: response.note.version, + }, + }) + ); + } catch (error) { + kibana.notifications.toasts.addDanger({ + title: i18n.UPDATE_TIMELINE_ERROR_TITLE, + text: error?.message ?? i18n.UPDATE_TIMELINE_ERROR_TEXT, + }); + } finally { + store.dispatch( + endTimelineSaving({ + id, + }) + ); + } + } + + return ret; + }; + +const getNoteText = (noteId: string | undefined | null, notes: NotesById): string => { + if (noteId != null) { + return notes[noteId].note; + } + return ''; +}; diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.ts new file mode 100644 index 0000000000000..9e7b5b772489d --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.ts @@ -0,0 +1,109 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { get, omit } from 'lodash/fp'; +import type { Action, Middleware } from 'redux'; +import type { CoreStart } from '@kbn/core/public'; + +import type { State } from '../../../common/store/types'; +import { selectTimelineById } from '../selectors'; +import * as i18n from '../../pages/translations'; +import type { PinnedEventResponse } from '../../../../common/api/timeline'; +import { + pinEvent, + endTimelineSaving, + unPinEvent, + updateTimeline, + startTimelineSaving, + showCallOutUnauthorizedMsg, +} from '../actions'; +import { persistPinnedEvent } from '../../containers/pinned_event/api'; +import { refreshTimelines } from './helpers'; + +type PinnedEventAction = ReturnType; + +const timelinePinnedEventActionsType = new Set([pinEvent.type, unPinEvent.type]); + +function isPinnedEventAction(action: Action): action is PinnedEventAction { + return timelinePinnedEventActionsType.has(action.type); +} + +export const addPinnedEventToTimelineMiddleware: (kibana: CoreStart) => Middleware<{}, State> = + (kibana: CoreStart) => (store) => (next) => async (action: Action) => { + // perform the action + const ret = next(action); + + if (isPinnedEventAction(action)) { + const { id: localTimelineId, eventId } = action.payload; + const timeline = selectTimelineById(store.getState(), localTimelineId); + + store.dispatch(startTimelineSaving({ id: localTimelineId })); + + try { + const result = await persistPinnedEvent({ + pinnedEventId: + timeline.pinnedEventsSaveObject[eventId] != null + ? timeline.pinnedEventsSaveObject[eventId].pinnedEventId + : null, + eventId, + timelineId: timeline.id, + }); + + const response: PinnedEventResponse = get('data.persistPinnedEventOnTimeline', result); + if (response && response.code === 403) { + store.dispatch(showCallOutUnauthorizedMsg()); + } + + refreshTimelines(store.getState()); + + // The response is null in case we unpinned an event. + // In that case we want to remove the locally pinned event. + if (!response) { + store.dispatch( + updateTimeline({ + id: action.payload.id, + timeline: { + ...timeline, + pinnedEventIds: omit(eventId, timeline.pinnedEventIds), + pinnedEventsSaveObject: omit(eventId, timeline.pinnedEventsSaveObject), + }, + }) + ); + } else { + store.dispatch( + updateTimeline({ + id: action.payload.id, + timeline: { + ...timeline, + pinnedEventIds: { + ...timeline.pinnedEventIds, + [eventId]: true, + }, + pinnedEventsSaveObject: { + ...timeline.pinnedEventsSaveObject, + [eventId]: response, + }, + }, + }) + ); + } + } catch (error) { + kibana.notifications.toasts.addDanger({ + title: i18n.UPDATE_TIMELINE_ERROR_TITLE, + text: error?.message ?? i18n.UPDATE_TIMELINE_ERROR_TEXT, + }); + } finally { + store.dispatch( + endTimelineSaving({ + id: localTimelineId, + }) + ); + } + } + + return ret; + }; diff --git a/x-pack/plugins/security_solution/public/timelines/store/epic.test.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.test.ts similarity index 96% rename from x-pack/plugins/security_solution/public/timelines/store/epic.test.ts rename to x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.test.ts index bbcc9363a1072..a74bf55d7ff19 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/epic.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.test.ts @@ -7,13 +7,13 @@ import type { Filter } from '@kbn/es-query'; import { FilterStateStore } from '@kbn/es-query'; -import { Direction } from '../../../common/search_strategy'; -import { TimelineTabs } from '../../../common/types/timeline'; -import { TimelineType, TimelineStatus } from '../../../common/api/timeline'; -import { convertTimelineAsInput } from './epic'; -import type { TimelineModel } from './model'; +import { Direction } from '../../../../common/search_strategy'; +import { TimelineTabs } from '../../../../common/types/timeline'; +import { TimelineType, TimelineStatus } from '../../../../common/api/timeline'; +import { convertTimelineAsInput } from './timeline_save'; +import type { TimelineModel } from '../model'; -describe('Epic Timeline', () => { +describe('Timeline Save Middleware', () => { describe('#convertTimelineAsInput ', () => { test('should return a TimelineInput instead of TimelineModel ', () => { const columns: TimelineModel['columns'] = [ diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.ts new file mode 100644 index 0000000000000..39b5203a2e395 --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.ts @@ -0,0 +1,297 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { get, has, set, omit, isObject, toString as fpToString } from 'lodash/fp'; +import type { Action, Middleware } from 'redux'; +import type { CoreStart } from '@kbn/core/public'; +import type { Filter, MatchAllFilter } from '@kbn/es-query'; +import { + isScriptedRangeFilter, + isExistsFilter, + isRangeFilter, + isMatchAllFilter, + isPhraseFilter, + isQueryStringFilter, + isPhrasesFilter, +} from '@kbn/es-query'; + +import { + updateTimeline, + startTimelineSaving, + endTimelineSaving, + showCallOutUnauthorizedMsg, + saveTimeline, + setChanged, +} from '../actions'; +import { copyTimeline, persistTimeline } from '../../containers/api'; +import type { State } from '../../../common/store/types'; +import { inputsSelectors } from '../../../common/store/inputs'; +import { selectTimelineById } from '../selectors'; +import * as i18n from '../../pages/translations'; +import type { inputsModel } from '../../../common/store/inputs'; +import { TimelineStatus, TimelineType } from '../../../../common/api/timeline'; +import type { TimelineErrorResponse, TimelineResponse } from '../../../../common/api/timeline'; +import type { TimelineInput } from '../../../../common/search_strategy'; +import type { TimelineModel } from '../model'; +import type { ColumnHeaderOptions } from '../../../../common/types/timeline'; +import { refreshTimelines } from './helpers'; + +function isSaveTimelineAction(action: Action): action is ReturnType { + return action.type === saveTimeline.type; +} + +export const saveTimelineMiddleware: (kibana: CoreStart) => Middleware<{}, State> = + (kibana: CoreStart) => (store) => (next) => async (action: Action) => { + // perform the action + const ret = next(action); + + if (isSaveTimelineAction(action)) { + const { id: localTimelineId } = action.payload; + const timeline = selectTimelineById(store.getState(), localTimelineId); + const { timelineId, timelineVersion, templateTimelineId, templateTimelineVersion } = + extractTimelineIdsAndVersions(timeline); + const timelineTimeRange = inputsSelectors.timelineTimeRangeSelector(store.getState()); + + store.dispatch(startTimelineSaving({ id: localTimelineId })); + + try { + const result = await (action.payload.saveAsNew && timeline.id + ? copyTimeline({ + timelineId, + timeline: { + ...convertTimelineAsInput(timeline, timelineTimeRange), + templateTimelineId, + templateTimelineVersion, + }, + savedSearch: timeline.savedSearch, + }) + : persistTimeline({ + timelineId, + version: timelineVersion, + timeline: { + ...convertTimelineAsInput(timeline, timelineTimeRange), + templateTimelineId, + templateTimelineVersion, + }, + savedSearch: timeline.savedSearch, + })); + + if (isTimelineErrorResponse(result)) { + const error = getErrorFromResponse(result); + switch (error?.errorCode) { + // conflict + case 409: + kibana.notifications.toasts.addDanger({ + title: i18n.TIMELINE_VERSION_CONFLICT_TITLE, + text: i18n.TIMELINE_VERSION_CONFLICT_DESCRIPTION, + }); + break; + default: + kibana.notifications.toasts.addDanger({ + title: i18n.UPDATE_TIMELINE_ERROR_TITLE, + text: error?.message ?? i18n.UPDATE_TIMELINE_ERROR_TEXT, + }); + } + return; + } + + const response = result.data.persistTimeline; + if (response == null) { + kibana.notifications.toasts.addDanger({ + title: i18n.UPDATE_TIMELINE_ERROR_TITLE, + text: i18n.UPDATE_TIMELINE_ERROR_TEXT, + }); + return; + } + + if (response && response.code === 403) { + store.dispatch(showCallOutUnauthorizedMsg()); + return; + } + + refreshTimelines(store.getState()); + + store.dispatch( + updateTimeline({ + id: localTimelineId, + timeline: { + ...timeline, + id: response.timeline.savedObjectId, + updated: response.timeline.updated ?? undefined, + savedObjectId: response.timeline.savedObjectId, + version: response.timeline.version, + status: response.timeline.status ?? TimelineStatus.active, + timelineType: response.timeline.timelineType ?? TimelineType.default, + templateTimelineId: response.timeline.templateTimelineId ?? null, + templateTimelineVersion: response.timeline.templateTimelineVersion ?? null, + savedSearchId: response.timeline.savedSearchId ?? null, + isSaving: false, + }, + }) + ); + store.dispatch( + setChanged({ + id: action.payload.id, + changed: false, + }) + ); + } catch (error) { + kibana.notifications.toasts.addDanger({ + title: i18n.UPDATE_TIMELINE_ERROR_TITLE, + text: error?.message ?? i18n.UPDATE_TIMELINE_ERROR_TEXT, + }); + } finally { + store.dispatch( + endTimelineSaving({ + id: localTimelineId, + }) + ); + } + } + return ret; + }; + +const timelineInput: TimelineInput = { + columns: null, + dataProviders: null, + dataViewId: null, + description: null, + eqlOptions: null, + eventType: null, + excludedRowRendererIds: null, + filters: null, + kqlMode: null, + kqlQuery: null, + indexNames: null, + title: null, + timelineType: TimelineType.default, + templateTimelineVersion: null, + templateTimelineId: null, + dateRange: null, + savedQueryId: null, + sort: null, + status: null, + savedSearchId: null, +}; + +export const convertTimelineAsInput = ( + timeline: TimelineModel, + timelineTimeRange: inputsModel.TimeRange +): TimelineInput => + Object.keys(timelineInput).reduce((acc, key) => { + if (has(key, timeline)) { + if (key === 'kqlQuery') { + return set(`${key}.filterQuery`, get(`${key}.filterQuery`, timeline), acc); + } else if (key === 'dateRange') { + return set(`${key}`, { start: timelineTimeRange.from, end: timelineTimeRange.to }, acc); + } else if (key === 'columns' && get(key, timeline) != null) { + return set( + key, + get(key, timeline).map((col: ColumnHeaderOptions) => + omit(['initialWidth', 'width', '__typename', 'esTypes'], col) + ), + acc + ); + } else if (key === 'filters' && get(key, timeline) != null) { + const filters = get(key, timeline); + return set( + key, + filters != null + ? filters.map((myFilter: Filter) => { + const basicFilter = omit(['$state'], myFilter); + return { + ...basicFilter, + meta: { + ...basicFilter.meta, + field: + (isMatchAllFilter(basicFilter) || + isPhraseFilter(basicFilter) || + isPhrasesFilter(basicFilter) || + isRangeFilter(basicFilter)) && + basicFilter.meta.field != null + ? convertToString(basicFilter.meta.field) + : null, + value: + basicFilter.meta.value != null + ? convertToString(basicFilter.meta.value) + : null, + params: + basicFilter.meta.params != null + ? convertToString(basicFilter.meta.params) + : null, + }, + ...(isMatchAllFilter(basicFilter) + ? { + query: { + match_all: convertToString( + (basicFilter as MatchAllFilter).query.match_all + ), + }, + } + : { match_all: null }), + ...(isExistsFilter(basicFilter) && basicFilter.query.exists != null + ? { query: { exists: convertToString(basicFilter.query.exists) } } + : { exists: null }), + ...((isQueryStringFilter(basicFilter) || get('query', basicFilter) != null) && + basicFilter.query != null + ? { query: convertToString(basicFilter.query) } + : { query: null }), + ...(isRangeFilter(basicFilter) && basicFilter.query.range != null + ? { query: { range: convertToString(basicFilter.query.range) } } + : { range: null }), + ...(isScriptedRangeFilter(basicFilter) && + basicFilter.query.script != + null /* TODO remove it when PR50713 is merged || esFilters.isPhraseFilter(basicFilter) */ + ? { query: { script: convertToString(basicFilter.query.script) } } + : { script: null }), + }; + }) + : [], + acc + ); + } + return set(key, get(key, timeline), acc); + } + return acc; + }, timelineInput); + +const convertToString = (obj: unknown) => { + try { + if (isObject(obj)) { + return JSON.stringify(obj); + } + return fpToString(obj); + } catch { + return ''; + } +}; + +type PossibleResponse = TimelineResponse | TimelineErrorResponse; + +function isTimelineErrorResponse(response: PossibleResponse): response is TimelineErrorResponse { + return 'status_code' in response || 'statusCode' in response; +} + +function getErrorFromResponse(response: TimelineErrorResponse) { + if ('status_code' in response) { + return { errorCode: response.status_code, message: response.message }; + } else if ('statusCode' in response) { + return { errorCode: response.statusCode, message: response.message }; + } +} + +function extractTimelineIdsAndVersions(timeline: TimelineModel) { + // When a timeline hasn't been saved yet, its `savedObectId` is not defined. + // In that case, we want to overwrite all locally created properties for the + // timeline id, the timeline template id and the timeline template version. + return { + timelineId: timeline.savedObjectId ?? null, + timelineVersion: timeline.version, + templateTimelineId: timeline.savedObjectId ? timeline.templateTimelineId : null, + templateTimelineVersion: timeline.savedObjectId ? timeline.templateTimelineVersion : null, + }; +} diff --git a/x-pack/plugins/security_solution/public/timelines/store/types.ts b/x-pack/plugins/security_solution/public/timelines/store/types.ts index fa8a915ddb35d..ef31fd909725b 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/types.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/types.ts @@ -6,11 +6,8 @@ */ import type { FilterManager } from '@kbn/data-plugin/public'; -import type { RootEpicDependencies } from '../../common/store/epic'; import type { ColumnHeaderOptions, SortColumnTimeline } from '../../../common/types'; import type { RowRendererId } from '../../../common/api/timeline'; -import type { inputsModel } from '../../common/store/inputs'; -import type { NotesById } from '../../common/store/app/model'; import type { TimelineModel } from './model'; @@ -35,13 +32,6 @@ export interface TimelineState { insertTimeline: InsertTimeline | null; } -export interface TimelineEpicDependencies extends RootEpicDependencies { - timelineByIdSelector: (state: State) => TimelineById; - timelineTimeRangeSelector: (state: State) => inputsModel.TimeRange; - selectAllTimelineQuery: () => (state: State, id: string) => inputsModel.GlobalQuery; - selectNotesByIdSelector: (state: State) => NotesById; -} - export interface TimelineModelSettings { documentType: string; defaultColumns: ColumnHeaderOptions[]; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/endpoint_artifact_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/endpoint_artifact_services.ts new file mode 100644 index 0000000000000..fda9c7b3ab403 --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/endpoint_artifact_services.ts @@ -0,0 +1,149 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ENDPOINT_ARTIFACT_LISTS } from '@kbn/securitysolution-list-constants'; +import { + ENDPOINT_LIST_DESCRIPTION, + ENDPOINT_LIST_ID, + ENDPOINT_LIST_NAME, + EXCEPTION_LIST_ITEM_URL, + INTERNAL_EXCEPTIONS_LIST_ENSURE_CREATED_URL, +} from '@kbn/securitysolution-list-constants'; +import type { KbnClient } from '@kbn/test'; +import type { + CreateExceptionListSchema, + ExceptionListItemSchema, + CreateExceptionListItemSchema, +} from '@kbn/securitysolution-io-ts-list-types'; +import { memoize } from 'lodash'; +import { ExceptionListTypeEnum } from '@kbn/securitysolution-io-ts-list-types'; +import { catchAxiosErrorFormatAndThrow } from '../../../common/endpoint/format_axios_error'; +import { TRUSTED_APPS_EXCEPTION_LIST_DEFINITION } from '../../../public/management/pages/trusted_apps/constants'; +import { EVENT_FILTER_LIST_DEFINITION } from '../../../public/management/pages/event_filters/constants'; +import { BLOCKLISTS_LIST_DEFINITION } from '../../../public/management/pages/blocklist/constants'; +import { HOST_ISOLATION_EXCEPTIONS_LIST_DEFINITION } from '../../../public/management/pages/host_isolation_exceptions/constants'; +import type { NewTrustedApp } from '../../../common/endpoint/types'; +import { newTrustedAppToCreateExceptionListItem } from '../../../public/management/pages/trusted_apps/service/mappers'; + +const ensureArtifactListExists = memoize( + async ( + kbnClient: KbnClient, + artifactType: keyof typeof ENDPOINT_ARTIFACT_LISTS | 'endpointExceptions' + ) => { + let listDefinition: CreateExceptionListSchema; + + switch (artifactType) { + case 'blocklists': + listDefinition = BLOCKLISTS_LIST_DEFINITION; + break; + + case 'eventFilters': + listDefinition = EVENT_FILTER_LIST_DEFINITION; + break; + + case 'hostIsolationExceptions': + listDefinition = HOST_ISOLATION_EXCEPTIONS_LIST_DEFINITION; + break; + + case 'trustedApps': + listDefinition = TRUSTED_APPS_EXCEPTION_LIST_DEFINITION; + break; + + case 'endpointExceptions': + listDefinition = { + name: ENDPOINT_LIST_NAME, + namespace_type: 'agnostic', + description: ENDPOINT_LIST_DESCRIPTION, + list_id: ENDPOINT_LIST_ID, + type: ExceptionListTypeEnum.ENDPOINT, + }; + + default: + throw new Error(`Unknown Artifact list: ${artifactType}`); + } + + await kbnClient + .request({ + method: 'POST', + path: INTERNAL_EXCEPTIONS_LIST_ENSURE_CREATED_URL, + body: listDefinition, + headers: { + 'elastic-api-version': '1', + }, + }) + .catch(catchAxiosErrorFormatAndThrow); + }, + (kbnClient: KbnClient, artifactType: string) => { + return `${artifactType}@[${kbnClient.resolveUrl('')}`; + } +); + +/** + * Creates an exception list item. + * NOTE: this method does NOT create the list itself. + * + * @private + * + * @param kbnClient + * @param data + */ +const createExceptionListItem = async ( + kbnClient: KbnClient, + data: CreateExceptionListItemSchema +): Promise => { + return kbnClient + .request({ + method: 'POST', + path: EXCEPTION_LIST_ITEM_URL, + body: data, + headers: { + 'elastic-api-version': '2023-10-31', + }, + }) + .catch(catchAxiosErrorFormatAndThrow) + .then((response) => response.data); +}; + +export const createTrustedApp = async ( + kbnClient: KbnClient, + data: NewTrustedApp +): Promise => { + await ensureArtifactListExists(kbnClient, 'trustedApps'); + return createExceptionListItem(kbnClient, newTrustedAppToCreateExceptionListItem(data)); +}; + +export const createEventFilter = async ( + kbnClient: KbnClient, + data: CreateExceptionListItemSchema +): Promise => { + await ensureArtifactListExists(kbnClient, 'eventFilters'); + return createExceptionListItem(kbnClient, data); +}; + +export const createBlocklist = async ( + kbnClient: KbnClient, + data: CreateExceptionListItemSchema +): Promise => { + await ensureArtifactListExists(kbnClient, 'blocklists'); + return createExceptionListItem(kbnClient, data); +}; + +export const createHostIsolationException = async ( + kbnClient: KbnClient, + data: CreateExceptionListItemSchema +): Promise => { + await ensureArtifactListExists(kbnClient, 'hostIsolationExceptions'); + return createExceptionListItem(kbnClient, data); +}; + +export const createEndpointException = async ( + kbnClient: KbnClient, + data: CreateExceptionListItemSchema +): Promise => { + await ensureArtifactListExists(kbnClient, 'hostIsolationExceptions'); + return createExceptionListItem(kbnClient, data); +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/execution_throttler.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/execution_throttler.ts new file mode 100644 index 0000000000000..219c9d577f38c --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/execution_throttler.ts @@ -0,0 +1,79 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/* eslint-disable @typescript-eslint/no-explicit-any */ +import type { ToolingLog } from '@kbn/tooling-log'; +import { createToolingLogger } from '../../../common/endpoint/data_loaders/utils'; + +export interface ExecutionThrottlerOptions { + concurrency?: number; + log?: ToolingLog; +} + +/** + * Queue callback functions and execute them in parallel using the defined concurrency number. Execution of + * callbacks starts as soon as functions start to be added to the queue (ex. Does not wait for a "batch" + * size to be reached) and continues to process the queue until it is flushed out. + */ +export class ExecutionThrottler { + private readonly options: Required; + private readonly queue: Array<() => Promise> = []; + private readonly executing = new Set>(); + + constructor({ concurrency = 10, log = createToolingLogger() }: ExecutionThrottlerOptions = {}) { + this.options = { + concurrency, + log, + }; + } + + private logCurrentState() { + this.options.log.debug( + `Executing count: [${this.executing.size}], Queue count: [${this.queue.length}]` + ); + } + + private async execute(): Promise { + if (this.queue.length === 0) { + return; + } + + while (this.executing.size < this.options.concurrency && this.queue.length) { + const callbackFn = this.queue.shift(); + + if (callbackFn) { + const callbackPromise = callbackFn(); + this.executing.add(callbackPromise); + + callbackPromise.finally(() => { + this.executing.delete(callbackPromise); + this.execute(); + }); + } + } + + this.logCurrentState(); + } + + public addToQueue(fn: () => Promise): void { + this.queue.push(fn); + this.execute(); + } + + public async complete(): Promise { + while (this.executing.size > 0) { + this.logCurrentState(); + await Promise.all(Array.from(this.executing)).catch(() => {}); + } + } + + public getStats(): { pending: number } { + return { + pending: this.queue.length, + }; + } +} diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts index b1ff5e8464a00..bd8ed990bac13 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts @@ -24,6 +24,7 @@ import type { GetPackagePoliciesResponse, PackagePolicy, PostFleetSetupResponse, + CopyAgentPolicyResponse, } from '@kbn/fleet-plugin/common'; import { AGENT_API_ROUTES, @@ -37,6 +38,7 @@ import { epmRouteService, PACKAGE_POLICY_API_ROUTES, SETUP_API_ROUTE, + PACKAGE_POLICY_SAVED_OBJECT_TYPE, } from '@kbn/fleet-plugin/common'; import type { ToolingLog } from '@kbn/tooling-log'; import type { KbnClient } from '@kbn/test'; @@ -54,6 +56,7 @@ import type { GetEnrollmentAPIKeysResponse, GetOutputsResponse, PostAgentUnenrollResponse, + CopyAgentPolicyRequest, } from '@kbn/fleet-plugin/common/types'; import nodeFetch from 'node-fetch'; import semver from 'semver'; @@ -79,6 +82,14 @@ const DEFAULT_AGENT_POLICY_NAME = `${CURRENT_USERNAME} test policy`; /** A Fleet agent policy that includes integrations that don't actually require an agent to run on a host. Example: SenttinelOne */ export const DEFAULT_AGENTLESS_INTEGRATIONS_AGENT_POLICY_NAME = `${CURRENT_USERNAME} - agentless integrations`; +const randomAgentPolicyName = (() => { + let counter = fleetGenerator.randomN(100); + + return (): string => { + return `agent policy - ${fleetGenerator.randomString(10)}_${counter++}`; + }; +})(); + export const checkInFleetAgent = async ( esClient: Client, agentId: string, @@ -753,6 +764,41 @@ export const enrollHostVmWithFleet = async ({ return waitForHostToEnroll(kbnClient, log, hostVm.name, timeoutMs); }; +interface CreateAgentPolicyOptions { + kbnClient: KbnClient; + policy?: CreateAgentPolicyRequest['body']; +} + +/** + * Create a new Agent Policy in fleet + * @param kbnClient + * @param log + * @param policy + */ +export const createAgentPolicy = async ({ + kbnClient, + policy, +}: CreateAgentPolicyOptions): Promise => { + const body: CreateAgentPolicyRequest['body'] = policy ?? { + name: randomAgentPolicyName(), + description: `Policy created by security solution tooling: ${__filename}`, + namespace: 'default', + monitoring_enabled: ['logs', 'metrics'], + }; + + return kbnClient + .request({ + path: AGENT_POLICY_API_ROUTES.CREATE_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, + method: 'POST', + body, + }) + .then((response) => response.data.item) + .catch(catchAxiosErrorFormatAndThrow); +}; + interface GetOrCreateDefaultAgentPolicyOptions { kbnClient: KbnClient; log: ToolingLog; @@ -784,24 +830,15 @@ export const getOrCreateDefaultAgentPolicy = async ({ log.info(`Creating default test/dev Fleet agent policy with name: [${policyName}]`); - const newAgentPolicyData: CreateAgentPolicyRequest['body'] = { - name: policyName, - description: `Policy created by security solution tooling: ${__filename}`, - namespace: 'default', - monitoring_enabled: ['logs', 'metrics'], - }; - - const newAgentPolicy = await kbnClient - .request({ - path: AGENT_POLICY_API_ROUTES.CREATE_PATTERN, - headers: { - 'elastic-api-version': API_VERSIONS.public.v1, - }, - method: 'POST', - body: newAgentPolicyData, - }) - .then((response) => response.data.item) - .catch(catchAxiosErrorFormatAndThrow); + const newAgentPolicy = await createAgentPolicy({ + kbnClient, + policy: { + name: policyName, + description: `Policy created by security solution tooling: ${__filename}`, + namespace: 'default', + monitoring_enabled: ['logs', 'metrics'], + }, + }); log.verbose(newAgentPolicy); @@ -1182,6 +1219,40 @@ export const addEndpointIntegrationToAgentPolicy = async ({ return newIntegrationPolicy; }; +type CopyAgentPolicyOptions = Partial & { + kbnClient: KbnClient; + agentPolicyId: string; +}; + +/** + * Copy (clone) a Fleet Agent Policy + * @param kbnClient + * @param agentPolicyId + * @param name + * @param description + */ +export const copyAgentPolicy = async ({ + kbnClient, + agentPolicyId, + name = randomAgentPolicyName(), + description, +}: CopyAgentPolicyOptions) => { + return kbnClient + .request({ + path: agentPolicyRouteService.getCopyPath(agentPolicyId), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, + method: 'POST', + body: { + name, + description, + }, + }) + .then((response) => response.data.item) + .catch(catchAxiosErrorFormatAndThrow); +}; + /** * Calls the fleet setup API to ensure fleet configured with default settings * @param kbnClient @@ -1205,3 +1276,45 @@ export const ensureFleetSetup = memoize( return setupResponse.data; } ); + +/** + * Fetches a list of Endpoint Integration policies from fleet + * @param kbnClient + * @param kuery + * @param options + */ +export const fetchEndpointIntegrationPolicyList = async ( + kbnClient: KbnClient, + { kuery, ...options }: GetPackagePoliciesRequest['query'] = {} +) => { + const endpointPackageMatchValue = `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name: endpoint`; + + return fetchIntegrationPolicyList(kbnClient, { + ...options, + kuery: kuery ? `${kuery} AND ${endpointPackageMatchValue}` : endpointPackageMatchValue, + }); +}; + +/** + * Retrieves all Endpoint Integration policy IDs - but only up to 10k + * @param kbnClient + */ +export const fetchAllEndpointIntegrationPolicyListIds = async ( + kbnClient: KbnClient +): Promise => { + const perPage = 1000; + const policyIds = []; + let hasMoreData = true; + + do { + const result = await fetchEndpointIntegrationPolicyList(kbnClient, { perPage }); + policyIds.push(...result.items.map((policy) => policy.id)); + + // If no more results or the next page of content goes over 10k, then end loop here. + if (!result.items.length || policyIds.length + perPage < 10000) { + hasMoreData = false; + } + } while (hasMoreData); + + return policyIds; +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/vagrant/Vagrantfile b/x-pack/plugins/security_solution/scripts/endpoint/common/vagrant/Vagrantfile index 31819889f38e0..59c5bf12a1627 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/vagrant/Vagrantfile +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/vagrant/Vagrantfile @@ -33,6 +33,5 @@ Vagrant.configure("2") do |config| config.vm.provision "shell", inline: "mkdir #{agentDestinationFolder}" config.vm.provision "shell", inline: "tar -zxf #{cachedAgentFilename} --directory #{agentDestinationFolder} --strip-components=1 && rm -f #{cachedAgentFilename}" config.vm.provision "shell", inline: "sudo apt-get update" - config.vm.provision "shell", inline: "sudo apt-get upgrade" config.vm.provision "shell", inline: "sudo apt-get install unzip" end diff --git a/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/index.ts b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/index.ts new file mode 100644 index 0000000000000..4de4929b8c4c2 --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/index.ts @@ -0,0 +1,89 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { run } from '@kbn/dev-cli-runner'; +import { HORIZONTAL_LINE } from '../common/constants'; +import { createKbnClient } from '../common/stack_services'; +import { load } from './src/load'; +import { createToolingLogger } from '../../../common/endpoint/data_loaders/utils'; + +export const cli = () => { + run( + async (cliContext) => { + createToolingLogger.setDefaultLogLevelFromCliFlags(cliContext.flags); + + const log = cliContext.log; + const kbnClient = createKbnClient({ + log, + url: cliContext.flags.kibana as string, + username: cliContext.flags.username as string, + password: cliContext.flags.password as string, + noCertForSsl: true, + }); + + const options = { + policyCount: Number(cliContext.flags.policyCount), + trustedAppsCount: Number(cliContext.flags.trustedAppsCount), + eventFiltersCount: Number(cliContext.flags.eventFiltersCount), + blocklistsCount: Number(cliContext.flags.blocklistsCount), + hostIsolationExceptionsCount: Number(cliContext.flags.hostIsolationExceptionsCount), + endpointExceptionsCount: Number(cliContext.flags.endpointExceptionsCount), + globalArtifactRatio: Number(cliContext.flags.globalArtifactRatio), + concurrency: Number(cliContext.flags.concurrency), + }; + + log.info(`${HORIZONTAL_LINE} + Environment Data Loader +${HORIZONTAL_LINE} +`); + log.info(`Loading data to: ${kbnClient.resolveUrl('')}`); + + await load({ + kbnClient, + log, + ...options, + }); + }, + + // Options + { + description: `Loads data into a environment for testing/development`, + flags: { + string: ['kibana', 'username', 'password'], + default: { + kibana: 'http://127.0.0.1:5601', + username: 'elastic', + password: 'changeme', + policyCount: 10, + trustedAppsCount: 10, + eventFiltersCount: 10, + blocklistsCount: 10, + hostIsolationExceptionsCount: 10, + endpointExceptionsCount: 10, + globalArtifactRatio: 50, + concurrency: 10, + }, + allowUnexpected: false, + help: ` + --username User name to be used for auth against elasticsearch and + kibana (Default: elastic). + --password User name Password (Default: changeme) + --kibana The url to Kibana (Default: http://127.0.0.1:5601) + --policyCount How many policies to create (Default: 10) + --trustedAppsCount How many Trusted Applications to create (Default: 10) + --eventFiltersCount How many Event Filters to create (Default: 10) + --blocklistsCount How many Blocklists to create (Default: 10) + --hostIsolationExceptionsCount How many Host Isolation Exceptions to create (Default: 10) + --endpointExceptionsCount How many Endpoint Exceptions to create (Default: 10) + --globalArtifactRatio The percentage ratio of all artifacts that should be global + rather than per-policy. (Default: 50) + --concurrency The max number of request to process in parallel. (Default: 10) + `, + }, + } + ); +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/create_artifacts.ts b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/create_artifacts.ts new file mode 100644 index 0000000000000..234c884f58c65 --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/create_artifacts.ts @@ -0,0 +1,296 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { KbnClient } from '@kbn/test'; +import type { ToolingLog } from '@kbn/tooling-log'; +import { BaseDataGenerator } from '../../../../common/endpoint/data_generators/base_data_generator'; +import type { NewTrustedApp } from '../../../../common/endpoint/types'; +import { stringify } from '../../../../server/endpoint/utils/stringify'; +import { EndpointExceptionsGenerator } from '../../../../common/endpoint/data_generators/endpoint_exceptions_generator'; +import { + BY_POLICY_ARTIFACT_TAG_PREFIX, + GLOBAL_ARTIFACT_TAG, +} from '../../../../common/endpoint/service/artifacts'; +import { ExceptionsListItemGenerator } from '../../../../common/endpoint/data_generators/exceptions_list_item_generator'; +import type { ExecutionThrottler } from '../../common/execution_throttler'; +import { EventFiltersGenerator } from '../../../../common/endpoint/data_generators/event_filters_generator'; +import { TrustedAppGenerator } from '../../../../common/endpoint/data_generators/trusted_app_generator'; +import { + createBlocklist, + createEventFilter, + createHostIsolationException, + createTrustedApp, +} from '../../common/endpoint_artifact_services'; +import type { ReportProgressCallback } from './types'; +import { loop } from './utils'; + +interface ArtifactCreationOptions { + kbnClient: KbnClient; + log: ToolingLog; + count: number; + policyIds: string[]; + reportProgress: ReportProgressCallback; + globalArtifactRatio: number; + throttler: ExecutionThrottler; +} + +// Class instance that exposes protected methods for use locally in this module +const gen = new (class extends BaseDataGenerator { + public randomArray(lengthLimit: number, generator: () => T): T[] { + return super.randomArray(lengthLimit, generator); + } + + public randomChoice(choices: T[] | readonly T[]): T { + return super.randomChoice(choices); + } +})(); + +const generatePerPolicyEffectiveScope = (policyIds: string[]): string[] => { + return gen.randomArray( + gen.randomN(Math.min(100, policyIds.length)), + () => `${BY_POLICY_ARTIFACT_TAG_PREFIX}${gen.randomChoice(policyIds)}` + ); +}; + +const logError = (log: ToolingLog, artifactType: string, error: Error) => { + log.error(`[${artifactType}] error: ${error.message}`); + log.verbose(stringify(error)); +}; + +const calculateGlobalAndPerPolicyCounts = ( + total: number, + globalRatio: number +): { global: number; perPolicy: number } => { + const response = { + global: 0, + perPolicy: 0, + }; + + response.global = Math.floor(total * (globalRatio / 100)); + + // If a ratio was defined, then ensure at least one is created + if (globalRatio > 0 && response.global === 0) { + response.global = 1; + } + + response.perPolicy = total - response.global; + + return response; +}; + +export const createTrustedApps = async ({ + kbnClient, + log, + count, + reportProgress, + throttler, + globalArtifactRatio, + policyIds, +}: ArtifactCreationOptions): Promise => { + const generator = new TrustedAppGenerator(); + const { global: globalCount, perPolicy } = calculateGlobalAndPerPolicyCounts( + count, + globalArtifactRatio + ); + let globalDone = 0; + let doneCount = 0; + let errorCount = 0; + + log.info(`Trusted Apps: Creating ${globalCount} global and ${perPolicy} per-policy artifacts`); + + loop(count, () => { + throttler.addToQueue(async () => { + let effectScope: NewTrustedApp['effectScope'] = { type: 'global' }; + + if (globalDone < globalCount) { + globalDone++; + } else { + effectScope = { + type: 'policy', + policies: gen.randomArray(gen.randomN(Math.min(100, policyIds.length)), () => + gen.randomChoice(policyIds) + ), + }; + } + + await createTrustedApp( + kbnClient, + generator.generateTrustedAppForCreate({ + effectScope, + }) + ) + .catch((e) => { + errorCount++; + logError(log, 'Trusted Application', e); + }) + .finally(() => { + doneCount++; + reportProgress({ doneCount, errorCount }); + }); + }); + }); +}; + +export const createEventFilters = async ({ + kbnClient, + log, + count, + reportProgress, + throttler, + globalArtifactRatio, + policyIds, +}: ArtifactCreationOptions): Promise => { + const eventGenerator = new EventFiltersGenerator(); + const { global: globalCount, perPolicy } = calculateGlobalAndPerPolicyCounts( + count, + globalArtifactRatio + ); + let globalDone = 0; + let doneCount = 0; + let errorCount = 0; + + log.info(`Event Filters: Creating ${globalCount} global and ${perPolicy} per-policy artifacts`); + + loop(count, () => { + throttler.addToQueue(async () => { + let tags = [GLOBAL_ARTIFACT_TAG]; + + if (globalDone < globalCount) { + globalDone++; + } else { + tags = generatePerPolicyEffectiveScope(policyIds); + } + + await createEventFilter(kbnClient, eventGenerator.generateEventFilterForCreate({ tags })) + .catch((e) => { + errorCount++; + logError(log, 'Event Filter', e); + }) + .finally(() => { + doneCount++; + reportProgress({ doneCount, errorCount }); + }); + }); + }); +}; + +export const createBlocklists = async ({ + kbnClient, + log, + count, + reportProgress, + throttler, + policyIds, + globalArtifactRatio, +}: ArtifactCreationOptions): Promise => { + const generate = new ExceptionsListItemGenerator(); + const { global: globalCount, perPolicy } = calculateGlobalAndPerPolicyCounts( + count, + globalArtifactRatio + ); + let globalDone = 0; + let doneCount = 0; + let errorCount = 0; + + log.info(`Blocklists: Creating ${globalCount} global and ${perPolicy} per-policy artifacts`); + + loop(count, () => { + throttler.addToQueue(async () => { + let tags = [GLOBAL_ARTIFACT_TAG]; + + if (globalDone < globalCount) { + globalDone++; + } else { + tags = generatePerPolicyEffectiveScope(policyIds); + } + + await createBlocklist(kbnClient, generate.generateBlocklistForCreate({ tags })) + .catch((e) => { + errorCount++; + logError(log, 'BLocklist', e); + }) + .finally(() => { + doneCount++; + reportProgress({ doneCount, errorCount }); + }); + }); + }); +}; + +export const createHostIsolationExceptions = async ({ + kbnClient, + log, + count, + reportProgress, + throttler, + globalArtifactRatio, + policyIds, +}: ArtifactCreationOptions): Promise => { + const generate = new ExceptionsListItemGenerator(); + const { global: globalCount, perPolicy } = calculateGlobalAndPerPolicyCounts( + count, + globalArtifactRatio + ); + let globalDone = 0; + let doneCount = 0; + let errorCount = 0; + + log.info( + `Host Isolation Exceptions: Creating ${globalCount} global and ${perPolicy} per-policy artifacts` + ); + + loop(count, () => { + throttler.addToQueue(async () => { + let tags = [GLOBAL_ARTIFACT_TAG]; + + if (globalDone < globalCount) { + globalDone++; + } else { + tags = generatePerPolicyEffectiveScope(policyIds); + } + + await createHostIsolationException( + kbnClient, + generate.generateHostIsolationExceptionForCreate({ tags }) + ) + .catch((e) => { + errorCount++; + logError(log, 'Host Isolation Exception', e); + }) + .finally(() => { + doneCount++; + reportProgress({ doneCount, errorCount }); + }); + }); + }); +}; + +export const createEndpointExceptions = async ({ + kbnClient, + log, + count, + reportProgress, + throttler, +}: ArtifactCreationOptions): Promise => { + const generate = new EndpointExceptionsGenerator(); + let doneCount = 0; + let errorCount = 0; + + loop(count, () => { + throttler.addToQueue(async () => { + await createHostIsolationException(kbnClient, generate.generateEndpointExceptionForCreate()) + .catch((e) => { + errorCount++; + logError(log, 'Endpoint Exception', e); + }) + .finally(() => { + doneCount++; + reportProgress({ doneCount, errorCount }); + }); + }); + }); +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/create_policies.ts b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/create_policies.ts new file mode 100644 index 0000000000000..7be6fc345af5a --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/create_policies.ts @@ -0,0 +1,89 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { KbnClient } from '@kbn/test'; +import type { ToolingLog } from '@kbn/tooling-log'; +import { loop } from './utils'; +import type { ExecutionThrottler } from '../../common/execution_throttler'; +import { + addEndpointIntegrationToAgentPolicy, + copyAgentPolicy, + createAgentPolicy, +} from '../../common/fleet_services'; +import type { ReportProgressCallback } from './types'; + +interface CreatePoliciesOptions { + kbnClient: KbnClient; + log: ToolingLog; + count: number; + reportProgress: ReportProgressCallback; + throttler: ExecutionThrottler; +} + +export const createPolicies = async ({ + kbnClient, + count, + reportProgress, + log, + throttler, +}: CreatePoliciesOptions): Promise => { + const endpointIntegrationPolicyIds: string[] = []; + const errors: Error[] = []; + let doneCount = 0; + + log.verbose(`creating [${count}] policies in fleet`); + + // Create first policy with endpoint + const agentPolicyId = (await createAgentPolicy({ kbnClient })).id; + const endpointPolicy = await addEndpointIntegrationToAgentPolicy({ + kbnClient, + log, + agentPolicyId, + name: `endpoint protect policy (${Math.random().toString(32).substring(2)})`, + }); + + endpointIntegrationPolicyIds.push(endpointPolicy.id); + doneCount++; + reportProgress({ doneCount, errorCount: errors.length }); + + // TODO:PT maybe use ES bulk create and bypass fleet so that we speed this up? + + loop(count - 1, () => { + throttler.addToQueue(async () => { + await copyAgentPolicy({ kbnClient, agentPolicyId }) + .then((response) => { + if (response.package_policies?.[0]) { + endpointIntegrationPolicyIds.push(response.package_policies[0].id); + } else { + errors.push( + new Error( + `Copy of agent policy [${agentPolicyId}] did not copy the Endpoint Integration!` + ) + ); + } + }) + .catch((e) => { + errors.push(e); + }) + .finally(() => { + doneCount++; + reportProgress({ doneCount, errorCount: errors.length }); + }); + }); + }); + + await throttler.complete(); + + if (errors.length) { + log.error( + `${errors.length} errors encountered while trying to create policies. First error: ${errors[0].message}` + ); + log.verbose(...errors); + } + + return endpointIntegrationPolicyIds; +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/load.ts b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/load.ts new file mode 100644 index 0000000000000..066aacc97742c --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/load.ts @@ -0,0 +1,149 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ToolingLog } from '@kbn/tooling-log'; +import type { KbnClient } from '@kbn/test'; +import { fetchAllEndpointIntegrationPolicyListIds } from '../../common/fleet_services'; +import { ExecutionThrottler } from '../../common/execution_throttler'; +import { + createBlocklists, + createEndpointExceptions, + createEventFilters, + createHostIsolationExceptions, + createTrustedApps, +} from './create_artifacts'; +import { installOrUpgradeEndpointFleetPackage } from '../../../../common/endpoint/data_loaders/setup_fleet_for_endpoint'; +import { ProgressReporter } from './progress_reporter'; +import type { ProgressReporterInterface } from './types'; +import { createPolicies } from './create_policies'; +import { createToolingLogger } from '../../../../common/endpoint/data_loaders/utils'; + +interface LoadOptions { + kbnClient: KbnClient; + log?: ToolingLog; + policyCount: number; + trustedAppsCount: number; + eventFiltersCount: number; + blocklistsCount: number; + hostIsolationExceptionsCount: number; + endpointExceptionsCount: number; + globalArtifactRatio: number; + concurrency: number; +} + +export const load = async ({ + kbnClient, + log = createToolingLogger(), + policyCount, + trustedAppsCount, + eventFiltersCount, + blocklistsCount, + hostIsolationExceptionsCount, + endpointExceptionsCount, + globalArtifactRatio, + concurrency, +}: LoadOptions) => { + const throttler = new ExecutionThrottler({ log, concurrency }); + const reportProgress: ProgressReporterInterface = new ProgressReporter({ + reportStatus: (status) => { + const now = new Date(); + + log.info(`__ +Status at: ${now.toString()} +${status}\nRequests pending: ${throttler.getStats().pending} + +`); + }, + }); + const policyReporter = reportProgress.addCategory('policies', policyCount); + const trustedAppsReporter = reportProgress.addCategory('trusted apps', trustedAppsCount); + const eventFiltersReporter = reportProgress.addCategory('event filters', eventFiltersCount); + const blocklistsReporter = reportProgress.addCategory('blocklists', blocklistsCount); + const hostIsolationExceptionsReporter = reportProgress.addCategory( + 'host isolation exceptions', + hostIsolationExceptionsCount + ); + const endpointExceptionsReporter = reportProgress.addCategory( + 'endpoint exceptions', + endpointExceptionsCount + ); + + // Ensure fleet is setup with endpoint (which also creates the DS/Transforms, etc) + await installOrUpgradeEndpointFleetPackage(kbnClient, log); + + const endpointPolicyIds = policyCount + ? await createPolicies({ + kbnClient, + log, + count: policyCount, + reportProgress: policyReporter, + throttler, + }) + : await fetchAllEndpointIntegrationPolicyListIds(kbnClient); + + log?.verbose(`Policy IDs:\n${endpointPolicyIds.join('\n')}`); + + await Promise.all([ + trustedAppsCount && + createTrustedApps({ + kbnClient, + log, + reportProgress: trustedAppsReporter, + count: trustedAppsCount, + policyIds: endpointPolicyIds, + globalArtifactRatio, + throttler, + }), + + eventFiltersCount && + createEventFilters({ + kbnClient, + log, + reportProgress: eventFiltersReporter, + count: eventFiltersCount, + policyIds: endpointPolicyIds, + globalArtifactRatio, + throttler, + }), + + blocklistsCount && + createBlocklists({ + kbnClient, + log, + reportProgress: blocklistsReporter, + count: blocklistsCount, + policyIds: endpointPolicyIds, + globalArtifactRatio, + throttler, + }), + + hostIsolationExceptionsCount && + createHostIsolationExceptions({ + kbnClient, + log, + reportProgress: hostIsolationExceptionsReporter, + count: hostIsolationExceptionsCount, + policyIds: endpointPolicyIds, + globalArtifactRatio, + throttler, + }), + + endpointExceptionsCount && + createEndpointExceptions({ + kbnClient, + log, + reportProgress: endpointExceptionsReporter, + count: endpointExceptionsCount, + policyIds: endpointPolicyIds, + globalArtifactRatio, + throttler, + }), + ]); + + await throttler.complete(); + reportProgress.stopReporting(); +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/progress_reporter.ts b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/progress_reporter.ts new file mode 100644 index 0000000000000..cc26321047979 --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/progress_reporter.ts @@ -0,0 +1,181 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { once } from 'lodash'; +import { HORIZONTAL_LINE } from '../../common/constants'; +import { getElapsedTime } from '../../../../common/endpoint/data_loaders/utils'; +import type { + ProgressReporterInterface, + ProgressReporterState, + ReportProgressCallback, +} from './types'; + +const NOOP = () => {}; + +interface ProgressReporterOptions { + /** + * If defined, this callback to be used in reporting status on an interval until + * the `doneCount` reaches the `totalCount` of all categories + * @param status + */ + reportStatus?: (status: string) => void; +} + +export class ProgressReporter implements ProgressReporterInterface { + private readonly reportIntervalMs = 20000; + private readonly startedAt: Date = new Date(); + private categories: Record< + string, + { totalCount: number; doneCount: number; errorCount: number } + > = {}; + private stopReportingLoop: () => void = NOOP; + + constructor(private readonly options: ProgressReporterOptions = {}) { + if (options.reportStatus) { + this.startReporting(); + } + } + + public startReporting() { + this.stopReportingLoop(); + + if (!this.options.reportStatus) { + return; + } + + const setIntId = setInterval(() => { + if (this.options.reportStatus) { + this.options.reportStatus(this.getStatus()); + + if (this.getState().prctDone === 100) { + this.stopReportingLoop(); + } + } + }, this.reportIntervalMs); + + const exitEvCallback = () => this.stopReportingLoop(); + + this.stopReportingLoop = once(() => { + clearInterval(setIntId); + process.off('exit', exitEvCallback); + }); + + process.on('exit', exitEvCallback); + } + + stopReporting() { + this.stopReportingLoop(); + + if (this.options.reportStatus) { + this.options.reportStatus(this.getStatus()); + } + } + + addCategory(name: string, totalCount: number): ReportProgressCallback { + this.categories[name] = { + totalCount, + doneCount: 0, + errorCount: 0, + }; + + this.startReporting(); + return this.getReporter(name); + } + + getReporter(categoryName: string): ReportProgressCallback { + if (!this.categories[categoryName]) { + throw new Error(`category name [${categoryName}] has not known`); + } + + return (options) => { + this.categories[categoryName].doneCount = options.doneCount; + }; + } + + getState(): ProgressReporterState { + const state: ProgressReporterState = { + prctDone: 0, + totalCount: 0, + doneCount: 0, + errorCount: 0, + categories: {}, + }; + + Object.entries(this.categories).forEach( + ([ + categoryName, + { + totalCount: thisCategoryTotalCount, + doneCount: thisCategoryDoneCount, + errorCount: thisCategoryErrorCount, + }, + ]) => { + state.totalCount += thisCategoryTotalCount; + state.doneCount += thisCategoryDoneCount; + state.errorCount += thisCategoryErrorCount; + + state.categories[categoryName] = { + totalCount: thisCategoryTotalCount, + doneCount: thisCategoryDoneCount, + errorCount: thisCategoryErrorCount, + prctDone: calculatePercentage(thisCategoryTotalCount, thisCategoryDoneCount), + }; + } + ); + + state.prctDone = calculatePercentage(state.totalCount, state.doneCount); + + return state; + } + + getStatus(): string { + const state = this.getState(); + const categoryNamesMaxChr = + Object.keys(state.categories).reduce((acc, categoryName) => { + return Math.max(acc, categoryName.length); + }, 10) + 4; + + return `${HORIZONTAL_LINE} +${'Overall Progress: '.padEnd(categoryNamesMaxChr + 4)}${state.prctDone}% +${HORIZONTAL_LINE} +${ + 'Elapsed Time (hh:mm:ss.ms):'.padEnd(categoryNamesMaxChr + 4) + + getElapsedTime(this.getStartedTime()) +} +${'Error Count:'.padEnd(categoryNamesMaxChr + 4) + state.errorCount} +Details: + ${Object.entries(state.categories).reduce((acc, [categoryName, categoryState]) => { + let updatedOutput = acc; + + if (updatedOutput.length) { + updatedOutput += `\n `; + } + + updatedOutput += `${`${`${categoryName}:` + .concat(' '.repeat(categoryNamesMaxChr)) + .substring(0, categoryNamesMaxChr)} ${categoryState.prctDone}%`.padEnd( + categoryNamesMaxChr + 10 + )}(${categoryState.doneCount} / ${categoryState.totalCount}, ${ + categoryState.errorCount + } errors)`; + + return updatedOutput; + }, '')}`; + } + + getStartedTime(): Date { + return new Date(this.startedAt); + } +} + +const calculatePercentage = (totalCount: number, doneCount: number): number => { + if (totalCount <= 0 || doneCount <= 0) { + return 0; + } + + return Math.min(100, Number(((doneCount / totalCount) * 100).toPrecision(3))); +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/types.ts b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/types.ts new file mode 100644 index 0000000000000..ad2be28fdf573 --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/types.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export type ReportProgressCallback = (options: { doneCount: number; errorCount: number }) => void; + +interface ProgressReporterStateProperties { + prctDone: number; + totalCount: number; + doneCount: number; + errorCount: number; +} + +export interface ProgressReporterState extends ProgressReporterStateProperties { + categories: Record; +} + +export interface ProgressReporterInterface { + addCategory(name: string, totalCount: number): ReportProgressCallback; + + getReporter(categoryName: string): ReportProgressCallback; + + getState(): ProgressReporterState; + + getStatus(): string; + + getStartedTime(): Date; + + startReporting(): void; + + stopReporting(): void; +} diff --git a/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/utils.ts b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/utils.ts new file mode 100644 index 0000000000000..5993849e97583 --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/utils.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const loop = (count: number, callback: (instance: number) => any): void => { + let done = 1; + + while (done <= count) { + try { + callback(done++); + } catch { + return; + } + } +}; diff --git a/x-pack/plugins/security_solution/public/timelines/store/my_epic_timeline_id.ts b/x-pack/plugins/security_solution/scripts/endpoint/load_env_data.js similarity index 67% rename from x-pack/plugins/security_solution/public/timelines/store/my_epic_timeline_id.ts rename to x-pack/plugins/security_solution/scripts/endpoint/load_env_data.js index 9c5125712707e..6568d3465432f 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/my_epic_timeline_id.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/load_env_data.js @@ -5,6 +5,5 @@ * 2.0. */ -import { ManageEpicTimelineId } from './manage_timeline_id'; - -export const myEpicTimelineId = new ManageEpicTimelineId(); +require('../../../../../src/setup_node_env'); +require('./env_data_loader').cli(); diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts b/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts index 0c573b561479f..6e18765c041cf 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts @@ -298,7 +298,7 @@ function responseActionRequestHandler { return pathNameSerialized.startsWith(prepend('/app/dev_tools')); }, - spaceBefore: 'l', + spaceBefore: 'm', }, { link: 'discover', diff --git a/x-pack/plugins/synthetics/server/routes/create_route_with_auth.test.ts b/x-pack/plugins/synthetics/server/routes/create_route_with_auth.test.ts new file mode 100644 index 0000000000000..36262e2402b8e --- /dev/null +++ b/x-pack/plugins/synthetics/server/routes/create_route_with_auth.test.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createSyntheticsRouteWithAuth } from './create_route_with_auth'; + +describe('createSyntheticsRouteWithAuth', () => { + it('should create a route with auth', () => { + const route = createSyntheticsRouteWithAuth(() => ({ + method: 'GET', + path: '/foo', + validate: {}, + handler: async () => { + return { success: true }; + }, + })); + + expect(route).toEqual({ + method: 'GET', + path: '/foo', + validate: {}, + handler: expect.any(Function), + writeAccess: false, + }); + }); + + it.each([['POST'], ['PUT'], ['DELETE']])( + 'requires write permissions for %s requests', + (method) => { + if (method !== 'POST' && method !== 'PUT' && method !== 'DELETE') + throw Error('Invalid method'); + const route = createSyntheticsRouteWithAuth(() => ({ + method, + path: '/foo', + validate: {}, + handler: async () => { + return { success: true }; + }, + })); + + expect(route).toEqual({ + method, + path: '/foo', + validate: {}, + handler: expect.any(Function), + writeAccess: true, + }); + } + ); + + it.each([['POST'], ['PUT'], ['DELETE']])( + 'allows write access override for %s requests', + (method) => { + if (method !== 'POST' && method !== 'PUT' && method !== 'DELETE') + throw Error('Invalid method'); + const route = createSyntheticsRouteWithAuth(() => ({ + method, + path: '/foo', + validate: {}, + handler: async () => { + return { success: true }; + }, + writeAccessOverride: true, + })); + + expect(route).toEqual({ + method, + path: '/foo', + validate: {}, + handler: expect.any(Function), + writeAccess: undefined, + }); + } + ); +}); diff --git a/x-pack/plugins/synthetics/server/routes/create_route_with_auth.ts b/x-pack/plugins/synthetics/server/routes/create_route_with_auth.ts index af9a308d2ac63..f4fb413011614 100644 --- a/x-pack/plugins/synthetics/server/routes/create_route_with_auth.ts +++ b/x-pack/plugins/synthetics/server/routes/create_route_with_auth.ts @@ -13,11 +13,18 @@ import { } from '../../common/constants'; import { SyntheticsRestApiRouteFactory, SyntheticsRoute, SyntheticsRouteHandler } from './types'; +function getWriteAccessFlag(method: string, writeAccessOverride?: boolean, writeAccess?: boolean) { + // if route includes an override, skip write-only access with `undefined` + // otherwise, if route is not a GET, require write access + // if route is get, use writeAccess value with `false` as default + return writeAccessOverride === true ? undefined : method !== 'GET' ? true : writeAccess ?? false; +} + export const createSyntheticsRouteWithAuth = ( routeCreator: SyntheticsRestApiRouteFactory ): SyntheticsRoute => { const restRoute = routeCreator(); - const { handler, method, path, options, ...rest } = restRoute; + const { handler, method, path, options, writeAccess, writeAccessOverride, ...rest } = restRoute; const licenseCheckHandler: SyntheticsRouteHandler = async ({ context, response, @@ -49,6 +56,7 @@ export const createSyntheticsRouteWithAuth = ( options, handler: licenseCheckHandler, ...rest, + writeAccess: getWriteAccessFlag(method, writeAccessOverride, writeAccess), }; }; diff --git a/x-pack/plugins/synthetics/server/routes/default_alerts/enable_default_alert.ts b/x-pack/plugins/synthetics/server/routes/default_alerts/enable_default_alert.ts index 49481a4347a1d..db403bd6bcd54 100644 --- a/x-pack/plugins/synthetics/server/routes/default_alerts/enable_default_alert.ts +++ b/x-pack/plugins/synthetics/server/routes/default_alerts/enable_default_alert.ts @@ -13,7 +13,6 @@ export const enableDefaultAlertingRoute: SyntheticsRestApiRouteFactory = () => ( method: 'POST', path: SYNTHETICS_API_URLS.ENABLE_DEFAULT_ALERTING, validate: {}, - writeAccess: true, handler: async ({ context, server, savedObjectsClient }): Promise => { const defaultAlertService = new DefaultAlertService(context, server, savedObjectsClient); diff --git a/x-pack/plugins/synthetics/server/routes/default_alerts/update_default_alert.ts b/x-pack/plugins/synthetics/server/routes/default_alerts/update_default_alert.ts index 765ba5edefb95..bef006d02b87e 100644 --- a/x-pack/plugins/synthetics/server/routes/default_alerts/update_default_alert.ts +++ b/x-pack/plugins/synthetics/server/routes/default_alerts/update_default_alert.ts @@ -13,7 +13,6 @@ export const updateDefaultAlertingRoute: SyntheticsRestApiRouteFactory = () => ( method: 'PUT', path: SYNTHETICS_API_URLS.ENABLE_DEFAULT_ALERTING, validate: {}, - writeAccess: true, handler: async ({ context, server, savedObjectsClient }): Promise => { const defaultAlertService = new DefaultAlertService(context, server, savedObjectsClient); diff --git a/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor.ts b/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor.ts index 3db44c1a6c0c4..f158ea58b19a3 100644 --- a/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor.ts +++ b/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor.ts @@ -50,7 +50,6 @@ export const addSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () => ({ gettingStarted: schema.maybe(schema.boolean()), }), }, - writeAccess: true, handler: async (routeContext): Promise => { const { request, response, savedObjectsClient, server } = routeContext; // usually id is auto generated, but this is useful for testing diff --git a/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor_project.ts b/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor_project.ts index 1fb924a57a56e..75427a22aced2 100644 --- a/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor_project.ts +++ b/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor_project.ts @@ -31,7 +31,6 @@ export const addSyntheticsProjectMonitorRoute: SyntheticsRestApiRouteFactory = ( maxBytes: MAX_PAYLOAD_SIZE, }, }, - writeAccess: true, handler: async (routeContext): Promise => { const { request, response, server } = routeContext; const { projectName } = request.params; diff --git a/x-pack/plugins/synthetics/server/routes/monitor_cruds/delete_monitor.ts b/x-pack/plugins/synthetics/server/routes/monitor_cruds/delete_monitor.ts index 0d5825dbbdd3f..91e08081fbf7d 100644 --- a/x-pack/plugins/synthetics/server/routes/monitor_cruds/delete_monitor.ts +++ b/x-pack/plugins/synthetics/server/routes/monitor_cruds/delete_monitor.ts @@ -34,7 +34,6 @@ export const deleteSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () => monitorId: schema.string({ minLength: 1, maxLength: 1024 }), }), }, - writeAccess: true, handler: async (routeContext): Promise => { const { request, response } = routeContext; const { monitorId } = request.params; diff --git a/x-pack/plugins/synthetics/server/routes/monitor_cruds/edit_monitor.ts b/x-pack/plugins/synthetics/server/routes/monitor_cruds/edit_monitor.ts index d9e9b918e3fff..8d64c95ab6e8c 100644 --- a/x-pack/plugins/synthetics/server/routes/monitor_cruds/edit_monitor.ts +++ b/x-pack/plugins/synthetics/server/routes/monitor_cruds/edit_monitor.ts @@ -42,7 +42,6 @@ export const editSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () => ( }), body: schema.any(), }, - writeAccess: true, handler: async (routeContext): Promise => { const { request, response, savedObjectsClient, server } = routeContext; const { logger } = server; diff --git a/x-pack/plugins/synthetics/server/routes/monitor_cruds/inspect_monitor.ts b/x-pack/plugins/synthetics/server/routes/monitor_cruds/inspect_monitor.ts index 78f445190d2e9..9d9c6d898138b 100644 --- a/x-pack/plugins/synthetics/server/routes/monitor_cruds/inspect_monitor.ts +++ b/x-pack/plugins/synthetics/server/routes/monitor_cruds/inspect_monitor.ts @@ -25,7 +25,6 @@ export const inspectSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () = hideParams: schema.maybe(schema.boolean()), }), }, - writeAccess: true, handler: async (routeContext): Promise => { const { savedObjectsClient, server, syntheticsMonitorClient, request, spaceId, response } = routeContext; diff --git a/x-pack/plugins/synthetics/server/routes/pings/journey_screenshot_blocks.ts b/x-pack/plugins/synthetics/server/routes/pings/journey_screenshot_blocks.ts index a8f282330c893..f75a92ea555d8 100644 --- a/x-pack/plugins/synthetics/server/routes/pings/journey_screenshot_blocks.ts +++ b/x-pack/plugins/synthetics/server/routes/pings/journey_screenshot_blocks.ts @@ -22,6 +22,7 @@ export const createJourneyScreenshotBlocksRoute: SyntheticsRestApiRouteFactory = hashes: schema.arrayOf(schema.string()), }), }, + writeAccessOverride: true, handler: async (routeProps) => { return await journeyScreenshotBlocksHandler(routeProps); }, diff --git a/x-pack/plugins/synthetics/server/routes/settings/params/add_param.ts b/x-pack/plugins/synthetics/server/routes/settings/params/add_param.ts index 9e26666ed30d9..a51079f366eff 100644 --- a/x-pack/plugins/synthetics/server/routes/settings/params/add_param.ts +++ b/x-pack/plugins/synthetics/server/routes/settings/params/add_param.ts @@ -37,7 +37,6 @@ export const addSyntheticsParamsRoute: SyntheticsRestApiRouteFactory< body: schema.oneOf([ParamsObjectSchema, schema.arrayOf(ParamsObjectSchema)]), }, }, - writeAccess: true, handler: async ({ request, response, server, savedObjectsClient }) => { try { const { id: spaceId } = (await server.spaces?.spacesService.getActiveSpace(request)) ?? { diff --git a/x-pack/plugins/synthetics/server/routes/settings/params/delete_param.ts b/x-pack/plugins/synthetics/server/routes/settings/params/delete_param.ts index f0f377ce82d9e..78d24d9452ae9 100644 --- a/x-pack/plugins/synthetics/server/routes/settings/params/delete_param.ts +++ b/x-pack/plugins/synthetics/server/routes/settings/params/delete_param.ts @@ -27,7 +27,6 @@ export const deleteSyntheticsParamsRoute: SyntheticsRestApiRouteFactory< }), }, }, - writeAccess: true, handler: async ({ savedObjectsClient, request }) => { const { ids } = request.body; diff --git a/x-pack/plugins/synthetics/server/routes/settings/params/edit_param.ts b/x-pack/plugins/synthetics/server/routes/settings/params/edit_param.ts index cd1b0731eedb0..3555963b76bf1 100644 --- a/x-pack/plugins/synthetics/server/routes/settings/params/edit_param.ts +++ b/x-pack/plugins/synthetics/server/routes/settings/params/edit_param.ts @@ -38,7 +38,6 @@ export const editSyntheticsParamsRoute: SyntheticsRestApiRouteFactory< }), }, }, - writeAccess: true, handler: async ({ savedObjectsClient, request, server, response }) => { try { const { id: _spaceId } = (await server.spaces?.spacesService.getActiveSpace(request)) ?? { diff --git a/x-pack/plugins/synthetics/server/routes/settings/private_locations/add_private_location.ts b/x-pack/plugins/synthetics/server/routes/settings/private_locations/add_private_location.ts index e541ec88ae861..ac6eff7dea90d 100644 --- a/x-pack/plugins/synthetics/server/routes/settings/private_locations/add_private_location.ts +++ b/x-pack/plugins/synthetics/server/routes/settings/private_locations/add_private_location.ts @@ -40,7 +40,6 @@ export const addPrivateLocationRoute: SyntheticsRestApiRouteFactory { const location = request.body as PrivateLocationObject; diff --git a/x-pack/plugins/synthetics/server/routes/settings/private_locations/delete_private_location.ts b/x-pack/plugins/synthetics/server/routes/settings/private_locations/delete_private_location.ts index 75dd92d9c7f68..1c6ede5a2ad00 100644 --- a/x-pack/plugins/synthetics/server/routes/settings/private_locations/delete_private_location.ts +++ b/x-pack/plugins/synthetics/server/routes/settings/private_locations/delete_private_location.ts @@ -28,7 +28,6 @@ export const deletePrivateLocationRoute: SyntheticsRestApiRouteFactory { const { locationId } = request.params as { locationId: string }; diff --git a/x-pack/plugins/synthetics/server/routes/settings/sync_global_params.ts b/x-pack/plugins/synthetics/server/routes/settings/sync_global_params.ts index 4064a706c6a39..de9111ea00b19 100644 --- a/x-pack/plugins/synthetics/server/routes/settings/sync_global_params.ts +++ b/x-pack/plugins/synthetics/server/routes/settings/sync_global_params.ts @@ -14,7 +14,6 @@ export const syncParamsSyntheticsParamsRoute: SyntheticsRestApiRouteFactory = () method: 'GET', path: SYNTHETICS_API_URLS.SYNC_GLOBAL_PARAMS, validate: {}, - writeAccess: true, handler: async ({ savedObjectsClient, syntheticsMonitorClient, diff --git a/x-pack/plugins/synthetics/server/routes/synthetics_service/enablement.ts b/x-pack/plugins/synthetics/server/routes/synthetics_service/enablement.ts index 0aae10b340e8c..5124df7af6ce0 100644 --- a/x-pack/plugins/synthetics/server/routes/synthetics_service/enablement.ts +++ b/x-pack/plugins/synthetics/server/routes/synthetics_service/enablement.ts @@ -16,6 +16,7 @@ import { export const getSyntheticsEnablementRoute: SyntheticsRestApiRouteFactory = () => ({ method: 'PUT', path: SYNTHETICS_API_URLS.SYNTHETICS_ENABLEMENT, + writeAccessOverride: true, validate: {}, handler: async ({ savedObjectsClient, request, server }): Promise => { try { diff --git a/x-pack/plugins/synthetics/server/routes/synthetics_service/run_once_monitor.ts b/x-pack/plugins/synthetics/server/routes/synthetics_service/run_once_monitor.ts index edc9ccc3b71e6..e1ddceb4e5b7c 100644 --- a/x-pack/plugins/synthetics/server/routes/synthetics_service/run_once_monitor.ts +++ b/x-pack/plugins/synthetics/server/routes/synthetics_service/run_once_monitor.ts @@ -22,7 +22,6 @@ export const runOnceSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () = monitorId: schema.string({ minLength: 1, maxLength: 1024 }), }), }, - writeAccess: true, handler: async ({ request, response, diff --git a/x-pack/plugins/synthetics/server/routes/synthetics_service/test_now_monitor.ts b/x-pack/plugins/synthetics/server/routes/synthetics_service/test_now_monitor.ts index 8434d909f2c2f..08c4f8dbebb3c 100644 --- a/x-pack/plugins/synthetics/server/routes/synthetics_service/test_now_monitor.ts +++ b/x-pack/plugins/synthetics/server/routes/synthetics_service/test_now_monitor.ts @@ -23,7 +23,6 @@ export const testNowMonitorRoute: SyntheticsRestApiRouteFactory monitorId: schema.string({ minLength: 1, maxLength: 1024 }), }), }, - writeAccess: true, handler: async (routeContext) => { const { monitorId } = routeContext.request.params; return triggerTestNow(monitorId, routeContext); diff --git a/x-pack/plugins/synthetics/server/routes/types.ts b/x-pack/plugins/synthetics/server/routes/types.ts index 7224a6a9e7f5a..4d27206a16f0e 100644 --- a/x-pack/plugins/synthetics/server/routes/types.ts +++ b/x-pack/plugins/synthetics/server/routes/types.ts @@ -32,6 +32,7 @@ export type SyntheticsRequest = KibanaRequest< export interface UMServerRoute { method: 'GET' | 'PUT' | 'POST' | 'DELETE'; writeAccess?: boolean; + writeAccessOverride?: boolean; handler: T; validation?: FullValidationConfig; streamHandler?: ( diff --git a/x-pack/plugins/threat_intelligence/kibana.jsonc b/x-pack/plugins/threat_intelligence/kibana.jsonc index 6feefbd7c3f66..3c750402438b2 100644 --- a/x-pack/plugins/threat_intelligence/kibana.jsonc +++ b/x-pack/plugins/threat_intelligence/kibana.jsonc @@ -1,7 +1,7 @@ { "type": "plugin", "id": "@kbn/threat-intelligence-plugin", - "owner": "@elastic/protections-experience", + "owner": "@elastic/security-threat-hunting-investigations", "description": "Elastic threat intelligence helps you see if you are open to or have been subject to current or historical known threats", "plugin": { "id": "threatIntelligence", diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 5eaceb182e5cd..63b76a5cb04ac 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -76,64 +76,6 @@ } }, "messages": { - "advancedSettings.field.changeImageLinkAriaLabel": "Modifier {ariaName}", - "advancedSettings.field.defaultValueText": "Par défaut : {value}", - "advancedSettings.field.defaultValueTypeJsonText": "Par défaut : {value}", - "advancedSettings.field.deprecationClickAreaLabel": "Cliquez ici pour afficher la documentation de déclassement pour {settingName}.", - "advancedSettings.field.resetToDefaultLinkAriaLabel": "Réinitialiser {ariaName} à la valeur par défaut", - "advancedSettings.form.countOfSettingsChanged": "{unsavedCount} {unsavedCount, plural, one {paramètre} many {les paramètres d''index suivants déclassés ?} other {paramètres}} non enregistré(s){hiddenCount, plural, =0 {} one {, # masqué} many {, # masqués} other {, # masqués}}", - "advancedSettings.form.noSearchResultText": "Aucun paramètre trouvé pour {queryText} {clearSearch}", - "advancedSettings.form.searchResultText": "Les termes de la recherche masquent {settingsCount} paramètres {clearSearch}", - "advancedSettings.voiceAnnouncement.noSearchResultScreenReaderMessage": "Il {optionLenght, plural, one {y a # option} many {y a # options} other {y a # options}} dans {sectionLenght, plural, one {# section} many {# sections} other {# sections}}", - "advancedSettings.voiceAnnouncement.searchResultScreenReaderMessage": "Vous avez recherché {query}. Il {optionLenght, plural, one {y a # option} many {y a # options} other {y a # options}} dans {sectionLenght, plural, one {# section} many {# sections} other {# sections}}", - "advancedSettings.advancedSettingsLabel": "Paramètres avancés", - "advancedSettings.badge.readOnly.text": "Lecture seule", - "advancedSettings.badge.readOnly.tooltip": "Impossible d’enregistrer les paramètres avancés", - "advancedSettings.callOutCautionDescription": "Soyez prudent, ces paramètres sont destinés aux utilisateurs très avancés uniquement. Toute modification est susceptible d’entraîner des dommages importants à Kibana. Certains de ces paramètres peuvent être non documentés, non compatibles ou en version d'évaluation technique. Lorsqu’un champ dispose d’une valeur par défaut, le laisser vide entraîne l’application de cette valeur par défaut, ce qui peut ne pas être acceptable compte tenu d’autres directives de configuration. Toute suppression d'un paramètre personnalisé de la configuration de Kibana est définitive.", - "advancedSettings.callOutCautionTitle": "Attention : toute action est susceptible de provoquer des dommages.", - "advancedSettings.categoryNames.dashboardLabel": "Tableau de bord", - "advancedSettings.categoryNames.discoverLabel": "Découverte", - "advancedSettings.categoryNames.enterpriseSearchLabel": "Enterprise Search", - "advancedSettings.categoryNames.generalLabel": "Général", - "advancedSettings.categoryNames.machineLearningLabel": "Machine Learning", - "advancedSettings.categoryNames.notificationsLabel": "Notifications", - "advancedSettings.categoryNames.observabilityLabel": "Observabilité", - "advancedSettings.categoryNames.reportingLabel": "Reporting", - "advancedSettings.categoryNames.searchLabel": "Recherche", - "advancedSettings.categoryNames.securitySolutionLabel": "Solution de sécurité", - "advancedSettings.categoryNames.timelionLabel": "Timelion", - "advancedSettings.categoryNames.visualizationsLabel": "Visualisations", - "advancedSettings.categorySearchLabel": "Catégorie", - "advancedSettings.defaultSpaceCalloutSubtitle": "Les modifications seront uniquement appliquées à l'espace actuel. Ces paramètres sont destinés aux utilisateurs avancés, car des configurations incorrectes peuvent avoir une incidence négative sur des aspects de Kibana.", - "advancedSettings.defaultSpaceCalloutTitle": "Les modifications affecteront l'espace actuel.", - "advancedSettings.featureCatalogueTitle": "Personnalisez votre expérience Kibana : modifiez le format de date, activez le mode sombre, et bien plus encore.", - "advancedSettings.field.changeImageLinkText": "Modifier l'image", - "advancedSettings.field.codeEditorSyntaxErrorMessage": "Syntaxe JSON non valide", - "advancedSettings.field.customSettingAriaLabel": "Paramètre personnalisé", - "advancedSettings.field.customSettingTooltip": "Paramètre personnalisé", - "advancedSettings.field.helpText": "Ce paramètre est défini par le serveur Kibana et ne peut pas être modifié.", - "advancedSettings.field.imageChangeErrorMessage": "Impossible d’enregistrer l'image", - "advancedSettings.field.invalidIconLabel": "Non valide", - "advancedSettings.field.offLabel": "Désactivé", - "advancedSettings.field.onLabel": "Activé", - "advancedSettings.field.resetToDefaultLinkText": "Réinitialiser à la valeur par défaut", - "advancedSettings.field.settingIsUnsaved": "Le paramètre n'est actuellement pas enregistré.", - "advancedSettings.field.unsavedIconLabel": "Non enregistré", - "advancedSettings.form.cancelButtonLabel": "Annuler les modifications", - "advancedSettings.form.clearNoSearchResultText": "(effacer la recherche)", - "advancedSettings.form.clearSearchResultText": "(effacer la recherche)", - "advancedSettings.form.requiresPageReloadToastButtonLabel": "Actualiser la page", - "advancedSettings.form.requiresPageReloadToastDescription": "Un ou plusieurs paramètres nécessitent d’actualiser la page pour pouvoir prendre effet.", - "advancedSettings.form.saveButtonLabel": "Enregistrer les modifications", - "advancedSettings.form.saveButtonTooltipWithInvalidChanges": "Corrigez les paramètres non valides avant d'enregistrer.", - "advancedSettings.form.saveErrorMessage": "Enregistrement impossible", - "advancedSettings.globalCalloutSubtitle": "Les modifications seront appliquées à tous les utilisateurs dans l'ensemble des espaces. Cela inclut les utilisateurs Kibana natifs et les utilisateurs qui se connectent via l'authentification unique.", - "advancedSettings.globalCalloutTitle": "Les modifications auront une incidence sur tous les paramètres utilisateur dans l'ensemble des espaces", - "advancedSettings.globalSettingsTabTitle": "Paramètres généraux", - "advancedSettings.searchBar.unableToParseQueryErrorMessage": "Impossible d'analyser la requête", - "advancedSettings.searchBarAriaLabel": "Rechercher dans les paramètres avancés", - "advancedSettings.spaceSettingsTabTitle": "Paramètres de l'espace", - "advancedSettings.voiceAnnouncement.ariaLabel": "Informations de résultat des paramètres avancés", "autocomplete.conflictIndicesWarning.index.description": "{name} ({count} index)", "autocomplete.customOptionText": "Ajouter {searchValuePlaceholder} comme champ personnalisé", "autocomplete.conflictIndicesWarning.description": "Ce champ est défini avec différents types dans les index suivants ou il n'est pas mappé, ce qui peut entraîner des résultats inattendus lors des requêtes.", @@ -9066,8 +9008,6 @@ "xpack.apm.serviceIcons.serviceDetails.service.versionLabel": "Version du service", "xpack.apm.serviceLink.otherBucketName": "Services restants", "xpack.apm.serviceLink.tooltip": "Le nombre de services instrumentés a atteint la capacité actuelle du serveur APM", - "xpack.apm.serviceList.ui.limit.warning.calloutDescription": "Le nombre maximal de services pouvant être affichés dans Kibana a été atteint. Essayez d'affiner les résultats à l'aide de la barre de requête, ou envisagez d'utiliser les groupes de services.", - "xpack.apm.serviceList.ui.limit.warning.calloutTitle": "Le nombre de services dépasse le nombre maximal autorisé d'affichages (1 000)", "xpack.apm.serviceMap.anomalyDetectionPopoverDisabled": "Affichez les indicateurs d'intégrité du service en activant la détection des anomalies dans les paramètres APM.", "xpack.apm.serviceMap.anomalyDetectionPopoverLink": "Afficher les anomalies", "xpack.apm.serviceMap.anomalyDetectionPopoverNoData": "Nous n'avons pas trouvé de score d'anomalie dans la plage temporelle sélectionnée. Consultez les détails dans l'explorateur d'anomalies.", @@ -9131,9 +9071,6 @@ "xpack.apm.serviceOverview.embeddedMap.sessionCountry.metric.label": "Sessions par pays", "xpack.apm.serviceOverview.embeddedMap.sessionRegion.metric.label": "Sessions par région", "xpack.apm.serviceOverview.embeddedMap.title": "Régions géographiques", - "xpack.apm.serviceOverview.errorsTable.errorMessage": "Impossible de récupérer", - "xpack.apm.serviceOverview.errorsTable.loading": "Chargement...", - "xpack.apm.serviceOverview.errorsTable.noResults": "Aucune erreur trouvée", "xpack.apm.serviceOverview.errorsTableLinkText": "Afficher les erreurs", "xpack.apm.serviceOverview.errorsTableTitle": "Erreurs", "xpack.apm.serviceOverview.instancesTable.actionMenus.container.subtitle": "Affichez les logs et les indicateurs de ce conteneur pour plus de détails.", @@ -9152,7 +9089,6 @@ "xpack.apm.serviceOverview.instancesTableColumnMemoryUsage": "Utilisation de la mémoire (moy.)", "xpack.apm.serviceOverview.instancesTableColumnNodeName": "Nom du nœud", "xpack.apm.serviceOverview.instancesTableColumnThroughput": "Rendement", - "xpack.apm.serviceOverview.instancesTableTitle": "Instances", "xpack.apm.serviceOverview.instanceTable.details.cloudTitle": "Cloud", "xpack.apm.serviceOverview.instanceTable.details.containerTitle": "Conteneur", "xpack.apm.serviceOverview.instanceTable.details.serviceTitle": "Service", @@ -9567,7 +9503,6 @@ "xpack.apm.transactions.sessionsChartTitle": "Sessions", "xpack.apm.transactionsCallout.cardinalityWarning.title": "Le nombre de groupes de transactions dépasse le nombre maximal (1 000) autorisé d'affichages.", "xpack.apm.transactionsCallout.transactionGroupLimit.exceeded": "Le nombre maximal de groupes de transactions affichés dans Kibana a été atteint. Essayez d'affiner les résultats à l'aide de la barre de requête.", - "xpack.apm.transactionsTable.errorMessage": "Impossible de récupérer", "xpack.apm.transactionsTable.linkText": "Afficher les transactions", "xpack.apm.transactionsTable.loading": "Chargement...", "xpack.apm.transactionsTable.noResults": "Aucune transaction trouvée", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c0d8dd949344c..5ac0b945b1173 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -76,64 +76,6 @@ } }, "messages": { - "advancedSettings.field.changeImageLinkAriaLabel": "{ariaName}の変更", - "advancedSettings.field.defaultValueText": "デフォルト:{value}", - "advancedSettings.field.defaultValueTypeJsonText": "デフォルト:{value}", - "advancedSettings.field.deprecationClickAreaLabel": "クリックすると{settingName}のサポート終了に関するドキュメントが表示されます。", - "advancedSettings.field.resetToDefaultLinkAriaLabel": "{ariaName}をデフォルトにリセット", - "advancedSettings.form.countOfSettingsChanged": "{unsavedCount}個の保存されていない{unsavedCount, plural, other {設定}}{hiddenCount, plural, =0 {} other {、#個が非表示です}}", - "advancedSettings.form.noSearchResultText": "{queryText}{clearSearch}の設定が見つかりません", - "advancedSettings.form.searchResultText": "検索用語により、{settingsCount}件の設定{clearSearch}が非表示になっています", - "advancedSettings.voiceAnnouncement.noSearchResultScreenReaderMessage": "{sectionLenght, plural, other {#個のセクション}}に{optionLenght, plural, other {#個のオプションがあります}}", - "advancedSettings.voiceAnnouncement.searchResultScreenReaderMessage": "{query}を検索しました。{sectionLenght, plural, other {#個のセクション}}に{optionLenght, plural, other {#個のオプションがあります}}", - "advancedSettings.advancedSettingsLabel": "高度な設定", - "advancedSettings.badge.readOnly.text": "読み取り専用", - "advancedSettings.badge.readOnly.tooltip": "高度な設定を保存できません", - "advancedSettings.callOutCautionDescription": "これらの設定は特に上級のユーザー向けなのでご注意ください。ここでの変更は Kibana の重要な部分に不具合を生じさせる可能性があります。これらの設定は非公開、サポート対象外、またはテクニカルプレビュー中の場合があります。フィールドにデフォルト値がある場合、そのフィールドを未入力のままにするとデフォルトに戻り、他の構成で許容されないことがあります。カスタム設定を削除すると、Kibana の構成から永久に削除されます。", - "advancedSettings.callOutCautionTitle": "注意:不具合につながる可能性があります", - "advancedSettings.categoryNames.dashboardLabel": "ダッシュボード", - "advancedSettings.categoryNames.discoverLabel": "Discover", - "advancedSettings.categoryNames.enterpriseSearchLabel": "エンタープライズ サーチ", - "advancedSettings.categoryNames.generalLabel": "一般", - "advancedSettings.categoryNames.machineLearningLabel": "機械学習", - "advancedSettings.categoryNames.notificationsLabel": "通知", - "advancedSettings.categoryNames.observabilityLabel": "Observability", - "advancedSettings.categoryNames.reportingLabel": "レポート", - "advancedSettings.categoryNames.searchLabel": "検索", - "advancedSettings.categoryNames.securitySolutionLabel": "セキュリティソリューション", - "advancedSettings.categoryNames.timelionLabel": "Timelion", - "advancedSettings.categoryNames.visualizationsLabel": "ビジュアライゼーション", - "advancedSettings.categorySearchLabel": "カテゴリー", - "advancedSettings.defaultSpaceCalloutSubtitle": "変更は現在のスペースにのみ適用されます。これらの設定は上級ユーザー向けです。構成が正しくない場合は、Kibanaの動作に悪影響を及ぼすおそれがあります。", - "advancedSettings.defaultSpaceCalloutTitle": "変更は現在のスペースに影響します。", - "advancedSettings.featureCatalogueTitle": "日付形式の変更、ダークモードの有効化など、Kibanaエクスペリエンスをカスタマイズします。", - "advancedSettings.field.changeImageLinkText": "画像を変更", - "advancedSettings.field.codeEditorSyntaxErrorMessage": "無効な JSON 構文", - "advancedSettings.field.customSettingAriaLabel": "カスタム設定", - "advancedSettings.field.customSettingTooltip": "カスタム設定", - "advancedSettings.field.helpText": "この設定は Kibana サーバーにより上書きされ、変更することはできません。", - "advancedSettings.field.imageChangeErrorMessage": "画像を保存できませんでした", - "advancedSettings.field.invalidIconLabel": "無効", - "advancedSettings.field.offLabel": "オフ", - "advancedSettings.field.onLabel": "オン", - "advancedSettings.field.resetToDefaultLinkText": "デフォルトにリセット", - "advancedSettings.field.settingIsUnsaved": "設定は現在保存されていません。", - "advancedSettings.field.unsavedIconLabel": "未保存", - "advancedSettings.form.cancelButtonLabel": "変更をキャンセル", - "advancedSettings.form.clearNoSearchResultText": "(検索結果を消去)", - "advancedSettings.form.clearSearchResultText": "(検索結果を消去)", - "advancedSettings.form.requiresPageReloadToastButtonLabel": "ページを再読み込み", - "advancedSettings.form.requiresPageReloadToastDescription": "設定を有効にするためにページの再読み込みが必要です。", - "advancedSettings.form.saveButtonLabel": "変更を保存", - "advancedSettings.form.saveButtonTooltipWithInvalidChanges": "保存前に無効な設定を修正してください。", - "advancedSettings.form.saveErrorMessage": "を保存できませんでした", - "advancedSettings.globalCalloutSubtitle": "変更はすべてのスペースのすべてのユーザーに適用されます。これにはネイティブKibanaユーザーとシングルサインオンユーザーの両方が含まれます。", - "advancedSettings.globalCalloutTitle": "変更はすべてのスペースのすべてのユーザー設定に影響します", - "advancedSettings.globalSettingsTabTitle": "グローバル設定", - "advancedSettings.searchBar.unableToParseQueryErrorMessage": "クエリをパースできません", - "advancedSettings.searchBarAriaLabel": "高度な設定を検索", - "advancedSettings.spaceSettingsTabTitle": "スペース設定", - "advancedSettings.voiceAnnouncement.ariaLabel": "詳細設定結果情報", "autocomplete.conflictIndicesWarning.index.description": "{name}({count}個のインデックス)", "autocomplete.customOptionText": "{searchValuePlaceholder}をカスタムフィールドとして追加", "autocomplete.conflictIndicesWarning.description": "このフィールドは、次のインデックスで別の型として定義されているか、マッピングされていません。これにより、予期しないクエリ結果になる場合があります。", @@ -9080,8 +9022,6 @@ "xpack.apm.serviceIcons.serviceDetails.service.versionLabel": "サービスバージョン", "xpack.apm.serviceLink.otherBucketName": "残りのサービス", "xpack.apm.serviceLink.tooltip": "実行されたサービス数がAPMサーバーの現在の能力に達しました。", - "xpack.apm.serviceList.ui.limit.warning.calloutDescription": "Kibanaで表示できるサービスの最大数に達しました。クエリバーを使用して結果を絞り込むか、サービスグループの使用を検討してください。", - "xpack.apm.serviceList.ui.limit.warning.calloutTitle": "サービス数が表示可能な最大数(1,000)を超えました。", "xpack.apm.serviceMap.anomalyDetectionPopoverDisabled": "APM 設定で異常検知を有効にすると、サービス正常性インジケーターが表示されます。", "xpack.apm.serviceMap.anomalyDetectionPopoverLink": "異常を表示", "xpack.apm.serviceMap.anomalyDetectionPopoverNoData": "選択した時間範囲で、異常スコアを検出できませんでした。異常エクスプローラーで詳細を確認してください。", @@ -9145,9 +9085,6 @@ "xpack.apm.serviceOverview.embeddedMap.sessionCountry.metric.label": "国別セッション", "xpack.apm.serviceOverview.embeddedMap.sessionRegion.metric.label": "地域別セッション", "xpack.apm.serviceOverview.embeddedMap.title": "地域", - "xpack.apm.serviceOverview.errorsTable.errorMessage": "取得できませんでした", - "xpack.apm.serviceOverview.errorsTable.loading": "読み込み中...", - "xpack.apm.serviceOverview.errorsTable.noResults": "エラーが見つかりません", "xpack.apm.serviceOverview.errorsTableLinkText": "エラーを表示", "xpack.apm.serviceOverview.errorsTableTitle": "エラー", "xpack.apm.serviceOverview.instancesTable.actionMenus.container.subtitle": "このコンテナーのログとインデックスを表示し、さらに詳細を確認できます。", @@ -9166,7 +9103,6 @@ "xpack.apm.serviceOverview.instancesTableColumnMemoryUsage": "メモリー使用状況(平均)", "xpack.apm.serviceOverview.instancesTableColumnNodeName": "ノード名", "xpack.apm.serviceOverview.instancesTableColumnThroughput": "スループット", - "xpack.apm.serviceOverview.instancesTableTitle": "インスタンス", "xpack.apm.serviceOverview.instanceTable.details.cloudTitle": "クラウド", "xpack.apm.serviceOverview.instanceTable.details.containerTitle": "コンテナー", "xpack.apm.serviceOverview.instanceTable.details.serviceTitle": "サービス", @@ -9581,7 +9517,6 @@ "xpack.apm.transactions.sessionsChartTitle": "セッション", "xpack.apm.transactionsCallout.cardinalityWarning.title": "トランザクショングループ数が表示可能な最大数(1,000)を超えました。", "xpack.apm.transactionsCallout.transactionGroupLimit.exceeded": "Kibanaで表示されるトランザクショングループの最大数に達しました。クエリバーを使用して結果を絞り込んでください。", - "xpack.apm.transactionsTable.errorMessage": "取得できませんでした", "xpack.apm.transactionsTable.linkText": "トランザクションを表示", "xpack.apm.transactionsTable.loading": "読み込み中...", "xpack.apm.transactionsTable.noResults": "トランザクションが見つかりません", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index a893ee0a19dab..eeb98e4c894a1 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -76,64 +76,6 @@ } }, "messages": { - "advancedSettings.field.changeImageLinkAriaLabel": "更改 {ariaName}", - "advancedSettings.field.defaultValueText": "默认值:{value}", - "advancedSettings.field.defaultValueTypeJsonText": "默认值:{value}", - "advancedSettings.field.deprecationClickAreaLabel": "单击以查看 {settingName} 的过时文档。", - "advancedSettings.field.resetToDefaultLinkAriaLabel": "将 {ariaName} 重置为默认值", - "advancedSettings.form.countOfSettingsChanged": "{unsavedCount} 个未保存{unsavedCount, plural, other {设置}}{hiddenCount, plural, =0 {} other {,# 个已隐藏}}", - "advancedSettings.form.noSearchResultText": "未找到 {queryText} 的设置{clearSearch}", - "advancedSettings.form.searchResultText": "搜索词隐藏了 {settingsCount} 个设置{clearSearch}", - "advancedSettings.voiceAnnouncement.noSearchResultScreenReaderMessage": "{sectionLenght, plural, other {# 个部分}}中有 {optionLenght, plural, other {# 个选项}}", - "advancedSettings.voiceAnnouncement.searchResultScreenReaderMessage": "您已搜索 {query}。{sectionLenght, plural, other {# 个部分}}中有 {optionLenght, plural, other {# 个选项}}", - "advancedSettings.advancedSettingsLabel": "高级设置", - "advancedSettings.badge.readOnly.text": "只读", - "advancedSettings.badge.readOnly.tooltip": "无法保存高级设置", - "advancedSettings.callOutCautionDescription": "此处请谨慎操作,这些设置仅供高级用户使用。您在这里所做的更改可能使 Kibana 的大部分功能出现问题。这些设置有一部分可能未在文档中说明、不受支持或处于技术预览状态。如果字段有默认值,将字段留空会将其设置为默认值,其他配置指令可能不接受其默认值。删除定制设置会将其从 Kibana 的配置中永久删除。", - "advancedSettings.callOutCautionTitle": "注意:在这里您可能会使问题出现", - "advancedSettings.categoryNames.dashboardLabel": "仪表板", - "advancedSettings.categoryNames.discoverLabel": "Discover", - "advancedSettings.categoryNames.enterpriseSearchLabel": "Enterprise Search", - "advancedSettings.categoryNames.generalLabel": "常规", - "advancedSettings.categoryNames.machineLearningLabel": "Machine Learning", - "advancedSettings.categoryNames.notificationsLabel": "通知", - "advancedSettings.categoryNames.observabilityLabel": "Observability", - "advancedSettings.categoryNames.reportingLabel": "报告", - "advancedSettings.categoryNames.searchLabel": "搜索", - "advancedSettings.categoryNames.securitySolutionLabel": "安全解决方案", - "advancedSettings.categoryNames.timelionLabel": "Timelion", - "advancedSettings.categoryNames.visualizationsLabel": "可视化", - "advancedSettings.categorySearchLabel": "类别", - "advancedSettings.defaultSpaceCalloutSubtitle": "将仅对当前工作区应用更改。这些设置适用于高级用户,因为配置错误可能会对 Kibana 的某些方面造成负面影响。", - "advancedSettings.defaultSpaceCalloutTitle": "更改将影响当前工作区。", - "advancedSettings.featureCatalogueTitle": "定制您的 Kibana 体验 — 更改日期格式、打开深色模式,等等。", - "advancedSettings.field.changeImageLinkText": "更改图片", - "advancedSettings.field.codeEditorSyntaxErrorMessage": "JSON 语法无效", - "advancedSettings.field.customSettingAriaLabel": "定制设置", - "advancedSettings.field.customSettingTooltip": "定制设置", - "advancedSettings.field.helpText": "此设置已由 Kibana 服务器覆盖,无法更改。", - "advancedSettings.field.imageChangeErrorMessage": "图片无法保存", - "advancedSettings.field.invalidIconLabel": "无效", - "advancedSettings.field.offLabel": "关闭", - "advancedSettings.field.onLabel": "开启", - "advancedSettings.field.resetToDefaultLinkText": "重置为默认值", - "advancedSettings.field.settingIsUnsaved": "设备当前未保存。", - "advancedSettings.field.unsavedIconLabel": "未保存", - "advancedSettings.form.cancelButtonLabel": "取消更改", - "advancedSettings.form.clearNoSearchResultText": "(清除搜索)", - "advancedSettings.form.clearSearchResultText": "(清除搜索)", - "advancedSettings.form.requiresPageReloadToastButtonLabel": "重新加载页面", - "advancedSettings.form.requiresPageReloadToastDescription": "一个或多个设置需要您重新加载页面才能生效。", - "advancedSettings.form.saveButtonLabel": "保存更改", - "advancedSettings.form.saveButtonTooltipWithInvalidChanges": "保存前请修复无效的设置。", - "advancedSettings.form.saveErrorMessage": "无法保存", - "advancedSettings.globalCalloutSubtitle": "将对所有工作区的所有用户应用更改。这包括本机 Kibana 用户和单点登录用户。", - "advancedSettings.globalCalloutTitle": "更改将影响所有工作区的所有用户设置", - "advancedSettings.globalSettingsTabTitle": "常规设置", - "advancedSettings.searchBar.unableToParseQueryErrorMessage": "无法解析查询", - "advancedSettings.searchBarAriaLabel": "搜索高级设置", - "advancedSettings.spaceSettingsTabTitle": "工作区设置", - "advancedSettings.voiceAnnouncement.ariaLabel": "“高级设置”的结果信息", "autocomplete.conflictIndicesWarning.index.description": "{name}({count} 个索引)", "autocomplete.customOptionText": "将 {searchValuePlaceholder} 添加为字段", "autocomplete.conflictIndicesWarning.description": "此字段在以下索引中定义为不同类型或未映射。这可能导致意外的查询结果。", @@ -9174,8 +9116,6 @@ "xpack.apm.serviceIcons.serviceDetails.service.versionLabel": "服务版本", "xpack.apm.serviceLink.otherBucketName": "剩余服务", "xpack.apm.serviceLink.tooltip": "检测的服务数已达到 APM 服务器的当前容量", - "xpack.apm.serviceList.ui.limit.warning.calloutDescription": "已达到可在 Kibana 中查看的最大服务数。尝试通过使用查询栏来缩小结果范围,或考虑使用服务组。", - "xpack.apm.serviceList.ui.limit.warning.calloutTitle": "服务数超出了显示的允许最大值 (1,000)", "xpack.apm.serviceMap.anomalyDetectionPopoverDisabled": "通过在 APM 设置中启用异常检测来显示服务运行状况指标。", "xpack.apm.serviceMap.anomalyDetectionPopoverLink": "查看异常", "xpack.apm.serviceMap.anomalyDetectionPopoverNoData": "在选定时间范围内找不到异常分数。请在 Anomaly Explorer 中查看详情。", @@ -9239,9 +9179,6 @@ "xpack.apm.serviceOverview.embeddedMap.sessionCountry.metric.label": "按国家/地区的会话", "xpack.apm.serviceOverview.embeddedMap.sessionRegion.metric.label": "按区域的会话", "xpack.apm.serviceOverview.embeddedMap.title": "地理区域", - "xpack.apm.serviceOverview.errorsTable.errorMessage": "无法提取", - "xpack.apm.serviceOverview.errorsTable.loading": "正在加载……", - "xpack.apm.serviceOverview.errorsTable.noResults": "未找到错误", "xpack.apm.serviceOverview.errorsTableLinkText": "查看错误", "xpack.apm.serviceOverview.errorsTableTitle": "错误", "xpack.apm.serviceOverview.instancesTable.actionMenus.container.subtitle": "查看此容器的日志和指标以获取进一步详情。", @@ -9260,7 +9197,6 @@ "xpack.apm.serviceOverview.instancesTableColumnMemoryUsage": "内存使用率(平均值)", "xpack.apm.serviceOverview.instancesTableColumnNodeName": "节点名称", "xpack.apm.serviceOverview.instancesTableColumnThroughput": "吞吐量", - "xpack.apm.serviceOverview.instancesTableTitle": "实例", "xpack.apm.serviceOverview.instanceTable.details.cloudTitle": "云", "xpack.apm.serviceOverview.instanceTable.details.containerTitle": "容器", "xpack.apm.serviceOverview.instanceTable.details.serviceTitle": "服务", @@ -9675,7 +9611,6 @@ "xpack.apm.transactions.sessionsChartTitle": "会话", "xpack.apm.transactionsCallout.cardinalityWarning.title": "事务组数目超出了显示的允许最大值 (1,000)。", "xpack.apm.transactionsCallout.transactionGroupLimit.exceeded": "已达到在 Kibana 中显示的最大事务组数目。尝试通过使用查询栏来缩小结果范围。", - "xpack.apm.transactionsTable.errorMessage": "无法提取", "xpack.apm.transactionsTable.linkText": "查看事务", "xpack.apm.transactionsTable.loading": "正在加载……", "xpack.apm.transactionsTable.noResults": "找不到任何事务", diff --git a/x-pack/test/accessibility/apps/group1/advanced_settings.ts b/x-pack/test/accessibility/apps/group1/advanced_settings.ts index 44899932302ba..4515105d7557c 100644 --- a/x-pack/test/accessibility/apps/group1/advanced_settings.ts +++ b/x-pack/test/accessibility/apps/group1/advanced_settings.ts @@ -40,21 +40,21 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // clicking on the toggle button it('adv settings - toggle ', async () => { - await testSubjects.click('advancedSetting-editField-csv:quoteValues'); + await testSubjects.click('management-settings-editField-csv:quoteValues'); await toasts.dismissAllToasts(); await a11y.testAppSnapshot(); }); // clicking on editor panel it('adv settings - edit ', async () => { - await testSubjects.click('advancedSetting-editField-csv:separator'); + await testSubjects.click('management-settings-editField-csv:separator'); await toasts.dismissAllToasts(); await a11y.testAppSnapshot(); }); // clicking on save button it('adv settings - save', async () => { - await testSubjects.click('advancedSetting-saveButton'); + await testSubjects.click('settings-save-button'); await toasts.dismissAllToasts(); await a11y.testAppSnapshot(); }); diff --git a/x-pack/test/apm_api_integration/tests/error_rate/service_apis.spec.ts b/x-pack/test/apm_api_integration/tests/error_rate/service_apis.spec.ts index bdcd2f30c1f84..09ad6c631cbfa 100644 --- a/x-pack/test/apm_api_integration/tests/error_rate/service_apis.spec.ts +++ b/x-pack/test/apm_api_integration/tests/error_rate/service_apis.spec.ts @@ -113,6 +113,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { kuery: `processor.event : "${processorEvent}"`, transactionType: 'request', latencyAggregationType: 'avg' as LatencyAggregationType, + sortField: 'throughput', + sortDirection: 'desc', }, }, }), diff --git a/x-pack/test/apm_api_integration/tests/latency/service_apis.spec.ts b/x-pack/test/apm_api_integration/tests/latency/service_apis.spec.ts index d174bcdf03411..a3904e77e26ec 100644 --- a/x-pack/test/apm_api_integration/tests/latency/service_apis.spec.ts +++ b/x-pack/test/apm_api_integration/tests/latency/service_apis.spec.ts @@ -118,6 +118,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { kuery: `processor.event : "${processorEvent}"`, transactionType: 'request', latencyAggregationType: 'avg' as LatencyAggregationType, + sortField: 'throughput', + sortDirection: 'desc', }, }, }), diff --git a/x-pack/test/apm_api_integration/tests/service_overview/__snapshots__/instance_details.spec.snap b/x-pack/test/apm_api_integration/tests/service_overview/__snapshots__/instance_details.spec.snap index 022048cdbd5ed..f3fb16ec38b15 100644 --- a/x-pack/test/apm_api_integration/tests/service_overview/__snapshots__/instance_details.spec.snap +++ b/x-pack/test/apm_api_integration/tests/service_overview/__snapshots__/instance_details.spec.snap @@ -9,7 +9,7 @@ Object { "id": "123", }, "host": Object { - "name": "metric-only-production", + "name": "multiple-env-service-production", }, "kubernetes": Object { "container": Object {}, @@ -23,7 +23,7 @@ Object { "environment": "production", "name": "service1", "node": Object { - "name": "metric-only-production", + "name": "multiple-env-service-production", }, }, } diff --git a/x-pack/test/apm_api_integration/tests/service_overview/get_service_node_ids.ts b/x-pack/test/apm_api_integration/tests/service_overview/get_service_node_ids.ts index 8736b46f73459..ad3e872bcc879 100644 --- a/x-pack/test/apm_api_integration/tests/service_overview/get_service_node_ids.ts +++ b/x-pack/test/apm_api_integration/tests/service_overview/get_service_node_ids.ts @@ -32,6 +32,8 @@ export async function getServiceNodeIds({ transactionType: 'request', environment: 'ENVIRONMENT_ALL', kuery: '', + sortField: 'throughput', + sortDirection: 'desc', }, }, }); diff --git a/x-pack/test/apm_api_integration/tests/service_overview/instance_details.spec.ts b/x-pack/test/apm_api_integration/tests/service_overview/instance_details.spec.ts index f8895b73ab0db..4ff96129dfcf9 100644 --- a/x-pack/test/apm_api_integration/tests/service_overview/instance_details.spec.ts +++ b/x-pack/test/apm_api_integration/tests/service_overview/instance_details.spec.ts @@ -56,7 +56,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { const metricOnlyInstance = apm .service({ name: 'service1', environment: 'production', agentName: 'java' }) - .instance('metric-only-production'); + .instance('multiple-env-service-production'); before(async () => { return synthtrace.index([ diff --git a/x-pack/test/apm_api_integration/tests/service_overview/instances_main_statistics.spec.ts b/x-pack/test/apm_api_integration/tests/service_overview/instances_main_statistics.spec.ts index f215882c09bd2..4e92e657de49f 100644 --- a/x-pack/test/apm_api_integration/tests/service_overview/instances_main_statistics.spec.ts +++ b/x-pack/test/apm_api_integration/tests/service_overview/instances_main_statistics.spec.ts @@ -4,436 +4,684 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ import expect from '@kbn/expect'; -import { pick, sortBy } from 'lodash'; -import moment from 'moment'; -import { apm, timerange } from '@kbn/apm-synthtrace-client'; import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; -import { isFiniteNumber } from '@kbn/apm-plugin/common/utils/is_finite_number'; - +import { apm, Instance, timerange } from '@kbn/apm-synthtrace-client'; import { LatencyAggregationType } from '@kbn/apm-plugin/common/latency_aggregation_types'; -import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; -import { SERVICE_NODE_NAME_MISSING } from '@kbn/apm-plugin/common/service_nodes'; -import archives from '../../common/fixtures/es_archiver/archives_metadata'; +import { InstancesSortField } from '@kbn/apm-plugin/common/instances'; +import { sum } from 'lodash'; import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { roundNumber } from '../../utils'; + +type ServiceOverviewInstancesMainStatistics = + APIReturnType<'GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics'>; export default function ApiTest({ getService }: FtrProviderContext) { const registry = getService('registry'); const apmApiClient = getService('apmApiClient'); - const synthtraceEsClient = getService('synthtraceEsClient'); - - const archiveName = 'apm_8.0.0'; - const { start, end } = archives[archiveName]; + const synthtrace = getService('synthtraceEsClient'); + + const start = new Date('2021-01-01T00:00:00.000Z').getTime(); + const end = new Date('2021-01-01T00:10:00.000Z').getTime(); + + async function getServiceOverviewInstancesMainStatistics({ + serviceName, + sortField = 'throughput', + sortDirection = 'desc', + }: { + serviceName: string; + sortField?: InstancesSortField; + sortDirection?: 'asc' | 'desc'; + }) { + const { body } = await apmApiClient.readUser({ + endpoint: `GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics`, + params: { + path: { serviceName }, + query: { + latencyAggregationType: LatencyAggregationType.avg, + start: new Date(start).toISOString(), + end: new Date(end).toISOString(), + transactionType: 'request', + environment: 'production', + kuery: '', + sortField, + sortDirection, + }, + }, + }); + + return body.currentPeriod; + } registry.when( - 'Service overview instances main statistics when data is not loaded', + 'Instances main statistics when data is not loaded', { config: 'basic', archives: [] }, () => { describe('when data is not loaded', () => { - it('handles the empty state', async () => { - const response = await apmApiClient.readUser({ - endpoint: `GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics`, - params: { - path: { serviceName: 'opbeans-java' }, - query: { - latencyAggregationType: LatencyAggregationType.avg, - transactionType: 'request', - start: moment(end).subtract(15, 'minutes').toISOString(), - end, - offset: '15m', - environment: 'ENVIRONMENT_ALL', - kuery: '', - }, - }, - }); - expect(response.status).to.be(200); - expect(response.body.currentPeriod).to.eql([]); - expect(response.body.previousPeriod).to.eql([]); + it('handles empty state', async () => { + const response = await getServiceOverviewInstancesMainStatistics({ serviceName: 'foo' }); + expect(response).to.eql({}); }); }); } ); registry.when( - 'Service overview instances main statistics when data is loaded without comparison', - { config: 'basic', archives: [archiveName] }, + 'Instances main statistics when data is loaded', + { config: 'basic', archives: [] }, () => { - describe('fetching java data', () => { - let response: { - body: APIReturnType<`GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics`>; - }; - - beforeEach(async () => { - response = await apmApiClient.readUser({ - endpoint: `GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics`, - params: { - path: { serviceName: 'opbeans-java' }, - query: { - latencyAggregationType: LatencyAggregationType.avg, - start, - end, - transactionType: 'request', - environment: 'ENVIRONMENT_ALL', - kuery: '', - }, - }, - }); - }); - - it('returns a service node item', () => { - expect(response.body.currentPeriod.length).to.be.greaterThan(0); - }); + describe('Return Top 100 instances', () => { + const serviceName = 'synth-node-1'; + before(() => { + const range = timerange(start, end); + const transactionName = 'foo'; + + const successfulTimestamps = range.interval('1m').rate(1); + const failedTimestamps = range.interval('1m').rate(1); + + const instances = [...Array(200).keys()].map((index) => + apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance(`instance-${index}`) + ); + + const instanceSpans = (instance: Instance) => { + const successfulTraceEvents = successfulTimestamps.generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .success() + .children( + instance + .span({ + spanName: 'GET apm-*/_search', + spanType: 'db', + spanSubtype: 'elasticsearch', + }) + .duration(1000) + .success() + .destination('elasticsearch') + .timestamp(timestamp), + instance + .span({ spanName: 'custom_operation', spanType: 'custom' }) + .duration(100) + .success() + .timestamp(timestamp) + ) + ); - it('returns statistics for each service node', () => { - const item = response.body.currentPeriod[0]; + const failedTraceEvents = failedTimestamps.generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instance + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + ); - expect(isFiniteNumber(item.cpuUsage)).to.be(true); - expect(isFiniteNumber(item.memoryUsage)).to.be(true); - expect(isFiniteNumber(item.errorRate)).to.be(true); - expect(isFiniteNumber(item.throughput)).to.be(true); - expect(isFiniteNumber(item.latency)).to.be(true); + const metricsets = range + .interval('30s') + .rate(1) + .generator((timestamp) => + instance + .appMetrics({ + 'system.memory.actual.free': 800, + 'system.memory.total': 1000, + 'system.cpu.total.norm.pct': 0.6, + 'system.process.cpu.total.norm.pct': 0.7, + }) + .timestamp(timestamp) + ); + + return [successfulTraceEvents, failedTraceEvents, metricsets]; + }; + + return synthtrace.index(instances.flatMap((instance) => instanceSpans(instance))); }); - it('returns the right data', () => { - const items = sortBy(response.body.currentPeriod, 'serviceNodeName'); - - const serviceNodeNames = items.map((item) => item.serviceNodeName); - - expectSnapshot(items.length).toMatchInline(`1`); - - expectSnapshot(serviceNodeNames).toMatchInline(` - Array [ - "31651f3c624b81c55dd4633df0b5b9f9ab06b151121b0404ae796632cd1f87ad", - ] - `); - - const item = items[0]; + after(() => { + return synthtrace.clean(); + }); + describe('fetch instances', () => { + let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; + before(async () => { + instancesMainStats = await getServiceOverviewInstancesMainStatistics({ + serviceName, + }); + }); + it('returns top 100 instances', () => { + expect(instancesMainStats.length).to.be(100); + }); + }); + }); - const values = pick(item, [ - 'cpuUsage', - 'memoryUsage', - 'errorRate', - 'throughput', - 'latency', + describe('Order by error rate', () => { + const serviceName = 'synth-node-1'; + before(async () => { + const range = timerange(start, end); + const transactionName = 'foo'; + /** + * Instance A + * 90 transactions = Success + * 10 transactions = Failure + * Error rate: 10% + */ + const instanceA = apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance('instance-A'); + const instanceASuccessfulTraceEvents = range + .interval('1m') + .rate(10) + .generator((timestamp, index) => + index < 10 + ? instanceA + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instanceA + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + : instanceA + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .success() + ); + /** + * Instance B + * 1 transactions = Success + * 9 transactions = Failure + * Error rate: 90% + */ + const instanceB = apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance('instance-B'); + const instanceBSuccessfulTraceEvents = range + .interval('1m') + .rate(1) + .generator((timestamp, index) => + index === 0 + ? instanceB + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .success() + : instanceB + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instanceB + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + ); + /** + * Instance C + * 2 transactions = Success + * 8 transactions = Failure + * Error rate: 80% + */ + const instanceC = apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance('instance-C'); + const instanceCSuccessfulTraceEvents = range + .interval('1m') + .rate(1) + .generator((timestamp, index) => + index < 2 + ? instanceC + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .success() + : instanceC + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instanceC + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + ); + /** + * Instance D + * 0 transactions = Success + * 10 transactions = Failure + * Error rate: 100% + */ + const instanceD = apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance('instance-D'); + const instanceDSuccessfulTraceEvents = range + .interval('1m') + .rate(1) + .generator((timestamp) => + instanceD + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instanceD + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + ); + /** + * Instance E + * 10 transactions = Success + * 0 transactions = Failure + * Error rate: 0% + */ + const instanceE = apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance('instance-E'); + const instanceESuccessfulTraceEvents = range + .interval('1m') + .rate(1) + .generator((timestamp) => + instanceE + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .success() + ); + return synthtrace.index([ + instanceASuccessfulTraceEvents, + instanceBSuccessfulTraceEvents, + instanceCSuccessfulTraceEvents, + instanceDSuccessfulTraceEvents, + instanceESuccessfulTraceEvents, ]); - - expectSnapshot(values).toMatchInline(` - Object { - "cpuUsage": 0.002, - "errorRate": 0.0848214285714286, - "latency": 411589.785714286, - "memoryUsage": 0.786029688517253, - "throughput": 7.46666666666667, - } - `); }); - }); - describe('fetching non-java data', () => { - let response: { - body: APIReturnType<`GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics`>; - }; - - beforeEach(async () => { - response = await apmApiClient.readUser({ - endpoint: `GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics`, - params: { - path: { serviceName: 'opbeans-ruby' }, - query: { - latencyAggregationType: LatencyAggregationType.avg, - start, - end, - transactionType: 'request', - environment: 'ENVIRONMENT_ALL', - kuery: '', - }, - }, + after(() => { + return synthtrace.clean(); + }); + describe('sort by error rate asc', () => { + let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; + before(async () => { + instancesMainStats = await getServiceOverviewInstancesMainStatistics({ + serviceName, + sortField: 'errorRate', + sortDirection: 'asc', + }); + }); + it('returns instances sorted asc', () => { + expect(instancesMainStats.map((item) => roundNumber(item.errorRate))).to.eql([ + 0, 0.1, 0.8, 0.9, 1, + ]); }); }); - - it('returns statistics for each service node', () => { - const item = response.body.currentPeriod[0]; - - expect(isFiniteNumber(item.cpuUsage)).to.be(true); - expect(isFiniteNumber(item.memoryUsage)).to.be(true); - expect(isFiniteNumber(item.errorRate)).to.be(true); - expect(isFiniteNumber(item.throughput)).to.be(true); - expect(isFiniteNumber(item.latency)).to.be(true); + describe('sort by error rate desc', () => { + let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; + before(async () => { + instancesMainStats = await getServiceOverviewInstancesMainStatistics({ + serviceName, + sortField: 'errorRate', + sortDirection: 'desc', + }); + }); + it('returns instances sorted desc', () => { + expect(instancesMainStats.map((item) => roundNumber(item.errorRate))).to.eql([ + 1, 0.9, 0.8, 0.1, 0, + ]); + }); }); + }); - it('returns the right data', () => { - const items = sortBy(response.body.currentPeriod, 'serviceNodeName'); - - const serviceNodeNames = items.map((item) => item.serviceNodeName); - - expectSnapshot(items.length).toMatchInline(`1`); - - expectSnapshot(serviceNodeNames).toMatchInline(` - Array [ - "b4c600993a0b233120cd333b8c4a7e35e73ee8f18f95b5854b8d7f6442531466", - ] - `); - - const item = items[0]; - - const values = pick(item, 'cpuUsage', 'errorRate', 'throughput', 'latency'); - - expectSnapshot(values).toMatchInline(` - Object { - "cpuUsage": 0.001, - "errorRate": 0.00341296928327645, - "latency": 40989.5802047782, - "throughput": 9.76666666666667, - } - `); + describe('with transactions and system metrics', () => { + const serviceName = 'synth-node-1'; + before(async () => { + const range = timerange(start, end); + const transactionName = 'foo'; + const instances = Array(3) + .fill(0) + .map((_, idx) => { + const index = idx + 1; + return { + instance: apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance(`instance-${index}`), + duration: index * 1000, + rate: index * 10, + errorRate: 5, + }; + }); + + return synthtrace.index( + instances.flatMap(({ instance, duration, rate, errorRate }) => { + const successfulTraceEvents = range + .interval('1m') + .rate(rate) + .generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(duration) + .success() + ); + const failedTraceEvents = range + .interval('1m') + .rate(errorRate) + .generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(duration) + .failure() + .errors( + instance + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + ); + const metricsets = range + .interval('30s') + .rate(1) + .generator((timestamp) => + instance + .appMetrics({ + 'system.memory.actual.free': 800, + 'system.memory.total': 1000, + 'system.cpu.total.norm.pct': 0.6, + 'system.process.cpu.total.norm.pct': 0.7, + }) + .timestamp(timestamp) + ); + return [successfulTraceEvents, failedTraceEvents, metricsets]; + }) + ); + }); - expectSnapshot(values); + after(() => { + return synthtrace.clean(); }); - }); - } - ); - registry.when( - 'Service overview instances main statistics when data is loaded with comparison', - { config: 'basic', archives: [archiveName] }, - () => { - describe('fetching java data', () => { - let response: { - body: APIReturnType<`GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics`>; - }; - - beforeEach(async () => { - response = await apmApiClient.readUser({ - endpoint: `GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics`, - params: { - path: { serviceName: 'opbeans-java' }, - query: { - latencyAggregationType: LatencyAggregationType.avg, - transactionType: 'request', - start: moment(end).subtract(15, 'minutes').toISOString(), - end, - offset: '15m', - environment: 'ENVIRONMENT_ALL', - kuery: '', + describe('test order of items', () => { + ( + [ + { + field: 'throughput', + direction: 'asc', + expectedServiceNodeNames: ['instance-1', 'instance-2', 'instance-3'], + expectedValues: [15, 25, 35], }, - }, - }); + { + field: 'throughput', + direction: 'desc', + expectedServiceNodeNames: ['instance-3', 'instance-2', 'instance-1'], + expectedValues: [35, 25, 15], + }, + { + field: 'latency', + direction: 'asc', + expectedServiceNodeNames: ['instance-1', 'instance-2', 'instance-3'], + expectedValues: [1000000, 2000000, 3000000], + }, + { + field: 'latency', + direction: 'desc', + expectedServiceNodeNames: ['instance-3', 'instance-2', 'instance-1'], + expectedValues: [3000000, 2000000, 1000000], + }, + { + field: 'serviceNodeName', + direction: 'asc', + expectedServiceNodeNames: ['instance-1', 'instance-2', 'instance-3'], + }, + { + field: 'serviceNodeName', + direction: 'desc', + expectedServiceNodeNames: ['instance-3', 'instance-2', 'instance-1'], + }, + ] as Array<{ + field: InstancesSortField; + direction: 'asc' | 'desc'; + expectedServiceNodeNames: string[]; + expectedValues?: number[]; + }> + ).map(({ field, direction, expectedServiceNodeNames, expectedValues }) => + describe(`fetch instances main statistics ordered by ${field} ${direction}`, () => { + let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; + + before(async () => { + instancesMainStats = await getServiceOverviewInstancesMainStatistics({ + serviceName, + sortField: field, + sortDirection: direction, + }); + }); + + it('returns ordered instance main stats', () => { + expect(instancesMainStats.map((item) => item.serviceNodeName)).to.eql( + expectedServiceNodeNames + ); + if (expectedValues) { + expect( + instancesMainStats.map((item) => { + const value = item[field]; + if (typeof value === 'number') { + return roundNumber(value); + } + return value; + }) + ).to.eql(expectedValues); + } + }); + + it('returns system metrics', () => { + expect(instancesMainStats.map((item) => roundNumber(item.cpuUsage))).to.eql([ + 0.7, 0.7, 0.7, + ]); + expect(instancesMainStats.map((item) => roundNumber(item.memoryUsage))).to.eql([ + 0.2, 0.2, 0.2, + ]); + }); + }) + ); }); + }); - it('returns a service node item', () => { - expect(response.body.currentPeriod.length).to.be.greaterThan(0); - expect(response.body.previousPeriod.length).to.be.greaterThan(0); + describe('with transactions only', () => { + const serviceName = 'synth-node-1'; + before(async () => { + const range = timerange(start, end); + const transactionName = 'foo'; + const instances = Array(3) + .fill(0) + .map((_, idx) => { + const index = idx + 1; + return { + instance: apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance(`instance-${index}`), + duration: index * 1000, + rate: index * 10, + errorRate: 5, + }; + }); + + return synthtrace.index( + instances.flatMap(({ instance, duration, rate, errorRate }) => { + const successfulTraceEvents = range + .interval('1m') + .rate(rate) + .generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(duration) + .success() + ); + const failedTraceEvents = range + .interval('1m') + .rate(errorRate) + .generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(duration) + .failure() + .errors( + instance + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + ); + return [successfulTraceEvents, failedTraceEvents]; + }) + ); }); - it('returns statistics for each service node', () => { - const currentItem = response.body.currentPeriod[0]; - - expect(isFiniteNumber(currentItem.cpuUsage)).to.be(true); - expect(isFiniteNumber(currentItem.memoryUsage)).to.be(true); - expect(isFiniteNumber(currentItem.errorRate)).to.be(true); - expect(isFiniteNumber(currentItem.throughput)).to.be(true); - expect(isFiniteNumber(currentItem.latency)).to.be(true); - - const previousItem = response.body.previousPeriod[0]; - - expect(isFiniteNumber(previousItem.cpuUsage)).to.be(true); - expect(isFiniteNumber(previousItem.memoryUsage)).to.be(true); - expect(isFiniteNumber(previousItem.errorRate)).to.be(true); - expect(isFiniteNumber(previousItem.throughput)).to.be(true); - expect(isFiniteNumber(previousItem.latency)).to.be(true); + after(() => { + return synthtrace.clean(); }); - it('returns the right data', () => { - const items = sortBy(response.body.previousPeriod, 'serviceNodeName'); + describe(`Fetch main statistics`, () => { + let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; - const serviceNodeNames = items.map((item) => item.serviceNodeName); + before(async () => { + instancesMainStats = await getServiceOverviewInstancesMainStatistics({ + serviceName, + }); + }); - expectSnapshot(items.length).toMatchInline(`1`); + it('returns instances name', () => { + expect(instancesMainStats.map((item) => item.serviceNodeName)).to.eql([ + 'instance-3', + 'instance-2', + 'instance-1', + ]); + }); - expectSnapshot(serviceNodeNames).toMatchInline(` - Array [ - "31651f3c624b81c55dd4633df0b5b9f9ab06b151121b0404ae796632cd1f87ad", - ] - `); + it('returns throughput', () => { + expect(sum(instancesMainStats.map((item) => item.throughput))).to.greaterThan(0); + }); - const item = items[0]; + it('returns latency', () => { + expect(sum(instancesMainStats.map((item) => item.latency))).to.greaterThan(0); + }); - const values = pick(item, [ - 'cpuUsage', - 'memoryUsage', - 'errorRate', - 'throughput', - 'latency', - ]); + it('returns errorRate', () => { + expect(sum(instancesMainStats.map((item) => item.errorRate))).to.greaterThan(0); + }); + + it('does not return cpu usage', () => { + expect( + instancesMainStats.map((item) => item.cpuUsage).filter((value) => value !== undefined) + ).to.eql([]); + }); - expectSnapshot(values).toMatchInline(` - Object { - "cpuUsage": 0.00223333333333333, - "errorRate": 0.0894308943089431, - "latency": 739013.634146341, - "memoryUsage": 0.783296203613281, - "throughput": 8.2, - } - `); + it('does not return memory usage', () => { + expect( + instancesMainStats + .map((item) => item.memoryUsage) + .filter((value) => value !== undefined) + ).to.eql([]); + }); }); }); - } - ); - - registry.when( - 'Service overview instances main statistics when data is generated', - { config: 'basic', archives: [] }, - () => { - describe('for two go instances and one java instance', () => { - const GO_A_INSTANCE_RATE_SUCCESS = 10; - const GO_A_INSTANCE_RATE_FAILURE = 5; - const GO_B_INSTANCE_RATE_SUCCESS = 15; - - const JAVA_INSTANCE_RATE = 20; - - const rangeStart = new Date('2021-01-01T12:00:00.000Z').getTime(); - const rangeEnd = new Date('2021-01-01T12:15:00.000Z').getTime() - 1; + describe('with system metrics only', () => { + const serviceName = 'synth-node-1'; before(async () => { - const goService = apm.service({ - name: 'opbeans-go', - environment: 'production', - agentName: 'go', - }); - const javaService = apm.service({ - name: 'opbeans-java', - environment: 'production', - agentName: 'java', - }); - - const goInstanceA = goService.instance('go-instance-a'); - const goInstanceB = goService.instance('go-instance-b'); - const javaInstance = javaService.instance('java-instance'); - - const interval = timerange(rangeStart, rangeEnd).interval('1m'); - - // include exit spans to generate span_destination metrics - // that should not be included - function withSpans(timestamp: number) { - return new Array(3).fill(undefined).map(() => - goInstanceA - .span({ - spanName: 'GET apm-*/_search', - spanType: 'db', - spanSubtype: 'elasticsearch', - }) - .timestamp(timestamp + 100) - .duration(300) - .destination('elasticsearch') - .success() + const range = timerange(start, end); + const instances = Array(3) + .fill(0) + .map((_, idx) => + apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance(`instance-${idx + 1}`) ); - } - return synthtraceEsClient.index([ - interval.rate(GO_A_INSTANCE_RATE_SUCCESS).generator((timestamp) => - goInstanceA - .transaction({ transactionName: 'GET /api/product/list' }) - .success() - .duration(500) - .timestamp(timestamp) - .children(...withSpans(timestamp)) - ), - interval.rate(GO_A_INSTANCE_RATE_FAILURE).generator((timestamp) => - goInstanceA - .transaction({ transactionName: 'GET /api/product/list' }) - .failure() - .duration(500) - .timestamp(timestamp) - .children(...withSpans(timestamp)) - ), - interval.rate(GO_B_INSTANCE_RATE_SUCCESS).generator((timestamp) => - goInstanceB - .transaction({ transactionName: 'GET /api/product/list' }) - .success() - .duration(500) - .timestamp(timestamp) - .children(...withSpans(timestamp)) - ), - interval.rate(JAVA_INSTANCE_RATE).generator((timestamp) => - javaInstance - .transaction({ transactionName: 'GET /api/product/list' }) - .success() - .duration(500) - .timestamp(timestamp) - .children(...withSpans(timestamp)) - ), - ]); + return synthtrace.index( + instances.map((instance) => { + const metricsets = range + .interval('30s') + .rate(1) + .generator((timestamp) => + instance + .appMetrics({ + 'system.memory.actual.free': 800, + 'system.memory.total': 1000, + 'system.cpu.total.norm.pct': 0.6, + 'system.process.cpu.total.norm.pct': 0.7, + }) + .timestamp(timestamp) + ); + return metricsets; + }) + ); }); - after(async () => { - return synthtraceEsClient.clean(); + after(() => { + return synthtrace.clean(); }); - describe('for the go service', () => { - let body: APIReturnType<'GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics'>; + describe(`Fetch main statistics`, () => { + let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; before(async () => { - body = ( - await apmApiClient.readUser({ - endpoint: - 'GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics', - params: { - path: { - serviceName: 'opbeans-go', - }, - query: { - start: new Date(rangeStart).toISOString(), - end: new Date(rangeEnd + 1).toISOString(), - environment: ENVIRONMENT_ALL.value, - kuery: '', - latencyAggregationType: LatencyAggregationType.avg, - transactionType: 'request', - }, - }, - }) - ).body; + instancesMainStats = await getServiceOverviewInstancesMainStatistics({ + serviceName, + }); }); - it('returns statistics for the go instances', () => { - const goAStats = body.currentPeriod.find( - (stat) => stat.serviceNodeName === 'go-instance-a' - ); - const goBStats = body.currentPeriod.find( - (stat) => stat.serviceNodeName === 'go-instance-b' - ); - - expect(goAStats?.throughput).to.eql( - GO_A_INSTANCE_RATE_SUCCESS + GO_A_INSTANCE_RATE_FAILURE - ); - - expect(goBStats?.throughput).to.eql(GO_B_INSTANCE_RATE_SUCCESS); + it('returns instances name', () => { + expect(instancesMainStats.map((item) => item.serviceNodeName)).to.eql([ + 'instance-1', + 'instance-2', + 'instance-3', + ]); }); - it('does not return data for the java service', () => { - const javaStats = body.currentPeriod.find( - (stat) => stat.serviceNodeName === 'java-instance' - ); - - expect(javaStats).to.be(undefined); + it('does not return throughput', () => { + expect( + instancesMainStats + .map((item) => item.throughput) + .filter((value) => value !== undefined) + ).to.eql([]); }); - it('does not return metrics', () => { - const goAStats = body.currentPeriod.find( - (stat) => stat.serviceNodeName === 'go-instance-a' - ); + it('does not return latency', () => { + expect( + instancesMainStats.map((item) => item.latency).filter((value) => value !== undefined) + ).to.eql([]); + }); - expect(goAStats).to.not.be(undefined); - expect(goAStats?.memoryUsage).to.be(undefined); - expect(goAStats?.cpuUsage).to.be(undefined); + it('does not return errorRate', () => { + expect( + instancesMainStats + .map((item) => item.errorRate) + .filter((value) => value !== undefined) + ).to.eql([]); }); - it('does not return data for missing service node name', () => { - const missingNameStats = body.currentPeriod.find( - (stat) => stat.serviceNodeName === SERVICE_NODE_NAME_MISSING - ); + it('returns cpu usage', () => { + expect(sum(instancesMainStats.map((item) => item.cpuUsage))).to.greaterThan(0); + }); - expect(missingNameStats).to.be(undefined); + it('returns memory usage', () => { + expect(sum(instancesMainStats.map((item) => item.memoryUsage))).to.greaterThan(0); }); }); }); diff --git a/x-pack/test/apm_api_integration/tests/services/agent.spec.ts b/x-pack/test/apm_api_integration/tests/services/agent.spec.ts index 69f1938192b9e..2dc676ffe5a34 100644 --- a/x-pack/test/apm_api_integration/tests/services/agent.spec.ts +++ b/x-pack/test/apm_api_integration/tests/services/agent.spec.ts @@ -34,7 +34,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); }); - registry.when( + // FLAKY: https://github.com/elastic/kibana/issues/175756 + registry.when.skip( 'Agent name when data is loaded', { config: 'basic', archives: [archiveName] }, () => { diff --git a/x-pack/test/apm_api_integration/tests/services/top_services.spec.ts b/x-pack/test/apm_api_integration/tests/services/top_services.spec.ts index b519a28de70e8..b6dc025ecef10 100644 --- a/x-pack/test/apm_api_integration/tests/services/top_services.spec.ts +++ b/x-pack/test/apm_api_integration/tests/services/top_services.spec.ts @@ -56,7 +56,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { expect(response.status).to.be(200); expect(response.body.items.length).to.be(0); - expect(response.body.maxServiceCountExceeded).to.be(false); + expect(response.body.maxCountExceeded).to.be(false); expect(response.body.serviceOverflowCount).to.be(0); }); } diff --git a/x-pack/test/apm_api_integration/tests/throughput/service_apis.spec.ts b/x-pack/test/apm_api_integration/tests/throughput/service_apis.spec.ts index 8294797a08949..8dcb782c78a03 100644 --- a/x-pack/test/apm_api_integration/tests/throughput/service_apis.spec.ts +++ b/x-pack/test/apm_api_integration/tests/throughput/service_apis.spec.ts @@ -109,6 +109,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { kuery: `processor.event : "${processorEvent}"`, transactionType: 'request', latencyAggregationType: 'avg' as LatencyAggregationType, + sortField: 'throughput', + sortDirection: 'desc', }, }, }), diff --git a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_main_statistics.spec.ts b/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_main_statistics.spec.ts index 3a7fedc76ef3e..91682c0edf796 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_main_statistics.spec.ts +++ b/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_main_statistics.spec.ts @@ -68,7 +68,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { const transactionsGroupsPrimaryStatistics = await callApi(); expect(transactionsGroupsPrimaryStatistics.transactionGroups).to.empty(); - expect(transactionsGroupsPrimaryStatistics.maxTransactionGroupsExceeded).to.be(false); + expect(transactionsGroupsPrimaryStatistics.maxCountExceeded).to.be(false); }); } ); @@ -138,7 +138,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { transactionsGroupsPrimaryStatisticsWithDurationSummaryTrue, ].forEach((statistics) => { expect(statistics.transactionGroups.length).to.be(3); - expect(statistics.maxTransactionGroupsExceeded).to.be(false); + expect(statistics.maxCountExceeded).to.be(false); expect(statistics.transactionGroups.map(({ name }) => name)).to.eql( transactions.map(({ name }) => name) ); diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/user_actions_get_users.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/user_actions_get_users.ts index e49c48fbf2347..c1edd4280be85 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/user_actions_get_users.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/user_actions_get_users.ts @@ -43,6 +43,10 @@ export default ({ getService }: FtrProviderContext): void => { const es = getService('es'); const kibanaServer = getService('kibanaServer'); + // Use simple image data URL to match server side validation of image type + const IMAGE_URL_TEST = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAIBJREFUeF7t14ERACAMAjG6/9A6yMcROEuOe9tb+J0A/AAnoAPCHTglSAEKUIACFAgngEEMYhCDGAwjYAxhEIMYxCAGMRhOAIMYxCAGMRhGwBrEIAYxiEEMYjCcAAYxiEEMYjCMgDWIQQxiEIMYxGA4AQxiEIMYxGAYAWsQg3UGPw2Yf8EFsz4JAAAAAElFTkSuQmCC'; + describe('user_actions_get_users', () => { afterEach(async () => { await deleteAllCaseItems(es); @@ -160,7 +164,7 @@ export default ({ getService }: FtrProviderContext): void => { req: { initials: 'ES', color: '#6092C0', - imageUrl: 'my-image', + imageUrl: IMAGE_URL_TEST, }, headers: superUserHeaders, }); diff --git a/x-pack/test/cloud_security_posture_functional/page_objects/rule_page.ts b/x-pack/test/cloud_security_posture_functional/page_objects/rule_page.ts index 7547bf67be8ab..0f8891dcb3b94 100644 --- a/x-pack/test/cloud_security_posture_functional/page_objects/rule_page.ts +++ b/x-pack/test/cloud_security_posture_functional/page_objects/rule_page.ts @@ -23,6 +23,8 @@ export const RULES_ENABLED_FILTER = 'rules-enabled-filter'; export const CIS_SECTION_FILTER = 'options-filter-popover-button-cis-section-multi-select-filter'; export const RULE_NUMBER_FILTER = 'options-filter-popover-button-rule-number-multi-select-filter'; export const RULE_NUMBER_FILTER_SEARCH_FIELD = 'rule-number-search-input'; +export const RULES_FLYOUT_SWITCH_BUTTON = 'rule-flyout-switch-button'; +export const TAKE_ACTION_BUTTON = 'csp:take_action'; export function RulePagePageProvider({ getService, getPageObjects }: FtrProviderContext) { const testSubjects = getService('testSubjects'); @@ -110,6 +112,33 @@ export function RulePagePageProvider({ getService, getPageObjects }: FtrProvider await textField.type(value); await PageObjects.header.waitUntilLoadingHasFinished(); }, + + clickRulesNames: async (index: number) => { + const rulesNames = await testSubjects.findAll('csp_rules_table_row_item_name'); + await rulesNames[index].click(); + }, + + clickFlyoutEnableSwitchButton: async () => { + const rulesFlyoutEnableSwitchButton = await testSubjects.find(RULES_FLYOUT_SWITCH_BUTTON); + await rulesFlyoutEnableSwitchButton.click(); + }, + + getEnableSwitchButtonState: async () => { + const rulesFlyoutEnableSwitchButton = await testSubjects.find(RULES_FLYOUT_SWITCH_BUTTON); + return await rulesFlyoutEnableSwitchButton.getAttribute('aria-checked'); + }, + + clickTakeActionButton: async () => { + const takeActionButton = await testSubjects.find(TAKE_ACTION_BUTTON); + await takeActionButton.click(); + }, + + clickTakeActionButtonOption: async (action: 'enable' | 'disable') => { + const takeActionOption = await testSubjects.find( + action + '-benchmark-rule-take-action-button' + ); + await takeActionOption.click(); + }, }; const navigateToRulePage = async (benchmarkCisId: string, benchmarkCisVersion: string) => { diff --git a/x-pack/test/cloud_security_posture_functional/pages/rules.ts b/x-pack/test/cloud_security_posture_functional/pages/rules.ts index 4841c9ad6b8b3..1dec5a494dc2a 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/rules.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/rules.ts @@ -27,7 +27,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { 'findings', ]); - describe('Cloud Posture Rules Page', function () { + // Failing: See https://github.com/elastic/kibana/issues/175905 + describe.skip('Cloud Posture Rules Page', function () { this.tags(['cloud_security_posture_rules_page']); let rule: typeof pageObjects.rule; @@ -66,7 +67,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await esArchiver.unload('x-pack/test/functional/es_archives/fleet/empty_fleet_server'); }); - describe('Rules Page - Bulk Action buttons', () => { + // FLAKY: https://github.com/elastic/kibana/issues/175614 + describe.skip('Rules Page - Bulk Action buttons', () => { it('It should disable both Enable and Disable options when there are no rules selected', async () => { await rule.rulePage.toggleBulkActionButton(); expect( @@ -163,5 +165,21 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { expect((await rule.rulePage.getEnableRulesRowSwitchButton()) === 1).to.be(true); }); }); + + describe('Rules Page - Flyout', () => { + it('Users are able to Enable/Disable Rule from Switch on Rule Flyout', async () => { + await rule.rulePage.clickRulesNames(0); + await rule.rulePage.clickFlyoutEnableSwitchButton(); + await pageObjects.header.waitUntilLoadingHasFinished(); + expect((await rule.rulePage.getEnableSwitchButtonState()) === 'false').to.be(true); + }); + it('Users are able to Enable/Disable Rule from Take Action on Rule Flyout', async () => { + await rule.rulePage.clickRulesNames(0); + await rule.rulePage.clickTakeActionButton(); + await rule.rulePage.clickTakeActionButtonOption('enable'); + await pageObjects.header.waitUntilLoadingHasFinished(); + expect((await rule.rulePage.getEnableSwitchButtonState()) === 'true').to.be(true); + }); + }); }); } diff --git a/x-pack/test/functional/apps/managed_content/managed_content.ts b/x-pack/test/functional/apps/managed_content/managed_content.ts index 2ba7d1ce0b4ed..05d30c248f0ea 100644 --- a/x-pack/test/functional/apps/managed_content/managed_content.ts +++ b/x-pack/test/functional/apps/managed_content/managed_content.ts @@ -9,7 +9,7 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getPageObjects, getService }: FtrProviderContext) { - const PageObjects = getPageObjects(['timePicker', 'lens', 'common', 'discover']); + const PageObjects = getPageObjects(['timePicker', 'lens', 'common', 'discover', 'maps']); const kibanaServer = getService('kibanaServer'); const esArchiver = getService('esArchiver'); const testSubjects = getService('testSubjects'); @@ -76,5 +76,23 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await expectManagedContentSignifiers(false, 'discoverSaveButton'); }); + + it('maps', async () => { + await PageObjects.common.navigateToActualUrl( + 'maps', + 'map/managed-d7ab-46eb-a807-8fed28ed8566' + ); + await PageObjects.maps.waitForLayerAddPanelClosed(); + + await expectManagedContentSignifiers(true, 'mapSaveButton'); + + await PageObjects.common.navigateToActualUrl( + 'maps', + 'map/unmanaged-d7ab-46eb-a807-8fed28ed8566' + ); + await PageObjects.maps.waitForLayerAddPanelClosed(); + + await expectManagedContentSignifiers(false, 'mapSaveButton'); + }); }); } diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/custom_urls.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/custom_urls.ts index dac2d1ae1fa36..17f07c0d26297 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/custom_urls.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/custom_urls.ts @@ -38,7 +38,8 @@ export default function ({ getService }: FtrProviderContext) { const ml = getService('ml'); const browser = getService('browser'); - describe('custom urls', function () { + // FLAKY: https://github.com/elastic/kibana/issues/164224 + describe.skip('custom urls', function () { const dfaJobId = `fq_regression_${Date.now()}`; const generateDestinationIndex = (analyticsId: string) => `user-${analyticsId}`; let testDashboardId: string | null = null; diff --git a/x-pack/test/functional/apps/observability_log_explorer/app.ts b/x-pack/test/functional/apps/observability_logs_explorer/app.ts similarity index 87% rename from x-pack/test/functional/apps/observability_log_explorer/app.ts rename to x-pack/test/functional/apps/observability_logs_explorer/app.ts index 5d6c85e3c7518..87da77752e58d 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/app.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/app.ts @@ -9,7 +9,7 @@ import { log, timerange } from '@kbn/apm-synthtrace-client'; import { FtrProviderContext } from './config'; export default function ({ getService, getPageObjects }: FtrProviderContext) { - const PageObjects = getPageObjects(['common', 'navigationalSearch', 'observabilityLogExplorer']); + const PageObjects = getPageObjects(['common', 'navigationalSearch', 'observabilityLogsExplorer']); const testSubjects = getService('testSubjects'); const synthtrace = getService('logSynthtraceEsClient'); const dataGrid = getService('dataGrid'); @@ -17,15 +17,15 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('Application', () => { it('is shown in the global search', async () => { await PageObjects.common.navigateToApp('home'); - await PageObjects.navigationalSearch.searchFor('log explorer'); + await PageObjects.navigationalSearch.searchFor('logs explorer'); const results = await PageObjects.navigationalSearch.getDisplayedResults(); expect(results[0].label).to.eql('Logs Explorer'); }); it('is shown in the observability side navigation', async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); - await testSubjects.existOrFail('observability-nav-observability-log-explorer-explorer'); + await PageObjects.observabilityLogsExplorer.navigateTo(); + await testSubjects.existOrFail('observability-nav-observability-logs-explorer-explorer'); }); it('should load logs', async () => { @@ -33,7 +33,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const to = '2023-08-03T10:24:14.091Z'; const COUNT = 5; await synthtrace.index(generateLogsData({ from, to, count: COUNT })); - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); const docCount = await dataGrid.getDocCount(); expect(docCount).to.be(COUNT); diff --git a/x-pack/test/functional/apps/observability_log_explorer/columns_selection.ts b/x-pack/test/functional/apps/observability_logs_explorer/columns_selection.ts similarity index 96% rename from x-pack/test/functional/apps/observability_log_explorer/columns_selection.ts rename to x-pack/test/functional/apps/observability_logs_explorer/columns_selection.ts index 0433b3a9762ce..e6291e4d8fc01 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/columns_selection.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/columns_selection.ts @@ -13,7 +13,7 @@ const defaultLogColumns = ['@timestamp', 'resource', 'content']; export default function ({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); - const PageObjects = getPageObjects(['discover', 'observabilityLogExplorer']); + const PageObjects = getPageObjects(['discover', 'observabilityLogsExplorer']); const synthtrace = getService('logSynthtraceEsClient'); const dataGrid = getService('dataGrid'); const testSubjects = getService('testSubjects'); @@ -21,8 +21,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const to = '2023-12-27T10:25:14.091Z'; const TEST_TIMEOUT = 10 * 1000; // 10 secs - const navigateToLogExplorer = () => - PageObjects.observabilityLogExplorer.navigateTo({ + const navigateToLogsExplorer = () => + PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from, @@ -32,10 +32,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }, }); - describe('When the log explorer loads', () => { + describe('When the logs explorer loads', () => { before(async () => { await synthtrace.index(generateLogsData({ to })); - await navigateToLogExplorer(); + await navigateToLogsExplorer(); }); after(async () => { @@ -50,7 +50,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should restore the table columns from the URL state if exists', async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from, @@ -123,7 +123,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(cellValue.includes('event.original')).to.be(false); const cellAttribute = await cellElement.findByTestSubject( - 'logExplorerCellDescriptionList' + 'logsExplorerCellDescriptionList' ); expect(cellAttribute).not.to.be.empty(); }); @@ -137,7 +137,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('on cell expansion with message field should open regular popover', async () => { - await navigateToLogExplorer(); + await navigateToLogsExplorer(); await retry.tryForTime(TEST_TIMEOUT, async () => { await dataGrid.clickCellExpandButton(3, 4); await testSubjects.existOrFail('euiDataGridExpansionPopover'); @@ -158,7 +158,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('virtual column cell actions', async () => { beforeEach(async () => { - await navigateToLogExplorer(); + await navigateToLogsExplorer(); }); it('should render a popover with cell actions when a chip on content column is clicked', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { diff --git a/x-pack/test/functional/apps/observability_log_explorer/config.ts b/x-pack/test/functional/apps/observability_logs_explorer/config.ts similarity index 100% rename from x-pack/test/functional/apps/observability_log_explorer/config.ts rename to x-pack/test/functional/apps/observability_logs_explorer/config.ts diff --git a/x-pack/test/functional/apps/observability_log_explorer/dataset_selection_state.ts b/x-pack/test/functional/apps/observability_logs_explorer/dataset_selection_state.ts similarity index 75% rename from x-pack/test/functional/apps/observability_log_explorer/dataset_selection_state.ts rename to x-pack/test/functional/apps/observability_logs_explorer/dataset_selection_state.ts index d8083c4e1e2e1..8cf11615152e1 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/dataset_selection_state.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/dataset_selection_state.ts @@ -25,14 +25,14 @@ const azureActivityDatasetSelection: DatasetSelectionPlain = { export default function ({ getService, getPageObjects }: FtrProviderContext) { const browser = getService('browser'); const retry = getService('retry'); - const PageObjects = getPageObjects(['common', 'observabilityLogExplorer']); + const PageObjects = getPageObjects(['common', 'observabilityLogsExplorer']); describe('DatasetSelection initialization and update', () => { describe('when no dataset selection is given', () => { it('should initialize the "All logs" selection', async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); const datasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(datasetSelectionTitle).to.be('All logs'); }); @@ -40,20 +40,20 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when a dataset selection is given', () => { it('should restore the selection from a valid encoded index', async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { datasetSelection: azureActivityDatasetSelection, }, }); const datasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(datasetSelectionTitle).to.be('[Azure Logs] activitylogs'); }); it('should fallback to the "All logs" selection and notify the user of an invalid encoded index', async () => { - await PageObjects.observabilityLogExplorer.navigateToWithUncheckedState({ + await PageObjects.observabilityLogsExplorer.navigateToWithUncheckedState({ pageState: { v: 1, datasetSelection: { @@ -63,41 +63,41 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); const datasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); - await PageObjects.observabilityLogExplorer.assertRestoreFailureToastExist(); + await PageObjects.observabilityLogsExplorer.assertRestoreFailureToastExist(); expect(datasetSelectionTitle).to.be('All logs'); }); }); describe('when navigating back and forth on the page history', () => { it('should decode and restore the selection for the current index', async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); const allDatasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(allDatasetSelectionTitle).to.be('All logs'); - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { datasetSelection: azureActivityDatasetSelection, }, }); const azureDatasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(azureDatasetSelectionTitle).to.be('[Azure Logs] activitylogs'); // Go back to previous page selection await retry.tryForTime(30 * 1000, async () => { await browser.goBack(); const backNavigationDatasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(backNavigationDatasetSelectionTitle).to.be('All logs'); }); // Go forward to previous page selection await retry.tryForTime(30 * 1000, async () => { await browser.goForward(); const forwardNavigationDatasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(forwardNavigationDatasetSelectionTitle).to.be('[Azure Logs] activitylogs'); }); }); diff --git a/x-pack/test/functional/apps/observability_log_explorer/dataset_selector.ts b/x-pack/test/functional/apps/observability_logs_explorer/dataset_selector.ts similarity index 73% rename from x-pack/test/functional/apps/observability_log_explorer/dataset_selector.ts rename to x-pack/test/functional/apps/observability_logs_explorer/dataset_selector.ts index 1d7eae0129ce6..9e2dcd1d7c41c 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/dataset_selector.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/dataset_selector.ts @@ -26,7 +26,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const kibanaServer = getService('kibanaServer'); const retry = getService('retry'); - const PageObjects = getPageObjects(['common', 'discover', 'observabilityLogExplorer']); + const PageObjects = getPageObjects(['common', 'discover', 'observabilityLogsExplorer']); const noIntegrationsTitle = 'No integrations found'; const noUncategorizedTitle = 'No data streams found'; @@ -34,7 +34,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('Dataset Selector', () => { before(async () => { await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); - await PageObjects.observabilityLogExplorer.removeInstalledPackages(); + await PageObjects.observabilityLogsExplorer.removeInstalledPackages(); }); after(async () => { @@ -43,18 +43,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('as consistent behavior', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); }); it('should always display the Integrations Uncategorized and Data Views top level tabs', async () => { - const integrationsTab = await PageObjects.observabilityLogExplorer.getIntegrationsTab(); - const uncategorizedTab = await PageObjects.observabilityLogExplorer.getUncategorizedTab(); - const dataViewsTab = await PageObjects.observabilityLogExplorer.getDataViewsTab(); + const integrationsTab = await PageObjects.observabilityLogsExplorer.getIntegrationsTab(); + const uncategorizedTab = await PageObjects.observabilityLogsExplorer.getUncategorizedTab(); + const dataViewsTab = await PageObjects.observabilityLogsExplorer.getDataViewsTab(); expect(await integrationsTab.isDisplayed()).to.be(true); expect(await integrationsTab.getVisibleText()).to.be('Integrations'); @@ -66,7 +66,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should always display the "Show all logs" action', async () => { const allLogDatasetButton = - await PageObjects.observabilityLogExplorer.getAllLogDatasetsButton(); + await PageObjects.observabilityLogsExplorer.getAllLogDatasetsButton(); const allLogDatasetTitle = await allLogDatasetButton.getVisibleText(); @@ -78,17 +78,17 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // Skip the test in case network condition utils are not available try { await retry.try(async () => { - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noIntegrationsTitle ); }); await PageObjects.common.sleep(5000); await browser.setNetworkConditions('OFFLINE'); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('a'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('a'); await retry.try(async () => { - await PageObjects.observabilityLogExplorer.assertListStatusErrorPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusErrorPromptExistsWithTitle( noIntegrationsTitle ); }); @@ -100,14 +100,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should display an empty prompt for no integrations', async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(menuEntries.length).to.be(0); - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noIntegrationsTitle ); }); @@ -119,10 +119,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { try { await browser.setNetworkConditions('SLOW_3G'); // Almost stuck network conditions const uncategorizedTab = - await PageObjects.observabilityLogExplorer.getUncategorizedTab(); + await PageObjects.observabilityLogsExplorer.getUncategorizedTab(); await uncategorizedTab.click(); - await PageObjects.observabilityLogExplorer.assertLoadingSkeletonExists(); + await PageObjects.observabilityLogsExplorer.assertLoadingSkeletonExists(); await browser.restoreNetworkConditions(); } catch (error) { @@ -131,23 +131,24 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should display an error prompt if could not retrieve the datasets', async function () { - const uncategorizedTab = await PageObjects.observabilityLogExplorer.getUncategorizedTab(); + const uncategorizedTab = + await PageObjects.observabilityLogsExplorer.getUncategorizedTab(); await uncategorizedTab.click(); // Skip the test in case network condition utils are not available try { await retry.try(async () => { - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noUncategorizedTitle ); }); await PageObjects.common.sleep(5000); await browser.setNetworkConditions('OFFLINE'); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('a'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('a'); await retry.try(async () => { - await PageObjects.observabilityLogExplorer.assertListStatusErrorPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusErrorPromptExistsWithTitle( noUncategorizedTitle ); }); @@ -159,18 +160,19 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should display an empty prompt for no uncategorized data streams', async () => { - const uncategorizedTab = await PageObjects.observabilityLogExplorer.getUncategorizedTab(); + const uncategorizedTab = + await PageObjects.observabilityLogsExplorer.getUncategorizedTab(); await uncategorizedTab.click(); - const uncategorizedEntries = await PageObjects.observabilityLogExplorer + const uncategorizedEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(uncategorizedEntries.length).to.be(0); - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noUncategorizedTitle ); }); @@ -182,31 +184,31 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { before(async () => { await esArchiver.load( - 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + 'x-pack/test/functional/es_archives/observability_logs_explorer/data_streams' ); cleanupIntegrationsSetup = - await PageObjects.observabilityLogExplorer.setupInitialIntegrations(); + await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); }); after(async () => { await esArchiver.unload( - 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + 'x-pack/test/functional/es_archives/observability_logs_explorer/data_streams' ); await cleanupIntegrationsSetup(); }); describe('when open on the integrations tab', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); }); it('should display a list of installed integrations', async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations.length).to.be(3); expect(integrations).to.eql(initialPackagesTexts); @@ -214,55 +216,55 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should sort the integrations list by the clicked sorting option', async () => { // Test ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql(initialPackagesTexts); }); // Test descending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('desc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('desc'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql(initialPackagesTexts.slice().reverse()); }); // Test back ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql(initialPackagesTexts); }); }); it('should filter the integrations list by the typed integration name', async () => { - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('system'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('system'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.system]); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('a'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('a'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.apache, initialPackageMap.aws]); }); }); it('should display an empty prompt when the search does not match any result', async () => { - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('no result search text'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('no result search text'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations.length).to.be(0); }); - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noIntegrationsTitle ); }); @@ -270,28 +272,28 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should load more integrations by scrolling to the end of the list', async () => { // Install more integrations and reload the page const cleanupAdditionalSetup = - await PageObjects.observabilityLogExplorer.setupAdditionalIntegrations(); + await PageObjects.observabilityLogsExplorer.setupAdditionalIntegrations(); await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); // Initially fetched integrations await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(nodes.length).to.be(15); await nodes.at(-1)?.scrollIntoView(); }); // Load more integrations await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(nodes.length).to.be(20); await nodes.at(-1)?.scrollIntoView(); }); // No other integrations to load after scrolling to last integration await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(nodes.length).to.be(20); }); @@ -300,28 +302,28 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('clicking on integration and moving into the second navigation level', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); }); it('should display a list of available datasets', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { const [panelTitleNode, integrationDatasetEntries] = - await PageObjects.observabilityLogExplorer + await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -333,27 +335,27 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should sort the datasets list by the clicked sorting option', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); expect(await panelTitleNode.getVisibleText()).to.be('Apache HTTP Server'); }); // Test ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be('access'); @@ -361,12 +363,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); // Test descending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('desc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('desc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be('error'); @@ -374,12 +376,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); // Test back ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be('access'); @@ -389,38 +391,38 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should filter the datasets list by the typed dataset name', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); expect(await panelTitleNode.getVisibleText()).to.be('Apache HTTP Server'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be('access'); expect(await menuEntries[1].getVisibleText()).to.be('error'); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('err'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('err'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(menuEntries.length).to.be(1); @@ -430,25 +432,25 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should update the current selection with the clicked dataset', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); expect(await panelTitleNode.getVisibleText()).to.be('Apache HTTP Server'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be('access'); @@ -457,7 +459,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const selectorButton = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButton(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButton(); expect(await selectorButton.getVisibleText()).to.be('[Apache HTTP Server] access'); }); @@ -467,25 +469,25 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when open on the uncategorized tab', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); - await PageObjects.observabilityLogExplorer + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer .getUncategorizedTab() .then((tab: WebElementWrapper) => tab.click()); }); it('should display a list of available datasets', async () => { await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -498,22 +500,22 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should sort the datasets list by the clicked sorting option', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); expect(await panelTitleNode.getVisibleText()).to.be('Uncategorized'); }); // Test ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); @@ -522,12 +524,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); // Test descending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('desc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('desc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[2]); @@ -536,12 +538,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); // Test back ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); @@ -552,20 +554,20 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should filter the datasets list by the typed dataset name', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); expect(await panelTitleNode.getVisibleText()).to.be('Uncategorized'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); @@ -573,13 +575,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await menuEntries[2].getVisibleText()).to.be(expectedUncategorized[2]); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('retail'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('retail'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(menuEntries.length).to.be(1); @@ -589,20 +591,20 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should update the current selection with the clicked dataset', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); expect(await panelTitleNode.getVisibleText()).to.be('Uncategorized'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); @@ -611,7 +613,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const selectorButton = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButton(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButton(); expect(await selectorButton.getVisibleText()).to.be(expectedUncategorized[0]); }); @@ -620,30 +622,30 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when open on the data views tab', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); - await PageObjects.observabilityLogExplorer + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer .getDataViewsTab() .then((tab: WebElementWrapper) => tab.click()); }); it('should display a list of available data views', async () => { await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu: WebElementWrapper) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); expect( - await PageObjects.observabilityLogExplorer.getDataViewsContextMenuTitle( + await PageObjects.observabilityLogsExplorer.getDataViewsContextMenuTitle( panelTitleNode ) ).to.be('Data Views'); @@ -655,26 +657,26 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should sort the data views list by the clicked sorting option', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); expect( - await PageObjects.observabilityLogExplorer.getDataViewsContextMenuTitle( + await PageObjects.observabilityLogsExplorer.getDataViewsContextMenuTitle( panelTitleNode ) ).to.be('Data Views'); }); // Test descending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('desc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('desc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be(sortedExpectedDataViews[2]); @@ -683,12 +685,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); // Test back ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be(sortedExpectedDataViews[0]); @@ -699,24 +701,24 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should filter the datasets list by the typed data view name', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); expect( - await PageObjects.observabilityLogExplorer.getDataViewsContextMenuTitle( + await PageObjects.observabilityLogsExplorer.getDataViewsContextMenuTitle( panelTitleNode ) ).to.be('Data Views'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be(expectedDataViews[0]); @@ -724,13 +726,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await menuEntries[2].getVisibleText()).to.be(expectedDataViews[2]); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('logs'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('logs'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(menuEntries.length).to.be(2); @@ -741,24 +743,24 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should navigate to Discover with the clicked data view preselected', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); expect( - await PageObjects.observabilityLogExplorer.getDataViewsContextMenuTitle( + await PageObjects.observabilityLogsExplorer.getDataViewsContextMenuTitle( panelTitleNode ) ).to.be('Data Views'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[2].getVisibleText()).to.be(expectedDataViews[2]); @@ -775,27 +777,27 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when open/close the selector', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); }); it('should restore the latest navigation panel', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -804,16 +806,16 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await menuEntries[1].getVisibleText()).to.be('error'); }); - await PageObjects.observabilityLogExplorer.closeDatasetSelector(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.closeDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -824,18 +826,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should restore the latest search results', async () => { - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('system'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('system'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.system]); }); - await PageObjects.observabilityLogExplorer.closeDatasetSelector(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.closeDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.system]); }); }); @@ -843,29 +845,29 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when switching between tabs or integration panels', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); it('should remember the latest search and restore its results', async () => { - await PageObjects.observabilityLogExplorer.openDatasetSelector(); - await PageObjects.observabilityLogExplorer.clearSearchField(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.clearSearchField(); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('apache'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('apache'); await retry.try(async () => { const { nodes, integrations } = - await PageObjects.observabilityLogExplorer.getIntegrations(); + await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.apache]); nodes[0].click(); }); await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -874,13 +876,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await menuEntries[1].getVisibleText()).to.be('error'); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('err'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('err'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(menuEntries.length).to.be(1); @@ -888,32 +890,32 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); // Navigate back to integrations - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); panelTitleNode.click(); await retry.try(async () => { const { nodes, integrations } = - await PageObjects.observabilityLogExplorer.getIntegrations(); + await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.apache]); - const searchValue = await PageObjects.observabilityLogExplorer.getSearchFieldValue(); + const searchValue = await PageObjects.observabilityLogsExplorer.getSearchFieldValue(); expect(searchValue).to.eql('apache'); nodes[0].click(); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); - const searchValue = await PageObjects.observabilityLogExplorer.getSearchFieldValue(); + const searchValue = await PageObjects.observabilityLogsExplorer.getSearchFieldValue(); expect(searchValue).to.eql('err'); expect(menuEntries.length).to.be(1); diff --git a/x-pack/test/functional/apps/observability_log_explorer/filter_controls.ts b/x-pack/test/functional/apps/observability_logs_explorer/filter_controls.ts similarity index 88% rename from x-pack/test/functional/apps/observability_log_explorer/filter_controls.ts rename to x-pack/test/functional/apps/observability_logs_explorer/filter_controls.ts index 36087a23e8c4c..bb75b12004e77 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/filter_controls.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/filter_controls.ts @@ -8,7 +8,7 @@ import { FtrProviderContext } from './config'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); - const PageObjects = getPageObjects(['observabilityLogExplorer']); + const PageObjects = getPageObjects(['observabilityLogsExplorer']); const testSubjects = getService('testSubjects'); describe('Filter controls customization', () => { @@ -21,7 +21,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('renders a filter controls section as part of the unified search bar', async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); await testSubjects.existOrFail('datasetFiltersCustomization', { allowHidden: true }); }); }); diff --git a/x-pack/test/functional/apps/observability_log_explorer/flyout.ts b/x-pack/test/functional/apps/observability_logs_explorer/flyout.ts similarity index 77% rename from x-pack/test/functional/apps/observability_log_explorer/flyout.ts rename to x-pack/test/functional/apps/observability_logs_explorer/flyout.ts index 11c161b5f4f8d..8e478755794a6 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/flyout.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/flyout.ts @@ -34,21 +34,21 @@ const docs = [ export default function ({ getService, getPageObjects }: FtrProviderContext) { const dataGrid = getService('dataGrid'); const testSubjects = getService('testSubjects'); - const PageObjects = getPageObjects(['observabilityLogExplorer']); + const PageObjects = getPageObjects(['observabilityLogsExplorer']); describe('Flyout content customization', () => { let cleanupDataStreamSetup: () => Promise; before('initialize tests', async () => { - cleanupDataStreamSetup = await PageObjects.observabilityLogExplorer.setupDataStream( + cleanupDataStreamSetup = await PageObjects.observabilityLogsExplorer.setupDataStream( DATASET_NAME, NAMESPACE ); - await PageObjects.observabilityLogExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); + await PageObjects.observabilityLogsExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); }); beforeEach(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from: new Date(NOW - 60_000).toISOString(), @@ -67,30 +67,30 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should mount the flyout customization content', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutDetail'); + await testSubjects.existOrFail('logsExplorerFlyoutDetail'); }); it('should display a timestamp badge', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutLogTimestamp'); + await testSubjects.existOrFail('logsExplorerFlyoutLogTimestamp'); }); it('should display a log level badge when available', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutLogLevel'); + await testSubjects.existOrFail('logsExplorerFlyoutLogLevel'); await dataGrid.closeFlyout(); await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.missingOrFail('logExplorerFlyoutLogLevel'); + await testSubjects.missingOrFail('logsExplorerFlyoutLogLevel'); }); it('should display a message code block when available', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutLogMessage'); + await testSubjects.existOrFail('logsExplorerFlyoutLogMessage'); await dataGrid.closeFlyout(); await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.missingOrFail('logExplorerFlyoutLogMessage'); + await testSubjects.missingOrFail('logsExplorerFlyoutLogMessage'); }); }); } diff --git a/x-pack/test/functional/apps/observability_log_explorer/flyout_highlights.ts b/x-pack/test/functional/apps/observability_logs_explorer/flyout_highlights.ts similarity index 61% rename from x-pack/test/functional/apps/observability_log_explorer/flyout_highlights.ts rename to x-pack/test/functional/apps/observability_logs_explorer/flyout_highlights.ts index f0c457167c190..678c76bde9f2f 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/flyout_highlights.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/flyout_highlights.ts @@ -35,7 +35,7 @@ const sharedDoc = { export default function ({ getService, getPageObjects }: FtrProviderContext) { const dataGrid = getService('dataGrid'); const testSubjects = getService('testSubjects'); - const PageObjects = getPageObjects(['observabilityLogExplorer']); + const PageObjects = getPageObjects(['observabilityLogsExplorer']); describe('Flyout highlight customization', () => { let cleanupDataStreamSetup: () => Promise; @@ -61,11 +61,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const docs = [sharedDoc, docWithoutServiceName, docWithoutServiceInfraContainer]; before('setup DataStream', async () => { - cleanupDataStreamSetup = await PageObjects.observabilityLogExplorer.setupDataStream( + cleanupDataStreamSetup = await PageObjects.observabilityLogsExplorer.setupDataStream( DATASET_NAME, NAMESPACE ); - await PageObjects.observabilityLogExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); + await PageObjects.observabilityLogsExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); }); after('clean up DataStream', async () => { @@ -75,7 +75,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); beforeEach(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from: new Date(NOW - 60_000).toISOString(), @@ -88,29 +88,29 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should load the service container with all fields', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionServiceInfra'); - await testSubjects.existOrFail('logExplorerFlyoutService'); - await testSubjects.existOrFail('logExplorerFlyoutTrace'); - await testSubjects.existOrFail('logExplorerFlyoutHostName'); - await testSubjects.existOrFail('logExplorerFlyoutClusterName'); - await testSubjects.existOrFail('logExplorerFlyoutResourceId'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionServiceInfra'); + await testSubjects.existOrFail('logsExplorerFlyoutService'); + await testSubjects.existOrFail('logsExplorerFlyoutTrace'); + await testSubjects.existOrFail('logsExplorerFlyoutHostName'); + await testSubjects.existOrFail('logsExplorerFlyoutClusterName'); + await testSubjects.existOrFail('logsExplorerFlyoutResourceId'); await dataGrid.closeFlyout(); }); it('should load the service container even when 1 field is missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionServiceInfra'); - await testSubjects.missingOrFail('logExplorerFlyoutService'); - await testSubjects.existOrFail('logExplorerFlyoutTrace'); - await testSubjects.existOrFail('logExplorerFlyoutHostName'); - await testSubjects.existOrFail('logExplorerFlyoutClusterName'); - await testSubjects.existOrFail('logExplorerFlyoutResourceId'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionServiceInfra'); + await testSubjects.missingOrFail('logsExplorerFlyoutService'); + await testSubjects.existOrFail('logsExplorerFlyoutTrace'); + await testSubjects.existOrFail('logsExplorerFlyoutHostName'); + await testSubjects.existOrFail('logsExplorerFlyoutClusterName'); + await testSubjects.existOrFail('logsExplorerFlyoutResourceId'); await dataGrid.closeFlyout(); }); it('should not load the service container if all fields are missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 2 }); - await testSubjects.missingOrFail('logExplorerFlyoutHighlightSectionServiceInfra'); + await testSubjects.missingOrFail('logsExplorerFlyoutHighlightSectionServiceInfra'); await dataGrid.closeFlyout(); }); }); @@ -129,11 +129,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const docs = [sharedDoc, docWithoutCloudProviderAndInstanceId, docWithoutCloudContainer]; before('setup DataStream', async () => { - cleanupDataStreamSetup = await PageObjects.observabilityLogExplorer.setupDataStream( + cleanupDataStreamSetup = await PageObjects.observabilityLogsExplorer.setupDataStream( DATASET_NAME, NAMESPACE ); - await PageObjects.observabilityLogExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); + await PageObjects.observabilityLogsExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); }); after('clean up DataStream', async () => { @@ -143,7 +143,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); beforeEach(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from: new Date(NOW - 60_000).toISOString(), @@ -156,36 +156,36 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should load the cloud container with all fields', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionCloud'); - await testSubjects.existOrFail('logExplorerFlyoutCloudProvider'); - await testSubjects.existOrFail('logExplorerFlyoutCloudRegion'); - await testSubjects.existOrFail('logExplorerFlyoutCloudAz'); - await testSubjects.existOrFail('logExplorerFlyoutCloudProjectId'); - await testSubjects.existOrFail('logExplorerFlyoutCloudInstanceId'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionCloud'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudProvider'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudRegion'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudAz'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudProjectId'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudInstanceId'); await dataGrid.closeFlyout(); }); it('should load the cloud container even when some fields are missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionCloud'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionCloud'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudProvider'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudInstanceId'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudProvider'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudInstanceId'); - await testSubjects.existOrFail('logExplorerFlyoutCloudRegion'); - await testSubjects.existOrFail('logExplorerFlyoutCloudAz'); - await testSubjects.existOrFail('logExplorerFlyoutCloudProjectId'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudRegion'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudAz'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudProjectId'); await dataGrid.closeFlyout(); }); it('should not load the cloud container if all fields are missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 2 }); - await testSubjects.missingOrFail('logExplorerFlyoutHighlightSectionCloud'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudProvider'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudRegion'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudAz'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudProjectId'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudInstanceId'); + await testSubjects.missingOrFail('logsExplorerFlyoutHighlightSectionCloud'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudProvider'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudRegion'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudAz'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudProjectId'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudInstanceId'); await dataGrid.closeFlyout(); }); }); @@ -199,11 +199,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const docs = [sharedDoc, docWithoutLogPathAndAgentName]; before('setup DataStream', async () => { - cleanupDataStreamSetup = await PageObjects.observabilityLogExplorer.setupDataStream( + cleanupDataStreamSetup = await PageObjects.observabilityLogsExplorer.setupDataStream( DATASET_NAME, NAMESPACE ); - await PageObjects.observabilityLogExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); + await PageObjects.observabilityLogsExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); }); after('clean up DataStream', async () => { @@ -213,7 +213,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); beforeEach(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from: new Date(NOW - 60_000).toISOString(), @@ -226,23 +226,23 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should load the other container with all fields', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionOther'); - await testSubjects.existOrFail('logExplorerFlyoutLogPathFile'); - await testSubjects.existOrFail('logExplorerFlyoutNamespace'); - await testSubjects.existOrFail('logExplorerFlyoutDataset'); - await testSubjects.existOrFail('logExplorerFlyoutLogShipper'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionOther'); + await testSubjects.existOrFail('logsExplorerFlyoutLogPathFile'); + await testSubjects.existOrFail('logsExplorerFlyoutNamespace'); + await testSubjects.existOrFail('logsExplorerFlyoutDataset'); + await testSubjects.existOrFail('logsExplorerFlyoutLogShipper'); await dataGrid.closeFlyout(); }); it('should load the other container even when some fields are missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionOther'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionOther'); - await testSubjects.missingOrFail('logExplorerFlyoutLogPathFile'); - await testSubjects.missingOrFail('logExplorerFlyoutLogShipper'); + await testSubjects.missingOrFail('logsExplorerFlyoutLogPathFile'); + await testSubjects.missingOrFail('logsExplorerFlyoutLogShipper'); - await testSubjects.existOrFail('logExplorerFlyoutNamespace'); - await testSubjects.existOrFail('logExplorerFlyoutDataset'); + await testSubjects.existOrFail('logsExplorerFlyoutNamespace'); + await testSubjects.existOrFail('logsExplorerFlyoutDataset'); await dataGrid.closeFlyout(); }); }); diff --git a/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts b/x-pack/test/functional/apps/observability_logs_explorer/header_menu.ts similarity index 76% rename from x-pack/test/functional/apps/observability_log_explorer/header_menu.ts rename to x-pack/test/functional/apps/observability_logs_explorer/header_menu.ts index f5b7deb645da3..9bc4e090fb6cc 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/header_menu.ts @@ -13,36 +13,36 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); const retry = getService('retry'); const testSubjects = getService('testSubjects'); - const PageObjects = getPageObjects(['discover', 'observabilityLogExplorer', 'timePicker']); + const PageObjects = getPageObjects(['discover', 'observabilityLogsExplorer', 'timePicker']); describe('Header menu', () => { before(async () => { await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); await esArchiver.load( - 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + 'x-pack/test/functional/es_archives/observability_logs_explorer/data_streams' ); - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); after(async () => { await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); await esArchiver.unload( - 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + 'x-pack/test/functional/es_archives/observability_logs_explorer/data_streams' ); }); it('should inject the app header menu on the top navbar', async () => { - const headerMenu = await PageObjects.observabilityLogExplorer.getHeaderMenu(); + const headerMenu = await PageObjects.observabilityLogsExplorer.getHeaderMenu(); expect(await headerMenu.isDisplayed()).to.be(true); }); describe('Discover fallback link', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); it('should render a button link ', async () => { - const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + const discoverLink = await PageObjects.observabilityLogsExplorer.getDiscoverFallbackLink(); expect(await discoverLink.isDisplayed()).to.be(true); }); @@ -55,9 +55,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const timeConfig = await PageObjects.timePicker.getTimeConfig(); // Set query bar value - await PageObjects.observabilityLogExplorer.submitQuery('*favicon*'); + await PageObjects.observabilityLogsExplorer.submitQuery('*favicon*'); - const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + const discoverLink = await PageObjects.observabilityLogsExplorer.getDiscoverFallbackLink(); discoverLink.click(); await PageObjects.discover.waitForDocTableLoadingComplete(); @@ -79,23 +79,25 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); await retry.try(async () => { - expect(await PageObjects.observabilityLogExplorer.getQueryBarValue()).to.eql('*favicon*'); + expect(await PageObjects.observabilityLogsExplorer.getQueryBarValue()).to.eql( + '*favicon*' + ); }); }); }); describe('Add data link', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); it('should render a button link ', async () => { - const onboardingLink = await PageObjects.observabilityLogExplorer.getOnboardingLink(); + const onboardingLink = await PageObjects.observabilityLogsExplorer.getOnboardingLink(); expect(await onboardingLink.isDisplayed()).to.be(true); }); it('should navigate to the observability onboarding overview page', async () => { - const onboardingLink = await PageObjects.observabilityLogExplorer.getOnboardingLink(); + const onboardingLink = await PageObjects.observabilityLogsExplorer.getOnboardingLink(); onboardingLink.click(); await retry.try(async () => { diff --git a/x-pack/test/functional/apps/observability_log_explorer/index.ts b/x-pack/test/functional/apps/observability_logs_explorer/index.ts similarity index 93% rename from x-pack/test/functional/apps/observability_log_explorer/index.ts rename to x-pack/test/functional/apps/observability_logs_explorer/index.ts index c1114211b41a9..e8114a8d14bfd 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/index.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/index.ts @@ -8,7 +8,7 @@ import { FtrProviderContext } from './config'; export default function ({ loadTestFile }: FtrProviderContext) { - describe('Observability Log Explorer', function () { + describe('Observability Logs Explorer', function () { loadTestFile(require.resolve('./app')); loadTestFile(require.resolve('./columns_selection')); loadTestFile(require.resolve('./dataset_selection_state')); diff --git a/x-pack/test/functional/config.base.js b/x-pack/test/functional/config.base.js index 95849312e17da..1bf939c537b7c 100644 --- a/x-pack/test/functional/config.base.js +++ b/x-pack/test/functional/config.base.js @@ -170,8 +170,8 @@ export default async function ({ readConfigFile }) { observability: { pathname: '/app/observability', }, - observabilityLogExplorer: { - pathname: '/app/observability-log-explorer', + observabilityLogsExplorer: { + pathname: '/app/observability-logs-explorer', }, connectors: { pathname: '/app/management/insightsAndAlerting/triggersActionsConnectors/', diff --git a/x-pack/test/functional/es_archives/observability_log_explorer/data_streams/data.json.gz b/x-pack/test/functional/es_archives/observability_logs_explorer/data_streams/data.json.gz similarity index 100% rename from x-pack/test/functional/es_archives/observability_log_explorer/data_streams/data.json.gz rename to x-pack/test/functional/es_archives/observability_logs_explorer/data_streams/data.json.gz diff --git a/x-pack/test/functional/es_archives/observability_log_explorer/data_streams/mappings.json b/x-pack/test/functional/es_archives/observability_logs_explorer/data_streams/mappings.json similarity index 100% rename from x-pack/test/functional/es_archives/observability_log_explorer/data_streams/mappings.json rename to x-pack/test/functional/es_archives/observability_logs_explorer/data_streams/mappings.json diff --git a/x-pack/test/functional/page_objects/index.ts b/x-pack/test/functional/page_objects/index.ts index b4ea0f741e117..30c8d9cd13e9d 100644 --- a/x-pack/test/functional/page_objects/index.ts +++ b/x-pack/test/functional/page_objects/index.ts @@ -33,7 +33,7 @@ import { LogstashPageObject } from './logstash_page'; import { MaintenanceWindowsPageProvider } from './maintenance_windows_page'; import { MonitoringPageObject } from './monitoring_page'; import { NavigationalSearchPageObject } from './navigational_search'; -import { ObservabilityLogExplorerPageObject } from './observability_log_explorer'; +import { ObservabilityLogsExplorerPageObject } from './observability_log_explorer'; import { ObservabilityPageProvider } from './observability_page'; import { RemoteClustersPageProvider } from './remote_clusters_page'; import { ReportingPageObject } from './reporting_page'; @@ -82,7 +82,7 @@ export const pageObjects = { maps: GisPageObject, monitoring: MonitoringPageObject, navigationalSearch: NavigationalSearchPageObject, - observabilityLogExplorer: ObservabilityLogExplorerPageObject, + observabilityLogsExplorer: ObservabilityLogsExplorerPageObject, observability: ObservabilityPageProvider, remoteClusters: RemoteClustersPageProvider, reporting: ReportingPageObject, diff --git a/x-pack/test/functional/page_objects/observability_log_explorer.ts b/x-pack/test/functional/page_objects/observability_log_explorer.ts index d6746ccd9e015..3f63b146756e6 100644 --- a/x-pack/test/functional/page_objects/observability_log_explorer.ts +++ b/x-pack/test/functional/page_objects/observability_log_explorer.ts @@ -6,7 +6,7 @@ */ import expect from '@kbn/expect'; import { - OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY, + OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY, urlSchemaV1, } from '@kbn/observability-logs-explorer-plugin/common'; import rison from '@kbn/rison'; @@ -114,7 +114,7 @@ const defaultPageState: urlSchemaV1.UrlSchema = { }, }; -export function ObservabilityLogExplorerPageObject({ +export function ObservabilityLogsExplorerPageObject({ getPageObjects, getService, }: FtrProviderContext) { @@ -215,7 +215,7 @@ export function ObservabilityLogExplorerPageObject({ pageState?: urlSchemaV1.UrlSchema; } = {}) { const queryStringParams = querystring.stringify({ - [OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY]: rison.encode( + [OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY]: rison.encode( urlSchemaV1.urlSchemaRT.encode({ ...defaultPageState, ...pageState, @@ -224,7 +224,7 @@ export function ObservabilityLogExplorerPageObject({ }); return await PageObjects.common.navigateToUrlWithBrowserHistory( - 'observabilityLogExplorer', + 'observabilityLogsExplorer', '/', queryStringParams, { @@ -241,7 +241,7 @@ export function ObservabilityLogExplorerPageObject({ pageState?: {}; } = {}) { const queryStringParams = querystring.stringify({ - [OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY]: rison.encode({ + [OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY]: rison.encode({ ...uncheckedPageState, }), }); @@ -249,7 +249,7 @@ export function ObservabilityLogExplorerPageObject({ log.info('queryStringParams'); return await PageObjects.common.navigateToUrlWithBrowserHistory( - 'observabilityLogExplorer', + 'observabilityLogsExplorer', '/', queryStringParams, { @@ -330,7 +330,7 @@ export function ObservabilityLogExplorerPageObject({ async getFlyoutDetail(rowIndex: number = 0) { await dataGrid.clickRowToggle({ rowIndex }); - return testSubjects.find('logExplorerFlyoutDetail'); + return testSubjects.find('logsExplorerFlyoutDetail'); }, async getIntegrations() { @@ -416,15 +416,15 @@ export function ObservabilityLogExplorerPageObject({ }, getHeaderMenu() { - return testSubjects.find('logExplorerHeaderMenu'); + return testSubjects.find('logsExplorerHeaderMenu'); }, getDiscoverFallbackLink() { - return testSubjects.find('logExplorerDiscoverFallbackLink'); + return testSubjects.find('logsExplorerDiscoverFallbackLink'); }, getOnboardingLink() { - return testSubjects.find('logExplorerOnboardingLink'); + return testSubjects.find('logsExplorerOnboardingLink'); }, // Query Bar diff --git a/x-pack/test/security_solution_cypress/cypress/README.md b/x-pack/test/security_solution_cypress/cypress/README.md index 0fa6bae6e2164..51f2365e199be 100644 --- a/x-pack/test/security_solution_cypress/cypress/README.md +++ b/x-pack/test/security_solution_cypress/cypress/README.md @@ -15,6 +15,8 @@ If you are still having doubts, questions or queries, please feel free to ping o [**Running the tests**](#running-the-tests) +[**Enabling Experimental Flags**](#enabling-experimental-flags) + [**Debugging your test**](#debugging-your-test) [**Folder structure**](#folder-structure) @@ -94,6 +96,29 @@ Run the tests with the following yarn scripts from `x-pack/test/security_solutio Please note that all the headless mode commands do not open the Cypress UI and are typically used in CI/CD environments. The scripts that open the Cypress UI are useful for development and debugging. +### Enabling experimental flags + +When writing a test that requires an experimental flag enabled, you need to pass an extra configuration to the header of the test: + +```typescript +describe( + 'My Experimental Flag test', + { + env: { + ftrConfig: { + kbnServerArgs: [ + `--xpack.securitySolution.enableExperimental=${JSON.stringify([ + 'MY_EXPERIMENTAL_FLAG', + ])}`, + ], + }, + }, + }, + ... +``` + +Note that this configuration doesn't work for local development. In this case, you need to update the configuration files: `../config` and `../serverless_config`, but you shouldn't commit these changes. + ## Debugging your test In order to be able to debug any Cypress test you need to open Cypress on visual mode. [Here](https://docs.cypress.io/guides/guides/debugging) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/new_entity_flyout.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/new_entity_flyout.cy.ts index ee5f504d9f7ab..ad0b8b9c06b64 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/new_entity_flyout.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/new_entity_flyout.cy.ts @@ -5,6 +5,10 @@ * 2.0. */ +import { + ENTRA_ID_PACKAGE_NAME, + OKTA_PACKAGE_NAME, +} from '@kbn/security-solution-plugin/public/timelines/components/side_panel/new_user_detail/constants'; import { expandFirstAlertHostFlyout, expandFirstAlertUserFlyout, @@ -14,7 +18,7 @@ import { import { login } from '../../tasks/login'; import { visitWithTimeRange } from '../../tasks/navigation'; import { ALERTS_URL } from '../../urls/navigation'; -import { USER_PANEL_HEADER } from '../../screens/hosts/flyout_user_panel'; +import { USER_PANEL_HEADER } from '../../screens/users/flyout_user_panel'; import { waitForAlerts } from '../../tasks/alerts'; import { HOST_PANEL_HEADER } from '../../screens/hosts/flyout_host_panel'; import { RISK_INPUT_PANEL_HEADER, ASSET_CRITICALITY_BADGE } from '../../screens/flyout_risk_panel'; @@ -28,6 +32,16 @@ import { ENTITY_DETAILS_FLYOUT_ASSET_CRITICALITY_SELECTOR, } from '../../screens/asset_criticality/flyouts'; import { deleteCriticality } from '../../tasks/api_calls/entity_analytics'; +import { mockFleetInstalledIntegrations } from '../../tasks/fleet_integrations'; +import { + expandManagedDataEntraPanel, + expandManagedDataOktaPanel, +} from '../../tasks/users/flyout_user_panel'; +import { + ASSET_TYPE_FIELD, + ENTRA_DOCUMENT_TAB, + OKTA_DOCUMENT_TAB, +} from '../../screens/users/flyout_asset_panel'; const USER_NAME = 'user1'; const SIEM_KIBANA_HOST_NAME = 'Host-fwarau82er'; @@ -43,6 +57,7 @@ describe( 'newUserDetailsFlyout', 'newHostDetailsFlyout', 'entityAnalyticsAssetCriticalityEnabled', + 'newUserDetailsFlyoutManagedUser', ])}`, ], }, @@ -52,10 +67,12 @@ describe( before(() => { cy.task('esArchiverLoad', { archiveName: 'risk_scores_new_complete_data' }); cy.task('esArchiverLoad', { archiveName: 'query_alert', useCreate: true, docsOnly: true }); + cy.task('esArchiverLoad', { archiveName: 'user_managed_data' }); }); after(() => { cy.task('esArchiverUnload', 'risk_scores_new_complete_data'); + cy.task('esArchiverUnload', 'user_managed_data'); deleteAlertsAndRules(); // esArchiverUnload doesn't work properly when using with `useCreate` and `docsOnly` flags deleteCriticality({ idField: 'host.name', idValue: SIEM_KIBANA_HOST_NAME }); deleteCriticality({ idField: 'user.name', idValue: USER_NAME }); @@ -80,39 +97,73 @@ describe( cy.get(RISK_INPUT_PANEL_HEADER).should('exist'); }); - it('should show asset criticality in the risk input panel', () => { - expandFirstAlertUserFlyout(); - expandRiskInputsFlyoutPanel(); - cy.get(ASSET_CRITICALITY_BADGE).should('contain.text', 'Very important'); - }); - - it('should display asset criticality accordion', () => { - cy.log('asset criticality'); - expandFirstAlertUserFlyout(); - cy.get(ENTITY_DETAILS_FLYOUT_ASSET_CRITICALITY_SELECTOR).should( - 'contain.text', - 'Asset Criticality' - ); - - cy.get(ENTITY_DETAILS_FLYOUT_ASSET_CRITICALITY_BUTTON).should('have.text', 'Create'); - }); - it('should display asset criticality modal', () => { - cy.log('asset criticality modal'); - expandFirstAlertUserFlyout(); - toggleAssetCriticalityModal(); - cy.get(ENTITY_DETAILS_FLYOUT_ASSET_CRITICALITY_MODAL_TITLE).should( - 'have.text', - 'Pick asset criticality level' - ); + describe('Asset criticality', () => { + it('should show asset criticality in the risk input panel', () => { + expandFirstAlertUserFlyout(); + expandRiskInputsFlyoutPanel(); + cy.get(ASSET_CRITICALITY_BADGE).should('contain.text', 'Very important'); + }); + + it('should display asset criticality accordion', () => { + cy.log('asset criticality'); + expandFirstAlertUserFlyout(); + cy.get(ENTITY_DETAILS_FLYOUT_ASSET_CRITICALITY_SELECTOR).should( + 'contain.text', + 'Asset Criticality' + ); + + cy.get(ENTITY_DETAILS_FLYOUT_ASSET_CRITICALITY_BUTTON).should('have.text', 'Create'); + }); + + it('should display asset criticality modal', () => { + cy.log('asset criticality modal'); + expandFirstAlertUserFlyout(); + toggleAssetCriticalityModal(); + cy.get(ENTITY_DETAILS_FLYOUT_ASSET_CRITICALITY_MODAL_TITLE).should( + 'have.text', + 'Pick asset criticality level' + ); + }); + + it('should update asset criticality state', () => { + cy.log('asset criticality update'); + expandFirstAlertUserFlyout(); + selectAssetCriticalityLevel('Important'); + cy.get(ENTITY_DETAILS_FLYOUT_ASSET_CRITICALITY_LEVEL) + .contains('Important') + .should('be.visible'); + }); }); - it('should update asset criticality state', () => { - cy.log('asset criticality update'); - expandFirstAlertUserFlyout(); - selectAssetCriticalityLevel('Important'); - cy.get(ENTITY_DETAILS_FLYOUT_ASSET_CRITICALITY_LEVEL) - .contains('Important') - .should('be.visible'); + describe('Managed data section', () => { + beforeEach(() => { + mockFleetInstalledIntegrations([ + { + package_name: ENTRA_ID_PACKAGE_NAME, + is_enabled: true, + package_title: 'azure entra', + package_version: 'test_package_version', + }, + { + package_name: OKTA_PACKAGE_NAME, + is_enabled: true, + package_title: 'okta', + package_version: 'test_package_version', + }, + ]); + }); + + it('should show okta and azure managed data sections and expand panel', () => { + expandFirstAlertUserFlyout(); + + expandManagedDataEntraPanel(); + cy.get(ENTRA_DOCUMENT_TAB).should('have.attr', 'aria-selected'); + cy.get(ASSET_TYPE_FIELD).should('contain.text', 'microsoft_entra_id_user'); + + expandManagedDataOktaPanel(); + cy.get(OKTA_DOCUMENT_TAB).should('have.attr', 'aria-selected'); + cy.get(ASSET_TYPE_FIELD).should('contain.text', 'okta_user'); + }); }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts index fe47cf3a538cb..88fbf7a238aeb 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts @@ -10,14 +10,14 @@ import { getTimeline } from '../../../objects/timeline'; import { LOCKED_ICON, - NOTES_TEXT, + // NOTES_TEXT, PIN_EVENT, TIMELINE_FILTER, TIMELINE_FLYOUT_WRAPPER, TIMELINE_QUERY, TIMELINE_PANEL, TIMELINE_STATUS, - TIMELINE_TAB_CONTENT_GRAPHS_NOTES, + // TIMELINE_TAB_CONTENT_GRAPHS_NOTES, SAVE_TIMELINE_ACTION_BTN, SAVE_TIMELINE_TOOLTIP, } from '../../../screens/timeline'; @@ -33,7 +33,7 @@ import { selectCustomTemplates } from '../../../tasks/templates'; import { addFilter, addNameAndDescriptionToTimeline, - addNotesToTimeline, + // addNotesToTimeline, clickingOnCreateTimelineFormTemplateBtn, closeTimeline, createNewTimeline, @@ -108,10 +108,12 @@ describe('Timelines', { tags: ['@ess', '@serverless'] }, (): void => { cy.get(LOCKED_ICON).should('be.visible'); - addNotesToTimeline(getTimeline().notes); - cy.get(TIMELINE_TAB_CONTENT_GRAPHS_NOTES) - .find(NOTES_TEXT) - .should('have.text', getTimeline().notes); + // TODO: fix this + // While typing the note, cypress encounters this -> Error: ResizeObserver loop completed with undelivered notifications. + // addNotesToTimeline(getTimeline().notes); + // cy.get(TIMELINE_TAB_CONTENT_GRAPHS_NOTES) + // .find(NOTES_TEXT) + // .should('have.text', getTimeline().notes); }); it('should show the different timeline states', () => { diff --git a/x-pack/test/security_solution_cypress/cypress/screens/sourcerer.ts b/x-pack/test/security_solution_cypress/cypress/screens/sourcerer.ts index 591df4117d0a6..450d1aa484b5d 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/sourcerer.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/sourcerer.ts @@ -15,7 +15,7 @@ export const SOURCERER = { badgeAlerts: '[data-test-subj="sourcerer-alerts-badge"]', badgeAlertsOption: '[data-test-subj="security-alerts-option-badge"]', siemDefaultIndexInput: - '[data-test-subj="advancedSetting-editField-securitySolution:defaultIndex"]', + '[data-test-subj="management-settings-editField-securitySolution:defaultIndex"]', popoverTitle: '[data-test-subj="sourcerer-title"]', resetButton: 'button[data-test-subj="sourcerer-reset"]', saveButton: 'button[data-test-subj="sourcerer-save"]', diff --git a/x-pack/test/security_solution_cypress/cypress/screens/hosts/flyout_user_panel.ts b/x-pack/test/security_solution_cypress/cypress/screens/users/flyout_asset_panel.ts similarity index 53% rename from x-pack/test/security_solution_cypress/cypress/screens/hosts/flyout_user_panel.ts rename to x-pack/test/security_solution_cypress/cypress/screens/users/flyout_asset_panel.ts index 170c87349fe45..d83ad90de215e 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/hosts/flyout_user_panel.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/users/flyout_asset_panel.ts @@ -7,4 +7,8 @@ import { getDataTestSubjectSelector } from '../../helpers/common'; -export const USER_PANEL_HEADER = getDataTestSubjectSelector('user-panel-header'); +export const ASSET_TYPE_FIELD = getDataTestSubjectSelector('event-field-asset.type'); + +export const OKTA_DOCUMENT_TAB = getDataTestSubjectSelector('securitySolutionFlyoutOktaTab'); + +export const ENTRA_DOCUMENT_TAB = getDataTestSubjectSelector('securitySolutionFlyoutEntraTab'); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/users/flyout_user_panel.ts b/x-pack/test/security_solution_cypress/cypress/screens/users/flyout_user_panel.ts new file mode 100644 index 0000000000000..40507311d424d --- /dev/null +++ b/x-pack/test/security_solution_cypress/cypress/screens/users/flyout_user_panel.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getDataTestSubjectSelector } from '../../helpers/common'; + +export const USER_PANEL_HEADER = getDataTestSubjectSelector('user-panel-header'); + +const MANAGED_DATA_SECTION = getDataTestSubjectSelector('managedUser-data'); + +export const OKTA_MANAGED_DATA_TITLE = `${MANAGED_DATA_SECTION} ${getDataTestSubjectSelector( + 'managed-user-accordion-userAssetOktaLeftSection' +)}`; + +export const ENTRA_MANAGED_DATA_TITLE = `${MANAGED_DATA_SECTION} ${getDataTestSubjectSelector( + 'managed-user-accordion-userAssetEntraLeftSection' +)}`; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/fleet_integrations.ts b/x-pack/test/security_solution_cypress/cypress/tasks/fleet_integrations.ts new file mode 100644 index 0000000000000..bafc80b383547 --- /dev/null +++ b/x-pack/test/security_solution_cypress/cypress/tasks/fleet_integrations.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + GET_INSTALLED_INTEGRATIONS_URL, + InstalledIntegration, +} from '@kbn/security-solution-plugin/common/api/detection_engine'; + +export const mockFleetInstalledIntegrations = (integrations: InstalledIntegration[] = []) => { + cy.intercept('GET', `${GET_INSTALLED_INTEGRATIONS_URL}*`, { + statusCode: 200, + body: { + installed_integrations: integrations, + }, + }).as('installedIntegrations'); +}; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/sourcerer.ts b/x-pack/test/security_solution_cypress/cypress/tasks/sourcerer.ts index a534fb3e6d3d8..2bf56c1bd7c66 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/sourcerer.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/sourcerer.ts @@ -96,7 +96,7 @@ export const resetSourcerer = () => { export const clickAlertCheckbox = () => cy.get(SOURCERER.alertCheckbox).check({ force: true }); export const addIndexToDefault = (index: string) => { - visitWithTimeRange(`/app/management/kibana/settings?query=category:(securitySolution)`); + visitWithTimeRange(`/app/management/kibana/settings?query=categories:(securitySolution)`); cy.get(SOURCERER.siemDefaultIndexInput) .invoke('val') .then((patterns) => { @@ -107,8 +107,8 @@ export const addIndexToDefault = (index: string) => { } }); - cy.get('button[data-test-subj="advancedSetting-saveButton"]').click(); - cy.get('button[data-test-subj="windowReloadButton"]').click(); + cy.get('button[data-test-subj="settings-save-button"]').click(); + cy.get('button[data-test-subj="pageReloadButton"]').click(); visitWithTimeRange(hostsUrl('allHosts')); }); }; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/users/flyout_user_panel.ts b/x-pack/test/security_solution_cypress/cypress/tasks/users/flyout_user_panel.ts new file mode 100644 index 0000000000000..4d9e4a3897a35 --- /dev/null +++ b/x-pack/test/security_solution_cypress/cypress/tasks/users/flyout_user_panel.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + ENTRA_MANAGED_DATA_TITLE, + OKTA_MANAGED_DATA_TITLE, +} from '../../screens/users/flyout_user_panel'; + +export const expandManagedDataEntraPanel = () => { + cy.get(ENTRA_MANAGED_DATA_TITLE).click(); +}; + +export const expandManagedDataOktaPanel = () => { + cy.get(OKTA_MANAGED_DATA_TITLE).click(); +}; diff --git a/x-pack/test/security_solution_cypress/es_archives/user_managed_data/data.json b/x-pack/test/security_solution_cypress/es_archives/user_managed_data/data.json new file mode 100644 index 0000000000000..ef3db8154650d --- /dev/null +++ b/x-pack/test/security_solution_cypress/es_archives/user_managed_data/data.json @@ -0,0 +1,220 @@ +{ + "type": "doc", + "value": { + "id": "IYAoRo0BywOJt6WJ-NXN", + "data_stream": "logs-entityanalytics_okta.user-default", + "index": ".ds-logs-entityanalytics_okta.user-default-000001", + "source": { + "agent": { + "name": "docker-fleet-server", + "id": "62489a87-bbb5-44d1-9dd5-63c508de884b", + "type": "filebeat", + "ephemeral_id": "ea069592-b9bb-4e85-bf22-ec67bdb10394", + "version": "8.12.0" + }, + "elastic_agent": { + "id": "62489a87-bbb5-44d1-9dd5-63c508de884b", + "version": "8.12.0", + "snapshot": true + }, + "entityanalytics_okta": { + "user": { + "_links": { + "self": { + "href": "https://dev-36006609.okta.com/api/v1/users/00udojsvifqsBhoxR5d7" + } + }, + "type": { + "id": "otyf1r6hlGf9AXhZ95d6" + } + } + }, + "labels": { + "identity_source": "entity-analytics-entityanalytics_okta.user-73e543b5-2de4-41f8-9e7f-a9d1dbd1857c" + }, + "tags": [ + "forwarded", + "entityanalytics_okta-user" + ], + "input": { + "type": "entity-analytics" + }, + "@timestamp": "2024-01-26T14:24:56.744Z", + "ecs": { + "version": "8.11.0" + }, + "related": { + "user": [ + "00udojsvifqsBhoxR5d7", + "user1@gmail.com", + "test", + "123" + ] + }, + "data_stream": { + "namespace": "default", + "type": "logs", + "dataset": "entityanalytics_okta.user" + }, + "event": { + "agent_id_status": "verified", + "ingested": "2024-01-26T14:25:06Z", + "kind": "asset", + "action": "user-modified", + "category": [ + "iam" + ], + "type": [ + "user", + "info" + ], + "dataset": "entityanalytics_okta.user" + }, + "asset": { + "last_updated": "2023-12-06T13:45:09.000Z", + "last_seen": "2023-12-06T13:45:09.000Z", + "last_status_change_date": "2023-12-06T13:45:09.000Z", + "id": "00udojsvifqsBhoxR5d7", + "category": "entity", + "type": "okta_user", + "create_date": "2023-12-06T13:44:23.000Z", + "status": "ACTIVE" + }, + "user": { + "profile": { + "last_name": "123", + "first_name": "test", + "status": "ACTIVE" + }, + "name": "user1", + "id": "00udojsvifqsBhoxR5d7", + "account": { + "change_date": "2023-12-06T13:45:09.000Z", + "password_change_date": "2023-12-06T13:45:09.000Z", + "activated_date": "2023-12-06T13:44:23.000Z", + "create_date": "2023-12-06T13:44:23.000Z", + "status": { + "password_expired": false, + "deprovisioned": false, + "locked_out": false, + "recovery": false, + "suspended": false + } + }, + "email": "user1@gmail.com" + } + } + } +} + +{ + "type": "doc", + "value": { + "id": "uYSkRo0Bc35HUGZSHMQR", + "data_stream": "logs-entityanalytics_entra_id.user-default", + "index": ".ds-logs-entityanalytics_entra_id.user-default", + "source": { + "agent": { + "name": "ingest-linux-1", + "id": "adb765aa-365b-4f27-8111-bca5bf3d51d3", + "type": "filebeat", + "ephemeral_id": "3228f5dd-b26b-4eae-b8ff-1d3941688e0a", + "version": "8.12.0" + }, + "elastic_agent": { + "id": "adb765aa-365b-4f27-8111-bca5bf3d51d3", + "version": "8.12.0", + "snapshot": true + }, + "labels": { + "identity_source": "entity-analytics-entityanalytics_entra_id.entity-297a838e-1c2d-42f1-8c47-c576bc5424d3" + }, + "tags": [ + "users-entities", + "forwarded", + "entityanalytics_entra_id-entity" + ], + "cloud": { + "availability_zone": "us-central1-c", + "instance": { + "name": "ingest-linux-1", + "id": "8765304135675025125" + }, + "provider": "gcp", + "service": { + "name": "GCE" + }, + "machine": { + "type": "n1-standard-1" + }, + "project": { + "id": "elastic-siem" + }, + "region": "us-central1", + "account": { + "id": "elastic-siem" + } + }, + "input": { + "type": "entity-analytics" + }, + "@timestamp": "2024-01-29T08:39:39.340Z", + "ecs": { + "version": "8.11.0" + }, + "related": { + "user": [ + "user1@elastic.co", + "user1_elastic.co#EXT#@azure2elasticsearch.onmicrosoft.com", + "user1", + "b6bcbd11-7e2b-4d6a-9dbe-f3c487c6cf7a" + ] + }, + "data_stream": { + "namespace": "default", + "type": "logs", + "dataset": "entityanalytics_entra_id.user" + }, + "event": { + "agent_id_status": "verified", + "ingested": "2024-01-29T08:39:49Z", + "kind": "asset", + "action": "user-modified", + "category": [ + "iam" + ], + "type": [ + "user", + "info" + ], + "dataset": "entityanalytics_entra_id.user" + }, + "asset": { + "id": "b6bcbd11-7e2b-4d6a-9dbe-f3c487c6cf7a", + "category": "entity", + "type": "microsoft_entra_id_user", + "group": [ + { + "name": "obs-integrations", + "id": "ee4d999c-57f2-4213-adac-6192582b8649" + } + ] + }, + "user": { + "full_name": "user1 Test", + "name": "user1", + "last_name": "Test", + "id": "b6bcbd11-7e2b-4d6a-9dbe-f3c487c6cf7a", + "first_name": "user1", + "job_title": "user1@elastic.co", + "email": "user1@elastic.co", + "group": [ + { + "name": "obs-integrations", + "id": "ee4d999c-57f2-4213-adac-6192582b8649" + } + ] + } + } + } +} \ No newline at end of file diff --git a/x-pack/test/security_solution_cypress/es_archives/user_managed_data/mappings.json b/x-pack/test/security_solution_cypress/es_archives/user_managed_data/mappings.json new file mode 100644 index 0000000000000..c8d6c4ad73294 --- /dev/null +++ b/x-pack/test/security_solution_cypress/es_archives/user_managed_data/mappings.json @@ -0,0 +1,1277 @@ +{ + "type": "data_stream", + "value": { + "data_stream": "logs-entityanalytics_okta.user-default", + "template": { + "_meta": { + "managed": true, + "namespace": "default" + }, + "data_stream": { + "hidden": false + }, + "index_patterns": [ + "logs-entityanalytics_okta.user-default" + ], + "name": "logs-entityanalytics_okta.user-default-index-template", + "template": { + "mappings": { + "dynamic": false, + "properties": { + "@timestamp": { + "type": "date", + "ignore_malformed": false + }, + "agent": { + "properties": { + "ephemeral_id": { + "type": "keyword", + "ignore_above": 1024 + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword" + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + }, + "version": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "asset": { + "properties": { + "category": { + "type": "keyword", + "ignore_above": 1024 + }, + "costCenter": { + "type": "keyword", + "ignore_above": 1024 + }, + "create_date": { + "type": "date" + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "last_seen": { + "type": "date" + }, + "last_status_change_date": { + "type": "date" + }, + "last_updated": { + "type": "date" + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + }, + "status": { + "type": "keyword", + "ignore_above": 1024 + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + }, + "vendor": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "data_stream": { + "properties": { + "dataset": { + "type": "constant_keyword", + "value": "entityanalytics_okta.user" + }, + "namespace": { + "type": "constant_keyword", + "value": "default" + }, + "type": { + "type": "constant_keyword", + "value": "logs" + } + } + }, + "ecs": { + "properties": { + "version": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "elastic_agent": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "snapshot": { + "type": "boolean" + }, + "version": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "entityanalytics_okta": { + "properties": { + "user": { + "properties": { + "_embedded": { + "type": "flattened" + }, + "_links": { + "type": "flattened" + }, + "activated": { + "type": "date" + }, + "created": { + "type": "date" + }, + "credentials": { + "properties": { + "provider": { + "properties": { + "name": { + "type": "keyword", + "ignore_above": 1024 + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + } + } + } + } + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "last_login": { + "type": "date" + }, + "last_updated": { + "type": "date" + }, + "password_changed": { + "type": "date" + }, + "profile": { + "properties": { + "city": { + "type": "keyword", + "ignore_above": 1024 + }, + "cost_center": { + "type": "keyword", + "ignore_above": 1024 + }, + "country_code": { + "type": "keyword", + "ignore_above": 1024 + }, + "department": { + "type": "keyword", + "ignore_above": 1024 + }, + "display_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "division": { + "type": "keyword", + "ignore_above": 1024 + }, + "email": { + "type": "keyword", + "ignore_above": 1024 + }, + "employee_number": { + "type": "keyword", + "ignore_above": 1024 + }, + "first_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "honorific": { + "properties": { + "prefix": { + "type": "keyword", + "ignore_above": 1024 + }, + "suffix": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "last_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "locale": { + "type": "keyword", + "ignore_above": 1024 + }, + "login": { + "type": "keyword", + "ignore_above": 1024 + }, + "manager": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "middle_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "mobile_phone": { + "type": "keyword", + "ignore_above": 1024 + }, + "nick_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "organization": { + "type": "keyword", + "ignore_above": 1024 + }, + "postal_address": { + "type": "keyword", + "ignore_above": 1024 + }, + "preferred_language": { + "type": "keyword", + "ignore_above": 1024 + }, + "primary_phone": { + "type": "keyword", + "ignore_above": 1024 + }, + "second_email": { + "type": "keyword", + "ignore_above": 1024 + }, + "state": { + "type": "keyword", + "ignore_above": 1024 + }, + "street_address": { + "type": "keyword", + "ignore_above": 1024 + }, + "timezone": { + "type": "keyword", + "ignore_above": 1024 + }, + "title": { + "type": "keyword", + "ignore_above": 1024 + }, + "url": { + "type": "keyword", + "ignore_above": 1024 + }, + "user_type": { + "type": "keyword", + "ignore_above": 1024 + }, + "zip_code": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "status": { + "type": "keyword", + "ignore_above": 1024 + }, + "status_changed": { + "type": "date" + }, + "transitioning_to_status": { + "type": "keyword", + "ignore_above": 1024 + }, + "type": { + "type": "flattened" + } + } + } + } + }, + "event": { + "properties": { + "action": { + "type": "keyword", + "ignore_above": 1024 + }, + "agent_id_status": { + "type": "keyword", + "ignore_above": 1024 + }, + "category": { + "type": "keyword", + "ignore_above": 1024 + }, + "dataset": { + "type": "constant_keyword", + "value": "entityanalytics_okta.user" + }, + "end": { + "type": "date" + }, + "ingested": { + "type": "date", + "format": "strict_date_time_no_millis||strict_date_optional_time||epoch_millis" + }, + "kind": { + "type": "keyword", + "ignore_above": 1024 + }, + "module": { + "type": "constant_keyword", + "value": "entityanalytics_okta" + }, + "start": { + "type": "date" + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "input": { + "properties": { + "type": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "labels": { + "properties": { + "identity_source": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "log": { + "properties": { + "offset": { + "type": "long" + } + } + }, + "related": { + "properties": { + "user": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "tags": { + "type": "keyword", + "ignore_above": 1024 + }, + "user": { + "properties": { + "account": { + "properties": { + "activated_date": { + "type": "date" + }, + "change_date": { + "type": "date" + }, + "create_date": { + "type": "date" + }, + "password_change_date": { + "type": "date" + }, + "status": { + "properties": { + "deprovisioned": { + "type": "boolean" + }, + "locked_out": { + "type": "boolean" + }, + "password_expired": { + "type": "boolean" + }, + "recovery": { + "type": "boolean" + }, + "suspended": { + "type": "boolean" + } + } + } + } + }, + "email": { + "type": "keyword", + "ignore_above": 1024 + }, + "full_name": { + "type": "keyword", + "fields": { + "text": { + "type": "match_only_text" + } + } + }, + "geo": { + "properties": { + "city_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "country_iso_code": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + }, + "postal_code": { + "type": "keyword", + "ignore_above": 1024 + }, + "region_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "timezone": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "fields": { + "text": { + "type": "match_only_text" + } + } + }, + "organization": { + "properties": { + "name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "profile": { + "properties": { + "department": { + "type": "keyword", + "ignore_above": 1024 + }, + "first_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "job_title": { + "type": "keyword", + "ignore_above": 1024 + }, + "last_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "manager": { + "type": "keyword", + "ignore_above": 1024 + }, + "mobile_phone": { + "type": "keyword", + "ignore_above": 1024 + }, + "other_identities": { + "type": "keyword", + "ignore_above": 1024 + }, + "primaryPhone": { + "type": "keyword", + "ignore_above": 1024 + }, + "secondEmail": { + "type": "keyword", + "ignore_above": 1024 + }, + "status": { + "type": "keyword", + "ignore_above": 1024 + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + } + } + } + } + } + } + } + } + } + } +} + +{ + "type": "data_stream", + "value": { + "data_stream": "logs-entityanalytics_entra_id.user-default", + "template": { + "_meta": { + "managed": true, + "namespace": "default" + }, + "data_stream": { + "hidden": false + }, + "index_patterns": [ + "logs-entityanalytics_entra_id.user-default" + ], + "name": "logs-entityanalytics_entra_id.user-default-index-template", + "template": { + "mappings": { + "dynamic": false, + "properties": { + "@timestamp": { + "type": "date", + "ignore_malformed": false + }, + "agent": { + "properties": { + "ephemeral_id": { + "type": "keyword", + "ignore_above": 1024 + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword" + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + }, + "version": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "asset": { + "properties": { + "category": { + "type": "keyword", + "ignore_above": 1024 + }, + "first_seen": { + "type": "date" + }, + "group": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "is_managed": { + "type": "boolean" + }, + "last_seen": { + "type": "date" + }, + "last_updated": { + "type": "date" + }, + "model": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + }, + "status": { + "type": "keyword", + "ignore_above": 1024 + }, + "tags": { + "type": "keyword", + "ignore_above": 1024 + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + }, + "vendor": { + "type": "keyword", + "ignore_above": 1024 + }, + "version": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "cloud": { + "properties": { + "account": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "availability_zone": { + "type": "keyword", + "ignore_above": 1024 + }, + "instance": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "fields": { + "text": { + "type": "match_only_text" + } + } + } + } + }, + "machine": { + "properties": { + "type": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "project": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "provider": { + "type": "keyword", + "ignore_above": 1024 + }, + "region": { + "type": "keyword", + "ignore_above": 1024 + }, + "service": { + "properties": { + "name": { + "type": "keyword" + } + } + } + } + }, + "data_stream": { + "properties": { + "dataset": { + "type": "constant_keyword", + "value": "entityanalytics_entra_id.entity" + }, + "namespace": { + "type": "constant_keyword", + "value": "default" + }, + "type": { + "type": "constant_keyword", + "value": "logs" + } + } + }, + "device": { + "properties": { + "group": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "registered_owners": { + "properties": { + "business_phones": { + "type": "keyword", + "ignore_above": 1024 + }, + "display_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "given_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "job_title": { + "type": "keyword", + "ignore_above": 1024 + }, + "mail": { + "type": "keyword", + "ignore_above": 1024 + }, + "mobile_phone": { + "type": "keyword", + "ignore_above": 1024 + }, + "surname": { + "type": "keyword", + "ignore_above": 1024 + }, + "user_principal_name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "registered_users": { + "properties": { + "business_phones": { + "type": "keyword", + "ignore_above": 1024 + }, + "display_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "given_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "job_title": { + "type": "keyword", + "ignore_above": 1024 + }, + "mail": { + "type": "keyword", + "ignore_above": 1024 + }, + "mobile_phone": { + "type": "keyword", + "ignore_above": 1024 + }, + "surname": { + "type": "keyword", + "ignore_above": 1024 + }, + "user_principal_name": { + "type": "keyword", + "ignore_above": 1024 + } + } + } + } + }, + "ecs": { + "properties": { + "version": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "elastic_agent": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "snapshot": { + "type": "boolean" + }, + "version": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "entityanalytics_entra_id": { + "properties": { + "device": { + "dynamic": "true", + "properties": { + "account_enabled": { + "type": "boolean" + }, + "alternative_security_ids": { + "properties": { + "identity_provider": { + "type": "keyword", + "ignore_above": 1024 + }, + "key": { + "type": "keyword", + "ignore_above": 1024 + }, + "type": { + "type": "long" + } + } + }, + "approximate_last_sign_in_date_time": { + "type": "date" + }, + "category": { + "type": "keyword", + "ignore_above": 1024 + }, + "compliance_expiration_date_time": { + "type": "date" + }, + "d_id": { + "type": "keyword", + "ignore_above": 1024 + }, + "display_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "enrollment_profile_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "extension_attributes": { + "type": "object", + "dynamic": "true" + }, + "group": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "is_compliant": { + "type": "boolean" + }, + "is_managed": { + "type": "boolean" + }, + "manufacturer": { + "type": "keyword", + "ignore_above": 1024 + }, + "mdm_app_id": { + "type": "keyword", + "ignore_above": 1024 + }, + "metadata": { + "type": "keyword", + "ignore_above": 1024 + }, + "model": { + "type": "keyword", + "ignore_above": 1024 + }, + "on_premises_last_sync_date_time": { + "type": "date" + }, + "on_premises_sync_enabled": { + "type": "boolean" + }, + "operating_system": { + "type": "keyword", + "ignore_above": 1024 + }, + "operating_system_version": { + "type": "keyword", + "ignore_above": 1024 + }, + "ownership": { + "type": "keyword", + "ignore_above": 1024 + }, + "physical_ids": { + "type": "keyword", + "ignore_above": 1024 + }, + "profile_type": { + "type": "keyword", + "ignore_above": 1024 + }, + "registered_owners": { + "properties": { + "business_phones": { + "type": "keyword", + "ignore_above": 1024 + }, + "display_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "given_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "job_title": { + "type": "keyword", + "ignore_above": 1024 + }, + "mail": { + "type": "keyword", + "ignore_above": 1024 + }, + "mobile_phone": { + "type": "keyword", + "ignore_above": 1024 + }, + "surname": { + "type": "keyword", + "ignore_above": 1024 + }, + "user_principal_name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "registered_users": { + "properties": { + "business_phones": { + "type": "keyword", + "ignore_above": 1024 + }, + "display_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "given_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "job_title": { + "type": "keyword", + "ignore_above": 1024 + }, + "mail": { + "type": "keyword", + "ignore_above": 1024 + }, + "mobile_phone": { + "type": "keyword", + "ignore_above": 1024 + }, + "surname": { + "type": "keyword", + "ignore_above": 1024 + }, + "user_principal_name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "registration_date_time": { + "type": "date" + }, + "system_labels": { + "type": "keyword", + "ignore_above": 1024 + }, + "trust_type": { + "type": "keyword", + "ignore_above": 1024 + }, + "version": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "user": { + "properties": { + "account_enabled": { + "type": "boolean" + }, + "business_phones": { + "type": "keyword", + "ignore_above": 1024 + }, + "display_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "given_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "group": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "job_title": { + "type": "keyword", + "ignore_above": 1024 + }, + "mail": { + "type": "keyword", + "ignore_above": 1024 + }, + "mobile_phone": { + "type": "keyword", + "ignore_above": 1024 + }, + "office_location": { + "type": "keyword", + "ignore_above": 1024 + }, + "preferred_language": { + "type": "keyword", + "ignore_above": 1024 + }, + "surname": { + "type": "keyword", + "ignore_above": 1024 + }, + "user_principal_name": { + "type": "keyword", + "ignore_above": 1024 + } + } + } + } + }, + "event": { + "properties": { + "action": { + "type": "keyword", + "ignore_above": 1024 + }, + "agent_id_status": { + "type": "keyword", + "ignore_above": 1024 + }, + "dataset": { + "type": "constant_keyword", + "value": "entityanalytics_entra_id.entity" + }, + "end": { + "type": "date" + }, + "ingested": { + "type": "date", + "format": "strict_date_time_no_millis||strict_date_optional_time||epoch_millis" + }, + "kind": { + "type": "keyword", + "ignore_above": 1024 + }, + "message": { + "type": "text" + }, + "module": { + "type": "constant_keyword", + "value": "entityanalytics_entra_id" + }, + "provider": { + "type": "constant_keyword", + "value": "Microsoft Entra ID" + }, + "start": { + "type": "date" + } + } + }, + "input": { + "properties": { + "type": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "labels": { + "properties": { + "identity_source": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "log": { + "properties": { + "file": { + "properties": { + "path": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "flags": { + "type": "keyword", + "ignore_above": 1024 + }, + "offset": { + "type": "long" + } + } + }, + "tags": { + "type": "keyword", + "ignore_above": 1024 + }, + "user": { + "properties": { + "enabled": { + "type": "boolean" + }, + "first_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "group": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "job_title": { + "type": "keyword", + "ignore_above": 1024 + }, + "last_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "phone": { + "type": "keyword", + "ignore_above": 1024 + }, + "work": { + "properties": { + "location_name": { + "type": "keyword", + "ignore_above": 1024 + } + } + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts index 696c48183624a..71b7bacd2e8a3 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts @@ -12,7 +12,7 @@ import { targetTags } from '../../../security_solution_endpoint/target_tags'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); - describe('Response Actions support for agentType', function () { + describe('Response Actions support for sentinelOne agentType', function () { targetTags(this, ['@ess', '@serverless']); describe('and the "responseActionsSentinelOneV1Enabled" feature flag is disabled', () => { @@ -22,7 +22,7 @@ export default function ({ getService }: FtrProviderContext) { .post(ISOLATE_HOST_ROUTE_V2) .set('kbn-xsrf', 'true') .set('Elastic-Api-Version', '2023-10-31') - .send({ endpoint_ids: ['test'], agent_type: 'endpoint' }) + .send({ endpoint_ids: ['test'], agent_type: 'sentinel_one' }) .expect(400, { statusCode: 400, error: 'Bad Request', diff --git a/x-pack/test_serverless/functional/config.base.ts b/x-pack/test_serverless/functional/config.base.ts index 51227434fd377..7827714dea55d 100644 --- a/x-pack/test_serverless/functional/config.base.ts +++ b/x-pack/test_serverless/functional/config.base.ts @@ -60,8 +60,8 @@ export function createTestConfig(options: CreateTestConfigOptions) { observability: { pathname: '/app/observability', }, - observabilityLogExplorer: { - pathname: '/app/observability-log-explorer', + observabilityLogsExplorer: { + pathname: '/app/observability-logs-explorer', }, management: { pathname: '/app/management', diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover.ts index 9768eb43e76ca..e301266dcd168 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover.ts @@ -150,7 +150,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); }); - describe('query #2, which has an empty time range', () => { + // FLAKY: https://github.com/elastic/kibana/issues/173292 + // FLAKY: https://github.com/elastic/kibana/issues/173784 + describe.skip('query #2, which has an empty time range', () => { const fromTime = 'Jun 11, 1999 @ 09:22:11.000'; const toTime = 'Jun 12, 1999 @ 11:21:04.000'; diff --git a/x-pack/test_serverless/functional/test_suites/common/management/data_views/_cache.ts b/x-pack/test_serverless/functional/test_suites/common/management/data_views/_cache.ts index 3050ef2456fbf..f7ae8fbe2cd6e 100644 --- a/x-pack/test_serverless/functional/test_suites/common/management/data_views/_cache.ts +++ b/x-pack/test_serverless/functional/test_suites/common/management/data_views/_cache.ts @@ -18,7 +18,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should not have cache setting', async () => { await testSubjects.missingOrFail( - 'advancedSetting-editField-data_views\\:cache_max_age-group' + 'management-settings-editField-data_views\\:cache_max_age-group' ); }); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/cypress/e2e/navigation.cy.ts b/x-pack/test_serverless/functional/test_suites/observability/cypress/e2e/navigation.cy.ts index 8453042cc7161..88190fa496156 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/cypress/e2e/navigation.cy.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/cypress/e2e/navigation.cy.ts @@ -27,7 +27,7 @@ describe.skip('Serverless', () => { cy.loginAsElasticUser(); cy.contains('Logs Explorer').click(); - cy.url().should('include', '/app/observability-log-explorer'); + cy.url().should('include', '/app/observability-logs-explorer'); cy.contains('Dashboards').click(); cy.url().should('include', '/app/dashboards'); diff --git a/x-pack/test_serverless/functional/test_suites/observability/index.ts b/x-pack/test_serverless/functional/test_suites/observability/index.ts index 992ace677b01c..c8e82d6017636 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/index.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/index.ts @@ -11,7 +11,7 @@ export default function ({ loadTestFile }: FtrProviderContext) { describe('serverless observability UI', function () { loadTestFile(require.resolve('./landing_page')); loadTestFile(require.resolve('./navigation')); - loadTestFile(require.resolve('./observability_log_explorer')); + loadTestFile(require.resolve('./observability_logs_explorer')); loadTestFile(require.resolve('./rules/rules_list')); loadTestFile(require.resolve('./cases')); loadTestFile(require.resolve('./advanced_settings')); diff --git a/x-pack/test_serverless/functional/test_suites/observability/landing_page.ts b/x-pack/test_serverless/functional/test_suites/observability/landing_page.ts index 68263e5ce2c39..07471b17e11c0 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/landing_page.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/landing_page.ts @@ -13,7 +13,8 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { const svlObltNavigation = getService('svlObltNavigation'); const SvlObltOnboardingStreamLogFilePage = getPageObject('SvlObltOnboardingStreamLogFilePage'); - describe('landing page', function () { + // FLAKY: https://github.com/elastic/kibana/issues/168037 + describe.skip('landing page', function () { before(async () => { await svlCommonPage.login(); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/navigation.ts b/x-pack/test_serverless/functional/test_suites/observability/navigation.ts index f899d6760db02..302a786286ae5 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/navigation.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/navigation.ts @@ -42,14 +42,14 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await svlCommonNavigation.sidenav.expectSectionClosed('project_settings_project_nav'); // navigate to the logs explorer tab by default - await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'observability-log-explorer' }); + await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'observability-logs-explorer' }); await svlCommonNavigation.sidenav.expectLinkActive({ - deepLinkId: 'observability-log-explorer', + deepLinkId: 'observability-logs-explorer', }); await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ - deepLinkId: 'observability-log-explorer', + deepLinkId: 'observability-logs-explorer', }); - expect(await browser.getCurrentUrl()).contain('/app/observability-log-explorer'); + expect(await browser.getCurrentUrl()).contain('/app/observability-logs-explorer'); // check the aiops subsection await svlCommonNavigation.sidenav.openSection('observability_project_nav.aiops'); // open ai ops subsection diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/app.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/app.ts similarity index 92% rename from x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/app.ts rename to x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/app.ts index 4a1cf5024ff4d..6f98ca40aa0fc 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/app.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/app.ts @@ -10,7 +10,7 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getPageObjects, getService }: FtrProviderContext) { const PageObjects = getPageObjects([ - 'observabilityLogExplorer', + 'observabilityLogsExplorer', 'svlCommonNavigation', 'svlCommonPage', ]); @@ -28,10 +28,10 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); it('is shown in the global search', async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); await PageObjects.svlCommonNavigation.search.showSearch(); - await PageObjects.svlCommonNavigation.search.searchFor('log explorer'); + await PageObjects.svlCommonNavigation.search.searchFor('logs explorer'); const results = await PageObjects.svlCommonNavigation.search.getDisplayedResults(); expect(results[0].label).to.eql('Logs Explorer'); @@ -44,7 +44,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const to = '2023-08-03T10:24:14.091Z'; const COUNT = 5; await synthtrace.index(generateLogsData({ from, to, count: COUNT })); - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); const docCount = await dataGrid.getDocCount(); expect(docCount).to.be(COUNT); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/columns_selection.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/columns_selection.ts similarity index 97% rename from x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/columns_selection.ts rename to x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/columns_selection.ts index 97b33e956a7e0..1f28612efb6db 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/columns_selection.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/columns_selection.ts @@ -13,7 +13,7 @@ const defaultLogColumns = ['@timestamp', 'resource', 'content']; export default function ({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); - const PageObjects = getPageObjects(['discover', 'observabilityLogExplorer', 'svlCommonPage']); + const PageObjects = getPageObjects(['discover', 'observabilityLogsExplorer', 'svlCommonPage']); const synthtrace = getService('svlLogsSynthtraceClient'); const dataGrid = getService('dataGrid'); const testSubjects = getService('testSubjects'); @@ -22,7 +22,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const TEST_TIMEOUT = 10 * 1000; // 10 secs const navigateToLogExplorer = () => - PageObjects.observabilityLogExplorer.navigateTo({ + PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from, @@ -32,7 +32,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }, }); - describe('When the log explorer loads', () => { + describe('When the logs explorer loads', () => { before(async () => { await synthtrace.index(generateLogsData({ to })); await PageObjects.svlCommonPage.login(); @@ -52,7 +52,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should restore the table columns from the URL state if exists', async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from, @@ -125,7 +125,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(cellValue.includes('event.original')).to.be(false); const cellAttribute = await cellElement.findByTestSubject( - 'logExplorerCellDescriptionList' + 'logsExplorerCellDescriptionList' ); expect(cellAttribute).not.to.be.empty(); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/dataset_selection_state.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/dataset_selection_state.ts similarity index 78% rename from x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/dataset_selection_state.ts rename to x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/dataset_selection_state.ts index b6088ebb6a3d7..53b25cf5011ff 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/dataset_selection_state.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/dataset_selection_state.ts @@ -27,7 +27,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); const PageObjects = getPageObjects([ 'common', - 'observabilityLogExplorer', + 'observabilityLogsExplorer', 'svlCommonPage', 'header', ]); @@ -43,10 +43,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when no dataset selection is given', () => { it('should initialize the "All logs" selection', async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); await PageObjects.header.waitUntilLoadingHasFinished(); const datasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(datasetSelectionTitle).to.be('All logs'); }); @@ -54,7 +54,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when a dataset selection is given', () => { it('should decode and restore the selection from a valid encoded index', async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { datasetSelection: azureActivityDatasetSelection, }, @@ -62,13 +62,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.header.waitUntilLoadingHasFinished(); const datasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(datasetSelectionTitle).to.be('[Azure Logs] activitylogs'); }); it('should fallback to the "All logs" selection and notify the user of an invalid encoded index', async () => { - await PageObjects.observabilityLogExplorer.navigateToWithUncheckedState({ + await PageObjects.observabilityLogsExplorer.navigateToWithUncheckedState({ pageState: { v: 1, datasetSelection: { @@ -79,29 +79,29 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.header.waitUntilLoadingHasFinished(); const datasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); - await PageObjects.observabilityLogExplorer.assertRestoreFailureToastExist(); + await PageObjects.observabilityLogsExplorer.assertRestoreFailureToastExist(); expect(datasetSelectionTitle).to.be('All logs'); }); }); describe('when navigating back and forth on the page history', () => { it('should decode and restore the selection for the current index', async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); await PageObjects.header.waitUntilLoadingHasFinished(); const allDatasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(allDatasetSelectionTitle).to.be('All logs'); - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { datasetSelection: azureActivityDatasetSelection, }, }); await PageObjects.header.waitUntilLoadingHasFinished(); const azureDatasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(azureDatasetSelectionTitle).to.be('[Azure Logs] activitylogs'); // Go back to previous page selection @@ -109,7 +109,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await browser.goBack(); await PageObjects.header.waitUntilLoadingHasFinished(); const backNavigationDatasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(backNavigationDatasetSelectionTitle).to.be('All logs'); }); @@ -118,7 +118,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await browser.goForward(); await PageObjects.header.waitUntilLoadingHasFinished(); const forwardNavigationDatasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(forwardNavigationDatasetSelectionTitle).to.be('[Azure Logs] activitylogs'); }); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/dataset_selector.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/dataset_selector.ts similarity index 70% rename from x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/dataset_selector.ts rename to x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/dataset_selector.ts index de0f3b24d9a35..a0b5a5d0bc8cd 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/dataset_selector.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/dataset_selector.ts @@ -27,7 +27,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects([ 'common', 'discover', - 'observabilityLogExplorer', + 'observabilityLogsExplorer', 'svlCommonPage', ]); @@ -39,7 +39,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { this.tags(['failsOnMKI']); before(async () => { await PageObjects.svlCommonPage.login(); - await PageObjects.observabilityLogExplorer.removeInstalledPackages(); + await PageObjects.observabilityLogsExplorer.removeInstalledPackages(); }); after(async () => { @@ -48,18 +48,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('as consistent behavior', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); }); it('should always display the Integrations, Uncategorized and Data Views top level tabs', async () => { - const integrationsTab = await PageObjects.observabilityLogExplorer.getIntegrationsTab(); - const uncategorizedTab = await PageObjects.observabilityLogExplorer.getUncategorizedTab(); - const dataViewsTab = await PageObjects.observabilityLogExplorer.getDataViewsTab(); + const integrationsTab = await PageObjects.observabilityLogsExplorer.getIntegrationsTab(); + const uncategorizedTab = await PageObjects.observabilityLogsExplorer.getUncategorizedTab(); + const dataViewsTab = await PageObjects.observabilityLogsExplorer.getDataViewsTab(); expect(await integrationsTab.isDisplayed()).to.be(true); expect(await integrationsTab.getVisibleText()).to.be('Integrations'); @@ -71,7 +71,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should always display the "Show all logs" action', async () => { const allLogDatasetButton = - await PageObjects.observabilityLogExplorer.getAllLogDatasetsButton(); + await PageObjects.observabilityLogsExplorer.getAllLogDatasetsButton(); const allLogDatasetTitle = await allLogDatasetButton.getVisibleText(); @@ -83,17 +83,17 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // Skip the test in case network condition utils are not available try { await retry.try(async () => { - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noIntegrationsTitle ); }); await PageObjects.common.sleep(5000); await browser.setNetworkConditions('OFFLINE'); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('a'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('a'); await retry.try(async () => { - await PageObjects.observabilityLogExplorer.assertListStatusErrorPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusErrorPromptExistsWithTitle( noIntegrationsTitle ); }); @@ -105,12 +105,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should display an empty prompt for no integrations', async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(menuEntries.length).to.be(0); - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noIntegrationsTitle ); }); @@ -122,10 +122,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { try { await browser.setNetworkConditions('SLOW_3G'); // Almost stuck network conditions const uncategorizedTab = - await PageObjects.observabilityLogExplorer.getUncategorizedTab(); + await PageObjects.observabilityLogsExplorer.getUncategorizedTab(); await uncategorizedTab.click(); - await PageObjects.observabilityLogExplorer.assertLoadingSkeletonExists(); + await PageObjects.observabilityLogsExplorer.assertLoadingSkeletonExists(); await browser.restoreNetworkConditions(); } catch (error) { @@ -134,23 +134,24 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should display an error prompt if could not retrieve the datasets', async function () { - const uncategorizedTab = await PageObjects.observabilityLogExplorer.getUncategorizedTab(); + const uncategorizedTab = + await PageObjects.observabilityLogsExplorer.getUncategorizedTab(); await uncategorizedTab.click(); // Skip the test in case network condition utils are not available try { await retry.try(async () => { - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noUncategorizedTitle ); }); await PageObjects.common.sleep(5000); await browser.setNetworkConditions('OFFLINE'); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('a'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('a'); await retry.try(async () => { - await PageObjects.observabilityLogExplorer.assertListStatusErrorPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusErrorPromptExistsWithTitle( noUncategorizedTitle ); }); @@ -162,16 +163,17 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should display an empty prompt for no uncategorized data streams', async () => { - const uncategorizedTab = await PageObjects.observabilityLogExplorer.getUncategorizedTab(); + const uncategorizedTab = + await PageObjects.observabilityLogsExplorer.getUncategorizedTab(); await uncategorizedTab.click(); - const uncategorizedEntries = await PageObjects.observabilityLogExplorer + const uncategorizedEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(uncategorizedEntries.length).to.be(0); - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noUncategorizedTitle ); }); @@ -183,31 +185,31 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { before(async () => { await esArchiver.load( - 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + 'x-pack/test/functional/es_archives/observability_logs_explorer/data_streams' ); cleanupIntegrationsSetup = - await PageObjects.observabilityLogExplorer.setupInitialIntegrations(); + await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); }); after(async () => { await esArchiver.unload( - 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + 'x-pack/test/functional/es_archives/observability_logs_explorer/data_streams' ); await cleanupIntegrationsSetup(); }); describe('when open on the integrations tab', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); }); it('should display a list of installed integrations', async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations.length).to.be(3); expect(integrations).to.eql(initialPackagesTexts); @@ -215,55 +217,55 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should sort the integrations list by the clicked sorting option', async () => { // Test ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql(initialPackagesTexts); }); // Test descending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('desc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('desc'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql(initialPackagesTexts.slice().reverse()); }); // Test back ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql(initialPackagesTexts); }); }); it('should filter the integrations list by the typed integration name', async () => { - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('system'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('system'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.system]); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('a'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('a'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.apache, initialPackageMap.aws]); }); }); it('should display an empty prompt when the search does not match any result', async () => { - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('no result search text'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('no result search text'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations.length).to.be(0); }); - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noIntegrationsTitle ); }); @@ -271,28 +273,28 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should load more integrations by scrolling to the end of the list', async () => { // Install more integrations and reload the page const cleanupAdditionalSetup = - await PageObjects.observabilityLogExplorer.setupAdditionalIntegrations(); + await PageObjects.observabilityLogsExplorer.setupAdditionalIntegrations(); await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); // Initially fetched integrations await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(nodes.length).to.be(15); await nodes.at(-1)?.scrollIntoView(); }); // Load more integrations await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(nodes.length).to.be(20); await nodes.at(-1)?.scrollIntoView(); }); // No other integrations to load after scrolling to last integration await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(nodes.length).to.be(20); }); @@ -301,28 +303,28 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('clicking on integration and moving into the second navigation level', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); }); it('should display a list of available datasets', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { const [panelTitleNode, integrationDatasetEntries] = - await PageObjects.observabilityLogExplorer + await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -334,46 +336,46 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should sort the datasets list by the clicked sorting option', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); expect(await panelTitleNode.getVisibleText()).to.be('Apache HTTP Server'); }); // Test ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be('access'); expect(await menuEntries[1].getVisibleText()).to.be('error'); }); // Test descending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('desc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('desc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be('error'); expect(await menuEntries[1].getVisibleText()).to.be('access'); }); // Test back ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be('access'); expect(await menuEntries[1].getVisibleText()).to.be('error'); @@ -382,33 +384,33 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should filter the datasets list by the typed dataset name', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); expect(await panelTitleNode.getVisibleText()).to.be('Apache HTTP Server'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be('access'); expect(await menuEntries[1].getVisibleText()).to.be('error'); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('err'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('err'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(menuEntries.length).to.be(1); expect(await menuEntries[0].getVisibleText()).to.be('error'); @@ -417,22 +419,22 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should update the current selection with the clicked dataset', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); expect(await panelTitleNode.getVisibleText()).to.be('Apache HTTP Server'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be('access'); menuEntries[0].click(); @@ -440,7 +442,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const selectorButton = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButton(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButton(); expect(await selectorButton.getVisibleText()).to.be('[Apache HTTP Server] access'); }); @@ -450,25 +452,25 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when open on the uncategorized tab', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); - await PageObjects.observabilityLogExplorer + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer .getUncategorizedTab() .then((tab) => tab.click()); }); it('should display a list of available datasets', async () => { await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -481,19 +483,19 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should sort the datasets list by the clicked sorting option', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); expect(await panelTitleNode.getVisibleText()).to.be('Uncategorized'); }); // Test ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); expect(await menuEntries[1].getVisibleText()).to.be(expectedUncategorized[1]); @@ -501,11 +503,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); // Test descending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('desc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('desc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[2]); expect(await menuEntries[1].getVisibleText()).to.be(expectedUncategorized[1]); @@ -513,11 +515,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); // Test back ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); expect(await menuEntries[1].getVisibleText()).to.be(expectedUncategorized[1]); @@ -527,29 +529,29 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should filter the datasets list by the typed dataset name', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); expect(await panelTitleNode.getVisibleText()).to.be('Uncategorized'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); expect(await menuEntries[1].getVisibleText()).to.be(expectedUncategorized[1]); expect(await menuEntries[2].getVisibleText()).to.be(expectedUncategorized[2]); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('retail'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('retail'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(menuEntries.length).to.be(1); expect(await menuEntries[0].getVisibleText()).to.be('retail'); @@ -558,17 +560,17 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should update the current selection with the clicked dataset', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); expect(await panelTitleNode.getVisibleText()).to.be('Uncategorized'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); menuEntries[0].click(); @@ -576,7 +578,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const selectorButton = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButton(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButton(); expect(await selectorButton.getVisibleText()).to.be(expectedUncategorized[0]); }); @@ -585,28 +587,28 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when open on the data views tab', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); - await PageObjects.observabilityLogExplorer.getDataViewsTab().then((tab) => tab.click()); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.getDataViewsTab().then((tab) => tab.click()); }); it('should display a list of available data views', async () => { await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); expect( - await PageObjects.observabilityLogExplorer.getDataViewsContextMenuTitle( + await PageObjects.observabilityLogsExplorer.getDataViewsContextMenuTitle( panelTitleNode ) ).to.be('Data Views'); @@ -617,34 +619,34 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should sort the data views list by the clicked sorting option', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); expect( - await PageObjects.observabilityLogExplorer.getDataViewsContextMenuTitle( + await PageObjects.observabilityLogsExplorer.getDataViewsContextMenuTitle( panelTitleNode ) ).to.be('Data Views'); }); // Test descending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('desc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('desc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be(sortedExpectedDataViews[1]); expect(await menuEntries[1].getVisibleText()).to.be(sortedExpectedDataViews[0]); }); // Test back ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be(sortedExpectedDataViews[0]); expect(await menuEntries[1].getVisibleText()).to.be(sortedExpectedDataViews[1]); @@ -653,32 +655,32 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should filter the datasets list by the typed data view name', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); expect( - await PageObjects.observabilityLogExplorer.getDataViewsContextMenuTitle( + await PageObjects.observabilityLogsExplorer.getDataViewsContextMenuTitle( panelTitleNode ) ).to.be('Data Views'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be(expectedDataViews[0]); expect(await menuEntries[1].getVisibleText()).to.be(expectedDataViews[1]); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('logs'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('logs'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(menuEntries.length).to.be(1); expect(await menuEntries[0].getVisibleText()).to.be('logs-*'); @@ -687,21 +689,21 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should navigate to Discover with the clicked data view preselected', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); expect( - await PageObjects.observabilityLogExplorer.getDataViewsContextMenuTitle( + await PageObjects.observabilityLogsExplorer.getDataViewsContextMenuTitle( panelTitleNode ) ).to.be('Data Views'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[1].getVisibleText()).to.be(expectedDataViews[1]); menuEntries[1].click(); @@ -717,27 +719,27 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when open/close the selector', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); }); it('should restore the latest navigation panel', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -746,16 +748,16 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await menuEntries[1].getVisibleText()).to.be('error'); }); - await PageObjects.observabilityLogExplorer.closeDatasetSelector(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.closeDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -766,18 +768,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should restore the latest search results', async () => { - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('system'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('system'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.system]); }); - await PageObjects.observabilityLogExplorer.closeDatasetSelector(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.closeDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.system]); }); }); @@ -785,29 +787,29 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when switching between tabs or integration panels', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); it('should remember the latest search and restore its results', async () => { - await PageObjects.observabilityLogExplorer.openDatasetSelector(); - await PageObjects.observabilityLogExplorer.clearSearchField(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.clearSearchField(); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('apache'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('apache'); await retry.try(async () => { const { nodes, integrations } = - await PageObjects.observabilityLogExplorer.getIntegrations(); + await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.apache]); nodes[0].click(); }); await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -816,40 +818,40 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await menuEntries[1].getVisibleText()).to.be('error'); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('err'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('err'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(menuEntries.length).to.be(1); expect(await menuEntries[0].getVisibleText()).to.be('error'); }); // Navigate back to integrations - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); panelTitleNode.click(); await retry.try(async () => { const { nodes, integrations } = - await PageObjects.observabilityLogExplorer.getIntegrations(); + await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.apache]); - const searchValue = await PageObjects.observabilityLogExplorer.getSearchFieldValue(); + const searchValue = await PageObjects.observabilityLogsExplorer.getSearchFieldValue(); expect(searchValue).to.eql('apache'); nodes[0].click(); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); - const searchValue = await PageObjects.observabilityLogExplorer.getSearchFieldValue(); + const searchValue = await PageObjects.observabilityLogsExplorer.getSearchFieldValue(); expect(searchValue).to.eql('err'); expect(menuEntries.length).to.be(1); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/filter_controls.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/filter_controls.ts similarity index 88% rename from x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/filter_controls.ts rename to x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/filter_controls.ts index 4cd5924e7608c..d0a4b79abbb51 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/filter_controls.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/filter_controls.ts @@ -9,7 +9,7 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); const testSubjects = getService('testSubjects'); - const PageObjects = getPageObjects(['observabilityLogExplorer', 'svlCommonPage']); + const PageObjects = getPageObjects(['observabilityLogsExplorer', 'svlCommonPage']); describe('Filter controls customization', () => { before('initialize tests', async () => { @@ -23,7 +23,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('renders a filter controls section as part of the unified search bar', async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); await testSubjects.existOrFail('datasetFiltersCustomization', { allowHidden: true }); }); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/flyout.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/flyout.ts similarity index 77% rename from x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/flyout.ts rename to x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/flyout.ts index d33d9e97d18c6..f8087eff743c3 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/flyout.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/flyout.ts @@ -34,22 +34,22 @@ const docs = [ export default function ({ getService, getPageObjects }: FtrProviderContext) { const dataGrid = getService('dataGrid'); const testSubjects = getService('testSubjects'); - const PageObjects = getPageObjects(['observabilityLogExplorer', 'svlCommonPage']); + const PageObjects = getPageObjects(['observabilityLogsExplorer', 'svlCommonPage']); describe('Flyout content customization', () => { let cleanupDataStreamSetup: () => Promise; before('initialize tests', async () => { - cleanupDataStreamSetup = await PageObjects.observabilityLogExplorer.setupDataStream( + cleanupDataStreamSetup = await PageObjects.observabilityLogsExplorer.setupDataStream( DATASET_NAME, NAMESPACE ); - await PageObjects.observabilityLogExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); + await PageObjects.observabilityLogsExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); await PageObjects.svlCommonPage.login(); }); beforeEach(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from: new Date(NOW - 60_000).toISOString(), @@ -69,30 +69,30 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should mount the flyout customization content', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutDetail'); + await testSubjects.existOrFail('logsExplorerFlyoutDetail'); }); it('should display a timestamp badge', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutLogTimestamp'); + await testSubjects.existOrFail('logsExplorerFlyoutLogTimestamp'); }); it('should display a log level badge when available', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutLogLevel'); + await testSubjects.existOrFail('logsExplorerFlyoutLogLevel'); await dataGrid.closeFlyout(); await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.missingOrFail('logExplorerFlyoutLogLevel'); + await testSubjects.missingOrFail('logsExplorerFlyoutLogLevel'); }); it('should display a message code block when available', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutLogMessage'); + await testSubjects.existOrFail('logsExplorerFlyoutLogMessage'); await dataGrid.closeFlyout(); await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.missingOrFail('logExplorerFlyoutLogMessage'); + await testSubjects.missingOrFail('logsExplorerFlyoutLogMessage'); }); }); } diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/flyout_highlights.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/flyout_highlights.ts similarity index 62% rename from x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/flyout_highlights.ts rename to x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/flyout_highlights.ts index 85560ee85dd4b..9fa836815a554 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/flyout_highlights.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/flyout_highlights.ts @@ -35,7 +35,7 @@ const sharedDoc = { export default function ({ getService, getPageObjects }: FtrProviderContext) { const dataGrid = getService('dataGrid'); const testSubjects = getService('testSubjects'); - const PageObjects = getPageObjects(['observabilityLogExplorer', 'svlCommonPage']); + const PageObjects = getPageObjects(['observabilityLogsExplorer', 'svlCommonPage']); describe('Flyout highlight customization', () => { let cleanupDataStreamSetup: () => Promise; @@ -61,11 +61,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const docs = [sharedDoc, docWithoutServiceName, docWithoutServiceInfraContainer]; before('setup DataStream', async () => { - cleanupDataStreamSetup = await PageObjects.observabilityLogExplorer.setupDataStream( + cleanupDataStreamSetup = await PageObjects.observabilityLogsExplorer.setupDataStream( DATASET_NAME, NAMESPACE ); - await PageObjects.observabilityLogExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); + await PageObjects.observabilityLogsExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); await PageObjects.svlCommonPage.login(); }); @@ -77,7 +77,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); beforeEach(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from: new Date(NOW - 60_000).toISOString(), @@ -90,29 +90,29 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should load the service container with all fields', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionServiceInfra'); - await testSubjects.existOrFail('logExplorerFlyoutService'); - await testSubjects.existOrFail('logExplorerFlyoutTrace'); - await testSubjects.existOrFail('logExplorerFlyoutHostName'); - await testSubjects.existOrFail('logExplorerFlyoutClusterName'); - await testSubjects.existOrFail('logExplorerFlyoutResourceId'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionServiceInfra'); + await testSubjects.existOrFail('logsExplorerFlyoutService'); + await testSubjects.existOrFail('logsExplorerFlyoutTrace'); + await testSubjects.existOrFail('logsExplorerFlyoutHostName'); + await testSubjects.existOrFail('logsExplorerFlyoutClusterName'); + await testSubjects.existOrFail('logsExplorerFlyoutResourceId'); await dataGrid.closeFlyout(); }); it('should load the service container even when 1 field is missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionServiceInfra'); - await testSubjects.missingOrFail('logExplorerFlyoutService'); - await testSubjects.existOrFail('logExplorerFlyoutTrace'); - await testSubjects.existOrFail('logExplorerFlyoutHostName'); - await testSubjects.existOrFail('logExplorerFlyoutClusterName'); - await testSubjects.existOrFail('logExplorerFlyoutResourceId'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionServiceInfra'); + await testSubjects.missingOrFail('logsExplorerFlyoutService'); + await testSubjects.existOrFail('logsExplorerFlyoutTrace'); + await testSubjects.existOrFail('logsExplorerFlyoutHostName'); + await testSubjects.existOrFail('logsExplorerFlyoutClusterName'); + await testSubjects.existOrFail('logsExplorerFlyoutResourceId'); await dataGrid.closeFlyout(); }); it('should not load the service container if all fields are missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 2 }); - await testSubjects.missingOrFail('logExplorerFlyoutHighlightSectionServiceInfra'); + await testSubjects.missingOrFail('logsExplorerFlyoutHighlightSectionServiceInfra'); await dataGrid.closeFlyout(); }); }); @@ -131,11 +131,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const docs = [sharedDoc, docWithoutCloudProviderAndInstanceId, docWithoutCloudContainer]; before('setup DataStream', async () => { - cleanupDataStreamSetup = await PageObjects.observabilityLogExplorer.setupDataStream( + cleanupDataStreamSetup = await PageObjects.observabilityLogsExplorer.setupDataStream( DATASET_NAME, NAMESPACE ); - await PageObjects.observabilityLogExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); + await PageObjects.observabilityLogsExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); await PageObjects.svlCommonPage.login(); }); @@ -147,7 +147,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); beforeEach(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from: new Date(NOW - 60_000).toISOString(), @@ -160,36 +160,36 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should load the cloud container with all fields', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionCloud'); - await testSubjects.existOrFail('logExplorerFlyoutCloudProvider'); - await testSubjects.existOrFail('logExplorerFlyoutCloudRegion'); - await testSubjects.existOrFail('logExplorerFlyoutCloudAz'); - await testSubjects.existOrFail('logExplorerFlyoutCloudProjectId'); - await testSubjects.existOrFail('logExplorerFlyoutCloudInstanceId'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionCloud'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudProvider'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudRegion'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudAz'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudProjectId'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudInstanceId'); await dataGrid.closeFlyout(); }); it('should load the cloud container even when some fields are missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionCloud'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionCloud'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudProvider'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudInstanceId'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudProvider'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudInstanceId'); - await testSubjects.existOrFail('logExplorerFlyoutCloudRegion'); - await testSubjects.existOrFail('logExplorerFlyoutCloudAz'); - await testSubjects.existOrFail('logExplorerFlyoutCloudProjectId'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudRegion'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudAz'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudProjectId'); await dataGrid.closeFlyout(); }); it('should not load the cloud container if all fields are missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 2 }); - await testSubjects.missingOrFail('logExplorerFlyoutHighlightSectionCloud'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudProvider'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudRegion'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudAz'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudProjectId'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudInstanceId'); + await testSubjects.missingOrFail('logsExplorerFlyoutHighlightSectionCloud'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudProvider'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudRegion'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudAz'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudProjectId'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudInstanceId'); await dataGrid.closeFlyout(); }); }); @@ -203,11 +203,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const docs = [sharedDoc, docWithoutLogPathAndAgentName]; before('setup DataStream', async () => { - cleanupDataStreamSetup = await PageObjects.observabilityLogExplorer.setupDataStream( + cleanupDataStreamSetup = await PageObjects.observabilityLogsExplorer.setupDataStream( DATASET_NAME, NAMESPACE ); - await PageObjects.observabilityLogExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); + await PageObjects.observabilityLogsExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); await PageObjects.svlCommonPage.login(); }); @@ -219,7 +219,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); beforeEach(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from: new Date(NOW - 60_000).toISOString(), @@ -232,23 +232,23 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should load the other container with all fields', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionOther'); - await testSubjects.existOrFail('logExplorerFlyoutLogPathFile'); - await testSubjects.existOrFail('logExplorerFlyoutNamespace'); - await testSubjects.existOrFail('logExplorerFlyoutDataset'); - await testSubjects.existOrFail('logExplorerFlyoutLogShipper'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionOther'); + await testSubjects.existOrFail('logsExplorerFlyoutLogPathFile'); + await testSubjects.existOrFail('logsExplorerFlyoutNamespace'); + await testSubjects.existOrFail('logsExplorerFlyoutDataset'); + await testSubjects.existOrFail('logsExplorerFlyoutLogShipper'); await dataGrid.closeFlyout(); }); it('should load the other container even when some fields are missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionOther'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionOther'); - await testSubjects.missingOrFail('logExplorerFlyoutLogPathFile'); - await testSubjects.missingOrFail('logExplorerFlyoutLogShipper'); + await testSubjects.missingOrFail('logsExplorerFlyoutLogPathFile'); + await testSubjects.missingOrFail('logsExplorerFlyoutLogShipper'); - await testSubjects.existOrFail('logExplorerFlyoutNamespace'); - await testSubjects.existOrFail('logExplorerFlyoutDataset'); + await testSubjects.existOrFail('logsExplorerFlyoutNamespace'); + await testSubjects.existOrFail('logsExplorerFlyoutDataset'); await dataGrid.closeFlyout(); }); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/header_menu.ts similarity index 82% rename from x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts rename to x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/header_menu.ts index 386177dde6f67..a4768c4415e4b 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/header_menu.ts @@ -15,7 +15,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const testSubjects = getService('testSubjects'); const PageObjects = getPageObjects([ 'discover', - 'observabilityLogExplorer', + 'observabilityLogsExplorer', 'svlCommonPage', 'timePicker', 'header', @@ -27,11 +27,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { before(async () => { await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); await esArchiver.load( - 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + 'x-pack/test/functional/es_archives/observability_logs_explorer/data_streams' ); await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); await PageObjects.svlCommonPage.login(); - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); await PageObjects.header.waitUntilLoadingHasFinished(); }); @@ -39,19 +39,19 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.svlCommonPage.forceLogout(); await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); await esArchiver.unload( - 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + 'x-pack/test/functional/es_archives/observability_logs_explorer/data_streams' ); await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); }); it('should inject the app header menu on the top navbar', async () => { - const headerMenu = await PageObjects.observabilityLogExplorer.getHeaderMenu(); + const headerMenu = await PageObjects.observabilityLogsExplorer.getHeaderMenu(); expect(await headerMenu.isDisplayed()).to.be(true); }); describe('Discover fallback link', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { // avoid aligning with the test data, because that's what Discover // does later in this test and we wouldn't be able to check the time @@ -67,7 +67,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should render a button link ', async () => { - const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + const discoverLink = await PageObjects.observabilityLogsExplorer.getDiscoverFallbackLink(); expect(await discoverLink.isDisplayed()).to.be(true); }); @@ -78,9 +78,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); const timeConfig = await PageObjects.timePicker.getTimeConfig(); // Set query bar value - await PageObjects.observabilityLogExplorer.submitQuery('*favicon*'); + await PageObjects.observabilityLogsExplorer.submitQuery('*favicon*'); - const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + const discoverLink = await PageObjects.observabilityLogsExplorer.getDiscoverFallbackLink(); discoverLink.click(); await PageObjects.discover.waitForDocTableLoadingComplete(); @@ -99,14 +99,16 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await PageObjects.timePicker.getTimeConfig()).to.eql(timeConfig); }); await retry.try(async () => { - expect(await PageObjects.observabilityLogExplorer.getQueryBarValue()).to.eql('*favicon*'); + expect(await PageObjects.observabilityLogsExplorer.getQueryBarValue()).to.eql( + '*favicon*' + ); }); }); }); describe('Discover tabs', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { // avoid aligning with the test data, because that's what Discover // does later in this test and we wouldn't be able to check the time @@ -130,7 +132,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const timeConfig = await PageObjects.timePicker.getTimeConfig(); // Set query bar value - await PageObjects.observabilityLogExplorer.submitQuery('*favicon*'); + await PageObjects.observabilityLogsExplorer.submitQuery('*favicon*'); // go to discover tab await testSubjects.click('discoverTab'); @@ -138,7 +140,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { deepLinkId: 'discover', }); await PageObjects.svlCommonNavigation.breadcrumbs.expectBreadcrumbMissing({ - deepLinkId: 'observability-log-explorer', + deepLinkId: 'observability-logs-explorer', }); expect(await browser.getCurrentUrl()).contain('/app/discover'); @@ -159,36 +161,36 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); await retry.try(async () => { - expect(await PageObjects.observabilityLogExplorer.getQueryBarValue()).not.to.eql( + expect(await PageObjects.observabilityLogsExplorer.getQueryBarValue()).not.to.eql( '*favicon*' ); }); - // go to log explorer tab - await testSubjects.click('logExplorerTab'); + // go to logs explorer tab + await testSubjects.click('logsExplorerTab'); await PageObjects.svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ deepLinkId: 'discover', }); await PageObjects.svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ - deepLinkId: 'observability-log-explorer', + deepLinkId: 'observability-logs-explorer', }); - expect(await browser.getCurrentUrl()).contain('/app/observability-log-explorer'); + expect(await browser.getCurrentUrl()).contain('/app/observability-logs-explorer'); }); }); describe('Add data link', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); await PageObjects.header.waitUntilLoadingHasFinished(); }); it('should render a button link ', async () => { - const onboardingLink = await PageObjects.observabilityLogExplorer.getOnboardingLink(); + const onboardingLink = await PageObjects.observabilityLogsExplorer.getOnboardingLink(); expect(await onboardingLink.isDisplayed()).to.be(true); }); it('should navigate to the observability onboarding overview page', async () => { - const onboardingLink = await PageObjects.observabilityLogExplorer.getOnboardingLink(); + const onboardingLink = await PageObjects.observabilityLogsExplorer.getOnboardingLink(); onboardingLink.click(); await retry.try(async () => { diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/index.ts similarity index 93% rename from x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts rename to x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/index.ts index ad6f7b7278e48..c248e31df92e3 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/index.ts @@ -8,7 +8,7 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { - describe('Observability Log Explorer', function () { + describe('Observability Logs Explorer', function () { loadTestFile(require.resolve('./app')); loadTestFile(require.resolve('./columns_selection')); loadTestFile(require.resolve('./dataset_selection_state')); diff --git a/x-pack/test_serverless/functional/test_suites/search/navigation.ts b/x-pack/test_serverless/functional/test_suites/search/navigation.ts index 8796dcfe93773..bfa31544f7d0b 100644 --- a/x-pack/test_serverless/functional/test_suites/search/navigation.ts +++ b/x-pack/test_serverless/functional/test_suites/search/navigation.ts @@ -64,7 +64,7 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await svlCommonNavigation.sidenav.expectLinkActive({ deepLinkId: 'serverlessElasticsearch', }); - await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ text: `Get started` }); + await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ text: `Home` }); await testSubjects.existOrFail(`svlSearchOverviewPage`); await expectNoPageReload(); diff --git a/yarn.lock b/yarn.lock index fa40b7667330a..c2634b0431587 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1739,10 +1739,10 @@ resolved "https://registry.yarnpkg.com/@elastic/eslint-plugin-eui/-/eslint-plugin-eui-0.0.2.tgz#56b9ef03984a05cc213772ae3713ea8ef47b0314" integrity sha512-IoxURM5zraoQ7C8f+mJb9HYSENiZGgRVcG4tLQxE61yHNNRDXtGDWTZh8N1KIHcsqN1CEPETjuzBXkJYF/fDiQ== -"@elastic/eui@92.1.1": - version "92.1.1" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-92.1.1.tgz#f5713bfa12733a2c62df365e37f7983a7c08411e" - integrity sha512-kjUP+IewVcoJ59e84lHwtdy5OvGNSmlHvzn5uUmGTKnBGOxoYv5K9pyGujVWpxSCG9MNr3anMsNE7EX6usj37A== +"@elastic/eui@92.2.1": + version "92.2.1" + resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-92.2.1.tgz#172b5122e1025307bbb8e2c6a115c3feb3a16f42" + integrity sha512-FujsbJtuh8mxG5mbqclQBdPoW1kn9kXd/hpaMXUJa7bb0bmqlJRmagULPTZ+5e60Q6PEQt+e7MFDsaq4elSthQ== dependencies: "@hello-pangea/dnd" "^16.3.0" "@types/lodash" "^4.14.198" @@ -7517,10 +7517,10 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= -"@puppeteer/browsers@1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-1.8.0.tgz#fb6ee61de15e7f0e67737aea9f9bab1512dbd7d8" - integrity sha512-TkRHIV6k2D8OlUe8RtG+5jgOF/H98Myx0M6AOafC8DdNVOFiBSFa5cpRDtpm8LXOa9sVwe0+e6Q3FC56X/DZfg== +"@puppeteer/browsers@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-1.9.1.tgz#384ee8b09786f0e8f62b1925e4c492424cb549ee" + integrity sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA== dependencies: debug "4.3.4" extract-zip "2.0.1" @@ -13206,10 +13206,10 @@ chromedriver@^120.0.0: proxy-from-env "^1.1.0" tcp-port-used "^1.0.2" -chromium-bidi@0.4.33: - version "0.4.33" - resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.4.33.tgz#9a9aba5a5b07118c8e7d6405f8ee79f47418dd1d" - integrity sha512-IxoFM5WGQOIAd95qrSXzJUv4eXIrh+RvU3rwwqIiwYuvfE7U/Llj4fejbsJnjJMUYCuGtVQsY2gv7oGl4aTNSQ== +chromium-bidi@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.5.4.tgz#dcf60bbc510a0a1d19b35012d7bb53f82bb5f2ba" + integrity sha512-p9CdiHl0xNh4P7oVa44zXgJJw+pvnHXFDB+tVdo25xaPLgQDVf2kQO+TDxD2fp2Evqi7vs/vGRINMzl1qJrWiw== dependencies: mitt "3.0.1" urlpattern-polyfill "9.0.0" @@ -13891,15 +13891,15 @@ core-util-is@1.0.2, core-util-is@^1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cosmiconfig@8.3.6: - version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" - integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== +cosmiconfig@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== dependencies: + env-paths "^2.2.1" import-fresh "^3.3.0" js-yaml "^4.1.0" parse-json "^5.2.0" - path-type "^4.0.0" cosmiconfig@^6.0.0: version "6.0.0" @@ -15207,10 +15207,10 @@ detective@^5.0.2: defined "^1.0.0" minimist "^1.1.1" -devtools-protocol@0.0.1203626: - version "0.0.1203626" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1203626.tgz#4366a4c81a7e0d4fd6924e9182c67f1e5941e820" - integrity sha512-nEzHZteIUZfGCZtTiS1fRpC8UZmsfD1SiyPvaUNvS13dvKf666OAm8YTi0+Ca3n1nLEyu49Cy4+dPWpaHFJk9g== +devtools-protocol@0.0.1232444: + version "0.0.1232444" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1232444.tgz#406345a90a871ba852c530d73482275234936eed" + integrity sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg== dezalgo@^1.0.0, dezalgo@^1.0.4: version "1.0.4" @@ -15837,10 +15837,10 @@ entities@~2.1.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== -env-paths@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" - integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== +env-paths@^2.2.0, env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== envinfo@^7.7.3: version "7.7.3" @@ -25415,26 +25415,26 @@ pupa@^3.1.0: dependencies: escape-goat "^4.0.0" -puppeteer-core@21.5.2: - version "21.5.2" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-21.5.2.tgz#6d3de4efb2ae65f1ee072043787b75594e88035f" - integrity sha512-v4T0cWnujSKs+iEfmb8ccd7u4/x8oblEyKqplqKnJ582Kw8PewYAWvkH4qUWhitN3O2q9RF7dzkvjyK5HbzjLA== +puppeteer-core@21.9.0: + version "21.9.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-21.9.0.tgz#7462d5dd0571cd1e0580cc3729d7951cc6fe2505" + integrity sha512-QgowcczLAoLWlV38s3y3VuEvjJGfKU5rR6Q23GUbiGOaiQi+QpaWQ+aXdzP9LHVSUPmHdAaWhcvMztYSw3f8gQ== dependencies: - "@puppeteer/browsers" "1.8.0" - chromium-bidi "0.4.33" + "@puppeteer/browsers" "1.9.1" + chromium-bidi "0.5.4" cross-fetch "4.0.0" debug "4.3.4" - devtools-protocol "0.0.1203626" - ws "8.14.2" + devtools-protocol "0.0.1232444" + ws "8.16.0" -puppeteer@21.5.2: - version "21.5.2" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-21.5.2.tgz#0a4a72175c0fd0944d6486f4734807e1671d527b" - integrity sha512-BaAGJOq8Fl6/cck6obmwaNLksuY0Bg/lIahCLhJPGXBFUD2mCffypa4A592MaWnDcye7eaHmSK9yot0pxctY8A== +puppeteer@21.9.0: + version "21.9.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-21.9.0.tgz#ff6cb321f6d43c1f39ba74bbdfccf2b5ef0121af" + integrity sha512-vcLR81Rp+MBrgqhiXZfpwEBbyKTa88Hd+8Al3+emWzcJb9evLLSfUYli0QUqhofPFrXsO2A/dAF9OunyOivL6w== dependencies: - "@puppeteer/browsers" "1.8.0" - cosmiconfig "8.3.6" - puppeteer-core "21.5.2" + "@puppeteer/browsers" "1.9.1" + cosmiconfig "9.0.0" + puppeteer-core "21.9.0" pure-rand@^6.0.0: version "6.0.2" @@ -26497,14 +26497,6 @@ redux-logger@^3.0.6: dependencies: deep-diff "^0.3.5" -redux-observable@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redux-observable/-/redux-observable-2.0.0.tgz#4358bef2e924723a8b1ad0e835ccebb1612a6b9a" - integrity sha512-FJz4rLXX+VmDDwZS/LpvQsKnSanDOe8UVjiLryx1g3seZiS69iLpMrcvXD5oFO7rtkPyRdo/FmTqldnT3X3m+w== - dependencies: - rxjs "^7.0.0" - tslib "~2.1.0" - redux-saga@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-1.1.3.tgz#9f3e6aebd3c994bbc0f6901a625f9a42b51d1112" @@ -27226,7 +27218,7 @@ rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.5.1, rxjs@^6.6.0, rxjs@^6.6.7: dependencies: tslib "^1.9.0" -rxjs@^7.0.0, rxjs@^7.4.0, rxjs@^7.5.5: +rxjs@^7.4.0, rxjs@^7.5.5: version "7.8.0" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== @@ -27543,10 +27535,10 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -selenium-webdriver@^4.16.0: - version "4.16.0" - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.16.0.tgz#2f1a2426d876aa389d1c937b00f034c2c7808360" - integrity sha512-IbqpRpfGE7JDGgXHJeWuCqT/tUqnLvZ14csSwt+S8o4nJo3RtQoE9VR4jB47tP/A8ArkYsh/THuMY6kyRP6kuA== +selenium-webdriver@^4.17.0: + version "4.17.0" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.17.0.tgz#f6c93a9df3e0543df7dc2329d81968af42845a7f" + integrity sha512-e2E+2XBlGepzwgFbyQfSwo9Cbj6G5fFfs9MzAS00nC99EewmcS2rwn2MwtgfP7I5p1e7DYv4HQJXtWedsu6DvA== dependencies: jszip "^3.10.1" tmp "^0.2.1" @@ -29801,11 +29793,6 @@ tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4 resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -tslib@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" - integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== - tslib@~2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" @@ -31734,10 +31721,10 @@ write-file-atomic@^4.0.1, write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" -ws@8.14.2, ws@>=8.14.2, ws@^8.2.3, ws@^8.4.2, ws@^8.9.0: - version "8.14.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" - integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== +ws@8.16.0, ws@>=8.14.2, ws@^8.2.3, ws@^8.4.2, ws@^8.9.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== ws@^7.3.1, ws@^7.4.2: version "7.5.9"