diff --git a/.buildkite/pipelines/artifacts.yml b/.buildkite/pipelines/artifacts.yml index 64ebe01e9227b..ccef23374d91b 100644 --- a/.buildkite/pipelines/artifacts.yml +++ b/.buildkite/pipelines/artifacts.yml @@ -88,7 +88,7 @@ steps: - exit_status: -1 agents: queue: n2-2 - timeout_in_minutes: 30 + timeout_in_minutes: 60 if: "build.env('RELEASE_BUILD') == null || build.env('RELEASE_BUILD') == '' || build.env('RELEASE_BUILD') == 'false'" retry: automatic: diff --git a/.buildkite/scripts/steps/checks/yarn_deduplicate.sh b/.buildkite/scripts/steps/checks/yarn_deduplicate.sh index ce62b2312c034..22bf115aad9c0 100755 --- a/.buildkite/scripts/steps/checks/yarn_deduplicate.sh +++ b/.buildkite/scripts/steps/checks/yarn_deduplicate.sh @@ -7,4 +7,4 @@ source .buildkite/scripts/common/util.sh echo "--- Check yarn.lock for duplicated modules" node scripts/yarn_deduplicate -check_for_changed_files 'node scripts/yarn_deduplicate && yarn kbn bootstrap' false +check_for_changed_files 'node scripts/yarn_deduplicate' false 'TO FIX: Run node '"'"'scripts/yarn_deduplicate && yarn kbn bootstrap'"'"' locally, or add an exception to src/dev/yarn_deduplicate/index.ts and then commit the changes and push to your branch' diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7d95257248bfc..b3d2e9cf82ad4 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -486,6 +486,7 @@ src/plugins/kibana_utils @elastic/appex-sharedux x-pack/plugins/kubernetes_security @elastic/kibana-cloud-security-posture packages/kbn-language-documentation-popover @elastic/kibana-visualizations packages/kbn-lens-embeddable-utils @elastic/obs-ux-infra_services-team @elastic/kibana-visualizations +packages/kbn-lens-formula-docs @elastic/kibana-visualizations x-pack/plugins/lens @elastic/kibana-visualizations x-pack/plugins/license_api_guard @elastic/platform-deployment-management x-pack/plugins/license_management @elastic/platform-deployment-management diff --git a/.i18nrc.json b/.i18nrc.json index 1af130820cd36..119c072688489 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -79,6 +79,7 @@ "kibana_utils": "src/plugins/kibana_utils", "kibana-react": "src/plugins/kibana_react", "kibanaOverview": "src/plugins/kibana_overview", + "lensFormulaDocs": "packages/kbn-lens-formula-docs", "lists": "packages/kbn-securitysolution-list-utils/src", "exceptionList-components": "packages/kbn-securitysolution-exception-list-components/src", "management": [ diff --git a/.node-version b/.node-version index 87ec8842b158d..d5a159609d095 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -18.18.2 +20.10.0 diff --git a/.nvmrc b/.nvmrc index 87ec8842b158d..d5a159609d095 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -18.18.2 +20.10.0 diff --git a/NOTICE.txt b/NOTICE.txt index 45af6e5231783..d02031c4b5a2b 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -1,5 +1,5 @@ Kibana source code with Kibana X-Pack source code -Copyright 2012-2023 Elasticsearch B.V. +Copyright 2012-2024 Elasticsearch B.V. --- Pretty handling of logarithmic axes. diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index 49623728f1afe..5f8cce19705d4 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -22,13 +22,13 @@ load("@build_bazel_rules_nodejs//:index.bzl", "node_repositories", "yarn_install # Setup the Node.js toolchain for the architectures we want to support node_repositories( node_repositories = { - "18.18.2-darwin_amd64": ("node-v18.18.2-darwin-x64.tar.gz", "node-v18.18.2-darwin-x64", "5bb8da908ed590e256a69bf2862238c8a67bc4600119f2f7721ca18a7c810c0f"), - "18.18.2-darwin_arm64": ("node-v18.18.2-darwin-arm64.tar.gz", "node-v18.18.2-darwin-arm64", "9f982cc91b28778dd8638e4f94563b0c2a1da7aba62beb72bd427721035ab553"), - "18.18.2-linux_arm64": ("node-v18.18.2-linux-arm64.tar.xz", "node-v18.18.2-linux-arm64", "8a5a03f6a742159c9aa0ae3a99b368cd938cf62f3a5522a2e5acbe6313710efe"), - "18.18.2-linux_amd64": ("node-v18.18.2-linux-x64.tar.xz", "node-v18.18.2-linux-x64", "f7cf590bc7153f3beaa9e1138d00e50d74df223f0bec61f63e7df65f7315b76a"), - "18.18.2-windows_amd64": ("node-v18.18.2-win-x64.zip", "node-v18.18.2-win-x64", "3bb0e51e579a41a22b3bf6cb2f3e79c03801aa17acbe0ca00fc555d1282e7acd"), + "20.10.0-darwin_amd64": ("node-v20.10.0-darwin-x64.tar.gz", "node-v20.10.0-darwin-x64", "5ff5e8abd3eea6e5f507eb6677554f5b2188eedef654096aa4168a9941e91a32"), + "20.10.0-darwin_arm64": ("node-v20.10.0-darwin-arm64.tar.gz", "node-v20.10.0-darwin-arm64", "68b93099451d77aac116cf8fce179cabcf53fec079508dc6b39d3a086fb461a8"), + "20.10.0-linux_arm64": ("node-v20.10.0-linux-arm64.tar.xz", "node-v20.10.0-linux-arm64", "a5c22683890d5d244f3afd488ef44e573b5b8287f8911b9a1b061ed3f20a5e6d"), + "20.10.0-linux_amd64": ("node-v20.10.0-linux-x64.tar.xz", "node-v20.10.0-linux-x64", "9c0fbc8cc7be9a6543af4b9afb05759c538c0f81015c388d63277b0158507697"), + "20.10.0-windows_amd64": ("node-v20.10.0-win-x64.zip", "node-v20.10.0-win-x64", "e5b861814a97e28ae7ac06a34e88fd5e0565b447d270c26e20b5ef60bf0aaaf9"), }, - node_version = "18.18.2", + node_version = "20.10.0", node_urls = [ "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/dist/v{version}/{filename}", ], diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 5d0be3cc0aa61..44b65cb668c76 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 931cf0a419cb3..472349c4f9a59 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_observability.mdx b/api_docs/ai_assistant_management_observability.mdx index fbe8204a6432d..c18fb87386cbc 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: 2023-12-28 +date: 2024-01-01 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 49dc37b6f9c6a..2ebc63b443a52 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: 2023-12-28 +date: 2024-01-01 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 d92a6e4efd19a..2fde10fac8aca 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index ddd6b49a76358..afa2173382f15 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index ae8239d8e3be4..1f309bdfa527e 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index bfe3f5166e4c8..71239fda07db8 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: 2023-12-28 +date: 2024-01-01 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 2e23a463c1ef5..b1eb5f3e63e6d 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: 2023-12-28 +date: 2024-01-01 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 c22a7b2c4bb74..084c1b951a320 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: 2023-12-28 +date: 2024-01-01 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 6fea73ecf91a6..34bfde19da4fa 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: 2023-12-28 +date: 2024-01-01 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 792ac5ac2dfa8..a4d90fbfdc203 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index ade922736972a..362a075d64092 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: 2023-12-28 +date: 2024-01-01 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 db8a5c038e05b..8888fe9db27f0 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: 2023-12-28 +date: 2024-01-01 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 e25051c230943..395ef8190e716 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: 2023-12-28 +date: 2024-01-01 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 ea83326036af9..1be1bf5e2c423 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: 2023-12-28 +date: 2024-01-01 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 45944e07aa62c..717df98be3a62 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: 2023-12-28 +date: 2024-01-01 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 1d0e1301e7e87..4cce03a63dbc8 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: 2023-12-28 +date: 2024-01-01 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 aa80098d4f642..150c90f8a3214 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index ecd07147cce6f..29052826af95d 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: 2023-12-28 +date: 2024-01-01 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 ce4d83dfb0118..6e31939b25689 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index c3c1b79b40832..8977ba2fa8cdf 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index a835a9d67596f..a36eb829931ec 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index e9f3b00c9683e..22f2e1328a343 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index 3cc5430300624..4c2ea101fff3a 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 8ffd3741df6d6..6762330ceb80c 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index ae338cbe05260..066431cf2625c 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index da8ebf3ef6f3a..58e5d6167fa77 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 61a2de2812d8d..d308ab1a8498f 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: 2023-12-28 +date: 2024-01-01 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 be22f28300695..22e56146a7dce 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: 2023-12-28 +date: 2024-01-01 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 ac34526becee0..f84ec5456c6a6 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 624cc3931b54c..bc211ae7176c1 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: 2023-12-28 +date: 2024-01-01 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 366494907485d..eef2c179cc9d2 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: 2023-12-28 +date: 2024-01-01 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 da781ec9e2446..2d597fac62571 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: 2023-12-28 +date: 2024-01-01 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 6013e8ef52389..ba428c739fbe0 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index c6ed402efd80d..fa51c84a7c066 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 392abccc43561..bcc3c1a02350b 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index b4b36ae5ec989..f770028a7d19f 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: 2023-12-28 +date: 2024-01-01 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 829ec8ee9ebc1..1ffa11617e90f 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: 2023-12-28 +date: 2024-01-01 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 07d9f62967f99..8336d9b1375c8 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: 2023-12-28 +date: 2024-01-01 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 db9f18ceec1dc..9b84e69f252ee 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: 2023-12-28 +date: 2024-01-01 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 39c9d00f53341..0320c7c89a40f 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 4dfc3260018b3..816ba9a46f3a0 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: 2023-12-28 +date: 2024-01-01 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 780486acccbca..93c9faea9a449 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: 2023-12-28 +date: 2024-01-01 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 3a9128966c021..e4fc2b87763a8 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: 2023-12-28 +date: 2024-01-01 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 9f1eb3462408a..4644e1ffa51d2 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: 2023-12-28 +date: 2024-01-01 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 34dc100d331ec..3d2af60bc443b 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index e324502ea0ba2..c3daac75a6d7b 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: 2023-12-28 +date: 2024-01-01 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 d97bc6d08379c..674e4aae380dd 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 9a9c166a5dc3c..3b6716a6ee629 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: 2023-12-28 +date: 2024-01-01 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 4220bd0fbc5c8..60f4261c69795 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: 2023-12-28 +date: 2024-01-01 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 a44f0d9d2c0bf..e6e3f0c244075 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 056990235b47a..0e97b905fe45b 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: 2023-12-28 +date: 2024-01-01 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 7397139fc586e..88b11ec2e350a 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: 2023-12-28 +date: 2024-01-01 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 749ef5a8fb150..639cecdcf137b 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: 2023-12-28 +date: 2024-01-01 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 59209450fbcfa..97cd25e3cfe64 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: 2023-12-28 +date: 2024-01-01 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 c12a2c9bee7c8..d48f81a084099 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: 2023-12-28 +date: 2024-01-01 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 f0676b8f038ad..b6ccb60e2c4ca 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: 2023-12-28 +date: 2024-01-01 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 32712edb3e83a..a74787875d28e 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: 2023-12-28 +date: 2024-01-01 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 2e7c87a6a571d..0d6a0165c1b6a 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: 2023-12-28 +date: 2024-01-01 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 14d271f166d31..e6fb2a0f68e3d 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: 2023-12-28 +date: 2024-01-01 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 1b730e5522c13..da475f0e01b8a 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: 2023-12-28 +date: 2024-01-01 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 b2573f307dc5a..a8780b75e3486 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 93dc30d655485..a62211163dda4 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index 13446ba4e3db0..8561010fb158c 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: 2023-12-28 +date: 2024-01-01 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 e3aaef86bde86..3e7ebb22a80c2 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: 2023-12-28 +date: 2024-01-01 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 fc747f943bbfe..197b4b93843f4 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: 2023-12-28 +date: 2024-01-01 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 3ff17cad1ee83..87e4128d853e1 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: 2023-12-28 +date: 2024-01-01 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 20219b2aa3304..e6ce2650f73df 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: 2023-12-28 +date: 2024-01-01 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 66f20c0e1c76e..cfe8d9cdbc281 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index d60d01a4873ea..3950fbb4c20ef 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: 2023-12-28 +date: 2024-01-01 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 92816d0c07a87..2148851edac90 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: 2023-12-28 +date: 2024-01-01 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 d486a2818af9b..30717f38627b7 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index ba69412d5b75d..c9074ad9b0ee6 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: 2023-12-28 +date: 2024-01-01 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 dcfc071b9c3ed..f5f63aac9382a 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: 2023-12-28 +date: 2024-01-01 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 4d0303bfba0fa..154c43dd3fd69 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 1ca63d2793b20..8e09ef2331adc 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: 2023-12-28 +date: 2024-01-01 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 daf4b151cf5bd..0f6942c037620 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 1f7237389cee7..5b2c265a101b6 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: 2023-12-28 +date: 2024-01-01 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 b1f8323b98db2..8f2615ea4e192 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: 2023-12-28 +date: 2024-01-01 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 c107e23899e6c..fb54835384cba 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: 2023-12-28 +date: 2024-01-01 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 d4cb8c7801a6a..b660b44ed5337 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: 2023-12-28 +date: 2024-01-01 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 2c35109a80c52..fa51a2cd3e6a0 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: 2023-12-28 +date: 2024-01-01 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 8000ff558d454..612f62b6e66ea 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: 2023-12-28 +date: 2024-01-01 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 3f0d13a800152..c978d826e174f 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: 2023-12-28 +date: 2024-01-01 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 1669fc405a77a..4a20e9fbbbe33 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: 2023-12-28 +date: 2024-01-01 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 801b5660ae842..bcb6801834f13 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: 2023-12-28 +date: 2024-01-01 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 2f2a242c9a412..761ae51ec5267 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: 2023-12-28 +date: 2024-01-01 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 9469faf78fd5a..15e34bcf13e8d 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: 2023-12-28 +date: 2024-01-01 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 646bc61983da9..fd172ef0a5eaa 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: 2023-12-28 +date: 2024-01-01 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 278b6f7debef8..7be989318dbc9 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: 2023-12-28 +date: 2024-01-01 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 7444071bb0799..9ed60d111e587 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: 2023-12-28 +date: 2024-01-01 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 8a67a98e73324..a6bb58bcffd9a 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: 2023-12-28 +date: 2024-01-01 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 feafecf8d3f4a..2531829d684e8 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: 2023-12-28 +date: 2024-01-01 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 615a180de42b8..3cd02ec3d19c9 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: 2023-12-28 +date: 2024-01-01 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 b3b686f4405e2..e63eebc283895 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_gainsight.mdx b/api_docs/kbn_analytics_shippers_gainsight.mdx index 05d6ba09b3dbf..5ce05a3aeb655 100644 --- a/api_docs/kbn_analytics_shippers_gainsight.mdx +++ b/api_docs/kbn_analytics_shippers_gainsight.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-gainsight title: "@kbn/analytics-shippers-gainsight" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-gainsight plugin -date: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-gainsight'] --- import kbnAnalyticsShippersGainsightObj from './kbn_analytics_shippers_gainsight.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 3a1d0cccc734c..f2a9413fe1de6 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: 2023-12-28 +date: 2024-01-01 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 719799205b727..c1bbdec645d95 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index fd7c8aa829041..55698a3afd1a7 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index f962a2f718520..58f5c55233bc3 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: 2023-12-28 +date: 2024-01-01 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 e67bfa884e0e8..98579281269a5 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: 2023-12-28 +date: 2024-01-01 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 fe82aae624f7e..1e30c0fa5012c 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: 2023-12-28 +date: 2024-01-01 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 07e67e37d62e6..5869871313098 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: 2023-12-28 +date: 2024-01-01 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 f9709210fdd34..158376a9b8fcb 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: 2023-12-28 +date: 2024-01-01 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 244b83d76d931..96e999aa4e140 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: 2023-12-28 +date: 2024-01-01 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 9ebfcf6dfd921..0e59be34fffa8 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: 2023-12-28 +date: 2024-01-01 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 f7c3291744c60..ad267fce50788 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: 2023-12-28 +date: 2024-01-01 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 1936c9e29ba1e..08d9e4fd83b08 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: 2023-12-28 +date: 2024-01-01 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 118a392c816e2..7a9ac1653151e 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: 2023-12-28 +date: 2024-01-01 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 460658cc72ba7..6b094e0e454ff 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: 2023-12-28 +date: 2024-01-01 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 e9beac09c779b..fb2a0477fd6ba 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: 2023-12-28 +date: 2024-01-01 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 791e08caea35e..85c419833e342 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: 2023-12-28 +date: 2024-01-01 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 ce00c584e5f38..b41d5b251b917 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index 305ab59b01806..013cf12485d41 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: 2023-12-28 +date: 2024-01-01 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 4bfa51cb54787..0c637a259bbf4 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: 2023-12-28 +date: 2024-01-01 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 b0089d5faecce..c5854b5f996a6 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: 2023-12-28 +date: 2024-01-01 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 ebd08670f274c..9c21a33499c1e 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: 2023-12-28 +date: 2024-01-01 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 e22608ddc4008..a81742386804b 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: 2023-12-28 +date: 2024-01-01 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 d8be2c1cf83f8..b03f8a33c81e1 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: 2023-12-28 +date: 2024-01-01 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 5e212ca8040d6..b152fbdd7f585 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: 2023-12-28 +date: 2024-01-01 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 92a43ff189838..2e20854e22426 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: 2023-12-28 +date: 2024-01-01 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 5653f966321f9..b107dc4f91365 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: 2023-12-28 +date: 2024-01-01 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 3cfecced585ed..3052b6e44d471 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: 2023-12-28 +date: 2024-01-01 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 d55ec81977899..dd9fa0f403c58 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: 2023-12-28 +date: 2024-01-01 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 4d32e4633ba48..8b6694a164ec6 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: 2023-12-28 +date: 2024-01-01 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 e76f95a8429e2..805d4c9e1942a 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: 2023-12-28 +date: 2024-01-01 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 d8f9b5d56bf9c..af1287e0c85d2 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: 2023-12-28 +date: 2024-01-01 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 8a405aefca107..992d440a6c59b 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: 2023-12-28 +date: 2024-01-01 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 87bbabe67350b..c6a4487152e32 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: 2023-12-28 +date: 2024-01-01 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 060297c690d4e..01f19ee413d71 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: 2023-12-28 +date: 2024-01-01 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 d3ae493cd8b51..9bf7b8ded9833 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: 2023-12-28 +date: 2024-01-01 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 45a45e18eb54e..7a6a941469f21 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: 2023-12-28 +date: 2024-01-01 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 f2e5567675fb4..a06a08aba07aa 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: 2023-12-28 +date: 2024-01-01 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 d3baf907e7d70..3a6cea726b0eb 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: 2023-12-28 +date: 2024-01-01 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 8647e646d1ad2..3cb39454e881a 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: 2023-12-28 +date: 2024-01-01 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 cc1c934638aee..ea29a4e613180 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: 2023-12-28 +date: 2024-01-01 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 678751d048fbb..a0e33c2c0eea9 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: 2023-12-28 +date: 2024-01-01 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 75f3c4c8ceee3..8ce5e026a6b91 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: 2023-12-28 +date: 2024-01-01 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 2ab35d0a8f180..600561abc4bed 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: 2023-12-28 +date: 2024-01-01 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 8a03096052f61..d900211c183ef 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: 2023-12-28 +date: 2024-01-01 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 a52e0e39c0ae2..e0d48682bbc79 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: 2023-12-28 +date: 2024-01-01 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 e467ba6e826d8..2fb1534e72ffc 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: 2023-12-28 +date: 2024-01-01 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 cf5987cfe5f12..3f011fd2f8701 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: 2023-12-28 +date: 2024-01-01 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 f19e10e73b17f..ea8dec5dae69b 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: 2023-12-28 +date: 2024-01-01 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 28eb33948a95a..811f706b309fe 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: 2023-12-28 +date: 2024-01-01 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 f557bea4c6acb..b0ba3decac8d2 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: 2023-12-28 +date: 2024-01-01 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 b76593333fcd0..e965523a89479 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: 2023-12-28 +date: 2024-01-01 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 8a8be25511dec..00dcb486c38fb 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: 2023-12-28 +date: 2024-01-01 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 5298b9f112ea1..f1c78abadafd6 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: 2023-12-28 +date: 2024-01-01 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 05acdc01e4398..679617c8875a1 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: 2023-12-28 +date: 2024-01-01 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 8d2ab9df99fbb..8c57a8a4111b9 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: 2023-12-28 +date: 2024-01-01 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 c598d8707e646..e91ccf58c1354 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: 2023-12-28 +date: 2024-01-01 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 f2cec537ce5aa..64b91a9ab767e 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: 2023-12-28 +date: 2024-01-01 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 4bc4ec54afc26..4e430e6cdc8ef 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: 2023-12-28 +date: 2024-01-01 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 c68c880784bd0..3a73499e187c8 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: 2023-12-28 +date: 2024-01-01 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 1d9c7b1669c57..948c657a21b87 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: 2023-12-28 +date: 2024-01-01 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 05d3c0e2f8a3c..8f6202422b145 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: 2023-12-28 +date: 2024-01-01 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 27f4f671fffb7..fff0345b18e9a 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: 2023-12-28 +date: 2024-01-01 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 f4697b6f4117f..ebb10427b37b2 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: 2023-12-28 +date: 2024-01-01 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 33d16a0c98aa7..eb3122e46918b 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: 2023-12-28 +date: 2024-01-01 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 e2c9b15d90ad6..3d6742171b38b 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: 2023-12-28 +date: 2024-01-01 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 d44139c95ccb8..54149659a4490 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: 2023-12-28 +date: 2024-01-01 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 6490406ef0dfa..bad65e24b6002 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: 2023-12-28 +date: 2024-01-01 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 e6487fa65df93..9cea11d81f1f5 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: 2023-12-28 +date: 2024-01-01 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 603f152f17df6..a60addb4ccd0b 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: 2023-12-28 +date: 2024-01-01 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 2bfd44426d741..b508e12255b0f 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: 2023-12-28 +date: 2024-01-01 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 b644aafdf0641..b738d2413905a 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: 2023-12-28 +date: 2024-01-01 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 8849a0b8bacd6..b3badc09ee497 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: 2023-12-28 +date: 2024-01-01 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 ecd7b23032179..9bd457faea556 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: 2023-12-28 +date: 2024-01-01 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 9c12b767a9ade..a6038899821c7 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: 2023-12-28 +date: 2024-01-01 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 9e863af106bb3..a59c2744497d9 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: 2023-12-28 +date: 2024-01-01 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 b3aa5488f6430..947d971357967 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: 2023-12-28 +date: 2024-01-01 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 c4bd56891c6b7..2c176a254d164 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: 2023-12-28 +date: 2024-01-01 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 93e78484eb6a1..56831c7d1ea60 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: 2023-12-28 +date: 2024-01-01 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 35e945fdb0a21..12302969dab51 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: 2023-12-28 +date: 2024-01-01 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 a8a4746e3d96b..e706cde3f46df 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: 2023-12-28 +date: 2024-01-01 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 de8442dbe15ba..cfae66dcb2b87 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: 2023-12-28 +date: 2024-01-01 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 2465410ee2de4..45a35f0c50587 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: 2023-12-28 +date: 2024-01-01 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 eac7fcc7790ba..feeed2ac86faf 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: 2023-12-28 +date: 2024-01-01 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 5873a3ae5cdb9..909b22635ffc6 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: 2023-12-28 +date: 2024-01-01 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 9c452058a78a7..e3e7684635901 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: 2023-12-28 +date: 2024-01-01 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 ba256f52733e1..d41c16370f0c0 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: 2023-12-28 +date: 2024-01-01 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 57edad0f859c2..9ff3dd564692b 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: 2023-12-28 +date: 2024-01-01 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 542beb673c5c1..ec944e81fed31 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: 2023-12-28 +date: 2024-01-01 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 3012e7b2a1ae8..a50d4c2fedb62 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: 2023-12-28 +date: 2024-01-01 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 c5c7d2a4091a0..9c66d4e036464 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: 2023-12-28 +date: 2024-01-01 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 e8e8e20bf9060..23d4778cef4fd 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: 2023-12-28 +date: 2024-01-01 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 13acf47e03136..f1561231834d9 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: 2023-12-28 +date: 2024-01-01 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 48936066ff4e3..1eba5cd513260 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: 2023-12-28 +date: 2024-01-01 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 ebe580f2829f5..9aa3e7a01819e 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: 2023-12-28 +date: 2024-01-01 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 85585be6ed2a1..329bfea9fac5a 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: 2023-12-28 +date: 2024-01-01 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 61f5bd8cf4d14..0f2987ebb7cef 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: 2023-12-28 +date: 2024-01-01 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 1a062d643428c..3687cf6f13a5a 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: 2023-12-28 +date: 2024-01-01 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 48e78d70d9e4b..1fdad6d156ff6 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -13401,6 +13401,10 @@ "plugin": "cloudSecurityPosture", "path": "x-pack/plugins/cloud_security_posture/server/routes/detection_engine/get_detection_engine_alerts_count_by_rule_tags.ts" }, + { + "plugin": "cloudSecurityPosture", + "path": "x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/get_states.ts" + }, { "plugin": "ecsDataQualityDashboard", "path": "x-pack/plugins/ecs_data_quality_dashboard/server/routes/get_index_mappings.ts" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 58e0ea0b4a897..2790467d69261 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: 2023-12-28 +date: 2024-01-01 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 33fe342ea2876..9a9986f0db800 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: 2023-12-28 +date: 2024-01-01 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 51fb6bc24abc0..e28cb5856925d 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: 2023-12-28 +date: 2024-01-01 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 f81525e25275d..f120048a7e696 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: 2023-12-28 +date: 2024-01-01 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 4691213348497..2812dc24c4285 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: 2023-12-28 +date: 2024-01-01 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 bfa6fc38128c3..1eb7627f23d83 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: 2023-12-28 +date: 2024-01-01 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 7c9ed26120d30..271fb4abadca8 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: 2023-12-28 +date: 2024-01-01 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 08c7f3bd96734..0a22339645ca6 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: 2023-12-28 +date: 2024-01-01 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 220d81a51fe91..843218f78739d 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: 2023-12-28 +date: 2024-01-01 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 15f10d6a16911..02b9fa9f92196 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: 2023-12-28 +date: 2024-01-01 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 a389cfd1313f2..037c877a8dbf6 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: 2023-12-28 +date: 2024-01-01 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 ef91cebf9051b..49b43760eeebe 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: 2023-12-28 +date: 2024-01-01 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 c0e678b6de090..d653062853d94 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: 2023-12-28 +date: 2024-01-01 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 8c130f2c3314f..3830d6898fd08 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: 2023-12-28 +date: 2024-01-01 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 21e51b8fe584c..ecd44a4af9ccc 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: 2023-12-28 +date: 2024-01-01 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 2388913d27da1..2e566559d55dd 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: 2023-12-28 +date: 2024-01-01 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 c4a134230116c..949a047e27222 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: 2023-12-28 +date: 2024-01-01 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 c436d464bf0db..0ba04d345d2d0 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: 2023-12-28 +date: 2024-01-01 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 f0fbe42701e71..94c6c2d86b07e 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: 2023-12-28 +date: 2024-01-01 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 abefb4c88ca34..3053766769e11 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: 2023-12-28 +date: 2024-01-01 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 0d453bff503df..3d333a33cf2c6 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: 2023-12-28 +date: 2024-01-01 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 a680738bcb144..819eb77827f98 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: 2023-12-28 +date: 2024-01-01 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 47284b6c40244..51b19e37d8187 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: 2023-12-28 +date: 2024-01-01 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 0cd0a747fd024..a5c7ccbaeeca6 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: 2023-12-28 +date: 2024-01-01 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 25b7c25e3dff7..db7bf46e7943f 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: 2023-12-28 +date: 2024-01-01 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 dbc2376366560..f531889fede95 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: 2023-12-28 +date: 2024-01-01 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 ad6c21ded0b88..272cff8b8badd 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: 2023-12-28 +date: 2024-01-01 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 b28232b8cf32b..6252c77642040 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: 2023-12-28 +date: 2024-01-01 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 d9bd85b4ca70f..2f7a72e0bea4c 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_core_notifications_browser.mdx index e2b5b58841c5c..de81ffacfcdd9 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: 2023-12-28 +date: 2024-01-01 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 ea18819d66c7b..5ab833fd70d58 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: 2023-12-28 +date: 2024-01-01 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 93dce38e07ad4..ba8fbc280a184 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: 2023-12-28 +date: 2024-01-01 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 ae8a1826a7dc6..3ce23e9f0a992 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: 2023-12-28 +date: 2024-01-01 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 b4f582e62ba89..189bbd4d4e0bf 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: 2023-12-28 +date: 2024-01-01 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 f7d5262dca721..1ebe241cf24f7 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: 2023-12-28 +date: 2024-01-01 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 e674818476963..0f2c6129a03b4 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: 2023-12-28 +date: 2024-01-01 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 86e28739946c6..ebbc5b4cea39f 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: 2023-12-28 +date: 2024-01-01 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 8ce1af614055f..e7a10e55cb7f6 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: 2023-12-28 +date: 2024-01-01 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 5a88da18890e5..5299e5ca2d6b4 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: 2023-12-28 +date: 2024-01-01 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 52067b0d1d1e3..fe3eb1b7688b8 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: 2023-12-28 +date: 2024-01-01 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 9067c9be90c85..e8362fa88f024 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: 2023-12-28 +date: 2024-01-01 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 f4cee5b55c275..a35abb6270c8f 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: 2023-12-28 +date: 2024-01-01 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 8fbc17ca2ce35..762478a59dd2e 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: 2023-12-28 +date: 2024-01-01 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 0c5d86af19875..c601f9091211f 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: 2023-12-28 +date: 2024-01-01 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 1ccbcb194a69c..8e877f9e78323 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: 2023-12-28 +date: 2024-01-01 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 ee6b86be704b6..cb33a6af19622 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: 2023-12-28 +date: 2024-01-01 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 89b0d00db408e..27fa2b4117bde 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: 2023-12-28 +date: 2024-01-01 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 8af5008dceb65..02e9c4c13483d 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: 2023-12-28 +date: 2024-01-01 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 30768c3f5c5e6..0d7a137e41b30 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: 2023-12-28 +date: 2024-01-01 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 177f637fd03d4..2b2f0b6923221 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: 2023-12-28 +date: 2024-01-01 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 91a090e40fca3..a617256e44cbd 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: 2023-12-28 +date: 2024-01-01 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 087135a9386a5..405f55f3c4b41 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: 2023-12-28 +date: 2024-01-01 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 407781e420860..64c5653f0049a 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: 2023-12-28 +date: 2024-01-01 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 8c42364411ca6..aca59f31bd792 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: 2023-12-28 +date: 2024-01-01 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 83da00c108777..4a2ab8be7a94b 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_core_saved_objects_common.mdx index 6cc980b667d7b..6c207516b46b9 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: 2023-12-28 +date: 2024-01-01 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 531042908d690..6bff12ec4ec1b 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: 2023-12-28 +date: 2024-01-01 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 7c524e0cf61b6..758b39cdcad3c 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: 2023-12-28 +date: 2024-01-01 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 2318fa6953eff..01b01d07fbbf1 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: 2023-12-28 +date: 2024-01-01 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 839623f12678b..781f3d76e77ae 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: 2023-12-28 +date: 2024-01-01 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 e0cf5d7938607..4cf6f6f54563f 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: 2023-12-28 +date: 2024-01-01 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 9200f61c3f624..7cc51e6fbd7ac 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: 2023-12-28 +date: 2024-01-01 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 8b0f7c7e4a11d..454783316e21e 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: 2023-12-28 +date: 2024-01-01 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 945cf229a637a..1f398d87f34ed 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: 2023-12-28 +date: 2024-01-01 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 39851ed246aeb..1244e9bbb8145 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: 2023-12-28 +date: 2024-01-01 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 cf989f5c0eb87..aede031cffd6f 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: 2023-12-28 +date: 2024-01-01 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 0e03ad205be3d..3581062458ca8 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: 2023-12-28 +date: 2024-01-01 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 62219924abbc9..9e609dc42abcb 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: 2023-12-28 +date: 2024-01-01 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 38b9e450a3e24..93198919c8118 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: 2023-12-28 +date: 2024-01-01 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 c99f2a23659eb..7d0eae5d8342a 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: 2023-12-28 +date: 2024-01-01 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 0e7930973897a..2b4fcaec1eaa0 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: 2023-12-28 +date: 2024-01-01 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 71c760f4e745b..76024ad5fd23f 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: 2023-12-28 +date: 2024-01-01 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 2be4ce3a0ae66..0a4c4a1496816 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: 2023-12-28 +date: 2024-01-01 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 d90215ebaa5c0..b1f21cd183406 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: 2023-12-28 +date: 2024-01-01 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 b02ea700cfdce..88ca4fe6ad03c 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: 2023-12-28 +date: 2024-01-01 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 3fb1d23bc2030..e799edd5c68bf 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: 2023-12-28 +date: 2024-01-01 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 909acddb328d8..85c2c01f71cd6 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index 6dfcafc6de7bd..c591e6e51ebb7 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: 2023-12-28 +date: 2024-01-01 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 5d1a7d5d74973..747a395d83853 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: 2023-12-28 +date: 2024-01-01 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 e8facd1eee076..820ff0affbd64 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_core_ui_settings_common.mdx index 2c26962aa1d73..08c7696f3fad8 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: 2023-12-28 +date: 2024-01-01 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 2b5497bff6b52..73e02769b4e6f 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: 2023-12-28 +date: 2024-01-01 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 1aeff89636e88..fcf816541262b 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: 2023-12-28 +date: 2024-01-01 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 22bfdc330db14..6379b6c599abc 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: 2023-12-28 +date: 2024-01-01 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 46254f015d92a..7018b7c161b77 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: 2023-12-28 +date: 2024-01-01 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 6dc3241af443a..e92d1987996b4 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: 2023-12-28 +date: 2024-01-01 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 c0c16e0ea6814..44f31919a5d14 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: 2023-12-28 +date: 2024-01-01 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 d7a8142513883..157266794301a 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: 2023-12-28 +date: 2024-01-01 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 94af05154dc75..035ec69e2a859 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: 2023-12-28 +date: 2024-01-01 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 3e43f18231763..48f97ca9cf8e3 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: 2023-12-28 +date: 2024-01-01 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 725e921b0d9f5..9946ed6f34fab 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: 2023-12-28 +date: 2024-01-01 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 840aa31e7ab45..aa05f42f6b6e2 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: 2023-12-28 +date: 2024-01-01 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 9f81c4bd0328d..2944c204d946b 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: 2023-12-28 +date: 2024-01-01 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 7cd7180c33f15..6565e053e9a31 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: 2023-12-28 +date: 2024-01-01 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 0611ce7865668..de8fcd2d63828 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index aeb6da2f69c5a..98f9811440f32 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 53b81363112c3..6ef1917fa64d9 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: 2023-12-28 +date: 2024-01-01 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 3ce188330d7a2..90d83c39f09ff 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: 2023-12-28 +date: 2024-01-01 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 633683833eb5d..f3d7b374529d4 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: 2023-12-28 +date: 2024-01-01 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 a9b54f2fa2021..a53370a44ad2c 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index 6221f06c9819f..15f05b42a5dbd 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 82d16440fa133..fdc55b13c69cd 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: 2023-12-28 +date: 2024-01-01 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 e72b71b04591d..5b7084265ac60 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: 2023-12-28 +date: 2024-01-01 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 59b0e35f4bdf3..e3e588d1043bc 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: 2023-12-28 +date: 2024-01-01 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 a221f10ecebb8..8555f9a284db9 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: 2023-12-28 +date: 2024-01-01 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 1d53a9f7d33d3..ccafea1ecad34 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: 2023-12-28 +date: 2024-01-01 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 384d1a89b8632..870e8ee3730fc 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: 2023-12-28 +date: 2024-01-01 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 14171ed30dce2..656985e52d604 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: 2023-12-28 +date: 2024-01-01 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 6187f1b9c99bd..fcbdbde8ac630 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: 2023-12-28 +date: 2024-01-01 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 2c5b3dde21644..16b0006fb2c03 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: 2023-12-28 +date: 2024-01-01 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 16ea828b75c0a..c8dffa2a9c7ac 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: 2023-12-28 +date: 2024-01-01 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 b2bed2f0c9877..3c19fae877f6b 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 3108b82acc95f..d6b0f3c7b0e4c 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: 2023-12-28 +date: 2024-01-01 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 28978c74ce23f..b22cc7425835f 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: 2023-12-28 +date: 2024-01-01 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 99e00e282bea0..c96f5e3b9fa63 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: 2023-12-28 +date: 2024-01-01 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 0d506c3a77dab..aa800cf05544b 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: 2023-12-28 +date: 2024-01-01 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 9a148c1e9e7fe..91955ee6c54ff 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: 2023-12-28 +date: 2024-01-01 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 67f8cef2b73ee..f95a17a41c9c1 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_elastic_agent_utils.mdx index 8450b79bc1380..e839209b2f1c2 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_elastic_assistant.mdx index ce1923d9e1dab..aae03296cbe0f 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_elastic_assistant_common.mdx index baf4e81503e28..741a4b48cf914 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 73980f0684309..8121559a36ad8 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index 19e121561bcff..6933203917c69 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index bc7986cac0511..f5335698d5dd1 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: 2023-12-28 +date: 2024-01-01 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 8c8e31a4c82a1..b97c2a94e1d07 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: 2023-12-28 +date: 2024-01-01 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 2b468bb819ae0..6a6743af05cf0 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: 2023-12-28 +date: 2024-01-01 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 048f1790309ef..2b672d25e0e59 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_event_annotation_common.mdx index 5db5a4af7b614..fd9ed09154dfe 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: 2023-12-28 +date: 2024-01-01 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 7632bdd69d47e..48f57edfe89e6 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: 2023-12-28 +date: 2024-01-01 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 d7e1c09024203..ad64f8baf9923 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: 2023-12-28 +date: 2024-01-01 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 b511bf42b6216..a9e21037dec1e 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: 2023-12-28 +date: 2024-01-01 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 21ed82b250246..0942b98a495b7 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: 2023-12-28 +date: 2024-01-01 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 c0c4d4518ecb4..175dfe1ebc141 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: 2023-12-28 +date: 2024-01-01 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 66121a0fd7534..b594fb3876f24 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: 2023-12-28 +date: 2024-01-01 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 525eae2fe9b70..5e1681c809e74 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: 2023-12-28 +date: 2024-01-01 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 451db4b9ce382..23a570ae5fc50 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: 2023-12-28 +date: 2024-01-01 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 da3123345d16d..a2a9255f63b61 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_generate_csv.mdx index ff6b24a1fae72..0beca06471adf 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 84fcbafb4dbe4..bbd2dbb8fb4e0 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: 2023-12-28 +date: 2024-01-01 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 8f181bdc49c7a..c4b4e495150f0 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: 2023-12-28 +date: 2024-01-01 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 1ae357c4757ac..554fac4945834 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: 2023-12-28 +date: 2024-01-01 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 7c3c699d05f52..14891fd65cc99 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_home_sample_data_card.mdx index 0c0d45edb960e..a15eb1c9c19af 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: 2023-12-28 +date: 2024-01-01 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 dc17f4470adbf..c3aaeb0c7c232 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: 2023-12-28 +date: 2024-01-01 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 aa14e3201f565..f55200cbf297a 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: 2023-12-28 +date: 2024-01-01 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 f84b3de06565d..0a898c5df8469 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: 2023-12-28 +date: 2024-01-01 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 51557a4afeb7c..789d29fc5260d 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: 2023-12-28 +date: 2024-01-01 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 e795e7427164b..1bff5a0976255 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: 2023-12-28 +date: 2024-01-01 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 7773d79192ca1..d50fc41bc8664 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: 2023-12-28 +date: 2024-01-01 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 d81584d09d24f..2b77d02c72e4a 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: 2023-12-28 +date: 2024-01-01 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 08c1b9077d2e2..624b16fd3f2f7 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: 2023-12-28 +date: 2024-01-01 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 d5dcdadffcdde..84064718b60f6 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: 2023-12-28 +date: 2024-01-01 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 0cacd188b735d..fcfa868c2d98a 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: 2023-12-28 +date: 2024-01-01 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 0851e6d71d3e0..063d5d621fc1f 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: 2023-12-28 +date: 2024-01-01 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 c9e9d499b40ac..a160ba27a8e44 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: 2023-12-28 +date: 2024-01-01 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 0152af5f074b4..3a6198b990c6c 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 566db241df25b..32fe1ee31987e 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: 2023-12-28 +date: 2024-01-01 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 7ce7b9e522c69..3f61dc8857aeb 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index 5e38f03f80936..b8519b0909ecf 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: 2023-12-28 +date: 2024-01-01 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 bc29877dd33d5..da8a8065677f9 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_management_settings_application.mdx index b90621067bf61..32546ca5207a6 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: 2023-12-28 +date: 2024-01-01 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 342013eb59fc8..499fcb7e84368 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: 2023-12-28 +date: 2024-01-01 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 012eb4ee66e89..1eef70eddca61 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index 9e1b51caa696d..1f0e87e87ac7c 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: 2023-12-28 +date: 2024-01-01 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 a58e965538e43..706429be40425 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: 2023-12-28 +date: 2024-01-01 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 f862090fefd78..837b35088c22e 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: 2023-12-28 +date: 2024-01-01 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 db32e19342028..c2c8c413b6796 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: 2023-12-28 +date: 2024-01-01 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 859279a85beeb..79a48d36b6035 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_management_settings_types.mdx index f1118f71ae802..0f475e177f170 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index a0a37d86be80a..7b6f435617d14 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: 2023-12-28 +date: 2024-01-01 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 3047b2f1a190d..28487cd2a204e 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_mapbox_gl.mdx index 37068e8e4b42a..402e829e6d3d7 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: 2023-12-28 +date: 2024-01-01 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 d4cfa59f0c90f..cd0eea70c9cdf 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: 2023-12-28 +date: 2024-01-01 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 4d99078ffb6f8..6de928ecd51b7 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: 2023-12-28 +date: 2024-01-01 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 9fb97182a7f2a..25d2ae5807110 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: 2023-12-28 +date: 2024-01-01 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 a483196edb313..89179f67cfd3a 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: 2023-12-28 +date: 2024-01-01 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 1692aaa103efe..c2101e2f4ce96 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: 2023-12-28 +date: 2024-01-01 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 dbc7cd9790ea7..4db0931c22213 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: 2023-12-28 +date: 2024-01-01 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 856a0d3fcea8a..b670629bce316 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: 2023-12-28 +date: 2024-01-01 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 07fd34fce3523..a34fa49e47339 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: 2023-12-28 +date: 2024-01-01 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 999a428a6f0f8..7122965db66bb 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: 2023-12-28 +date: 2024-01-01 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 5ac46acf89a67..6b137690849e3 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: 2023-12-28 +date: 2024-01-01 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 2cb78192bed51..f1e920eebeb2e 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: 2023-12-28 +date: 2024-01-01 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 354e7a5cc38ee..fae9d0ad7be75 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: 2023-12-28 +date: 2024-01-01 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 737abd0568828..869da83ee85f0 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: 2023-12-28 +date: 2024-01-01 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 92edecbd8ee7d..f40e314c5aed6 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: 2023-12-28 +date: 2024-01-01 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 63b7a7cbe6e71..45621de54aca7 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: 2023-12-28 +date: 2024-01-01 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 62f8d582b524a..13b5065a9da73 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: 2023-12-28 +date: 2024-01-01 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 62fdb7ec925f3..cf25a68130b0a 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: 2023-12-28 +date: 2024-01-01 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 237656c184a9b..1e9dca2fb2929 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: 2023-12-28 +date: 2024-01-01 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 1afd1b321b41a..eb1ecc45b59b9 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: 2023-12-28 +date: 2024-01-01 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 aeac112e9ced9..dbde62fbb4137 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: 2023-12-28 +date: 2024-01-01 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 aac38d5718277..aae2e673f6868 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: 2023-12-28 +date: 2024-01-01 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 c3542e9d2a8c7..875671f5d414b 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: 2023-12-28 +date: 2024-01-01 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 e8d6aa0d6b3cb..7940032accf8f 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: 2023-12-28 +date: 2024-01-01 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 6d3044d48edd0..7eadea35a6de2 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: 2023-12-28 +date: 2024-01-01 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 2b31a05d408e0..fb10efa82ae06 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index ff2cc134bd21c..47a477c473ac6 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: 2023-12-28 +date: 2024-01-01 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 6156e0ea3eb15..409bf2e4ae1db 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: 2023-12-28 +date: 2024-01-01 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 ea481d851fd8d..58b7f3c2c1c9e 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: 2023-12-28 +date: 2024-01-01 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 1ca5b3a16607c..3e09ddb704e51 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: 2023-12-28 +date: 2024-01-01 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 1333dab34bc3e..6b28ee40ee2fb 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: 2023-12-28 +date: 2024-01-01 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 80e15e01e8658..d5619a26858d8 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: 2023-12-28 +date: 2024-01-01 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 2654ce5658b20..a200c5b173da3 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: 2023-12-28 +date: 2024-01-01 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 e0a07b6a84cd1..2e6e93d6dad89 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: 2023-12-28 +date: 2024-01-01 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 1d278ec9914c2..37637f8397751 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: 2023-12-28 +date: 2024-01-01 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 0115aab690628..c57932356ca91 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: 2023-12-28 +date: 2024-01-01 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 e0f3225bc2852..eee11572cc058 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: 2023-12-28 +date: 2024-01-01 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 1ef8c320a993f..a30ebbcf79290 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: 2023-12-28 +date: 2024-01-01 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_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 9e06be730edf1..1ebb1c2db54c3 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: 2023-12-28 +date: 2024-01-01 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 e140f69dc07e4..316403aff2048 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 3203cea48f2e8..f774d63a68192 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: 2023-12-28 +date: 2024-01-01 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 21a5c4d230c3a..e2c918a5963ce 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: 2023-12-28 +date: 2024-01-01 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 582607ca803d6..9007f6f0b7994 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: 2023-12-28 +date: 2024-01-01 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 979ccca4b8aeb..678bb87e8ce48 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: 2023-12-28 +date: 2024-01-01 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 572512b8eab5e..90184d8520453 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: 2023-12-28 +date: 2024-01-01 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 c453724c9ee9f..25e6d94702b0b 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: 2023-12-28 +date: 2024-01-01 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 11f050df5da50..86eaae57f5826 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: 2023-12-28 +date: 2024-01-01 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 baac99094ee30..fe37effde7ffb 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: 2023-12-28 +date: 2024-01-01 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 f6a996e86b69d..9dfaac2ff575d 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: 2023-12-28 +date: 2024-01-01 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 8f54ad15bb30a..78fb4718ab7cb 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: 2023-12-28 +date: 2024-01-01 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 53a5439f6e32e..7f4375052f1fc 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: 2023-12-28 +date: 2024-01-01 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 a6fd2aed0fbf2..b61872381e027 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: 2023-12-28 +date: 2024-01-01 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 f8e6e1986b467..d6daaeea1fc9e 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: 2023-12-28 +date: 2024-01-01 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 3d604be01e60e..08c077993a8c8 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index 0b655635496dc..c7a9373efa835 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index 1ec0082cc7743..5b77cd044315a 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index 8c7bde9c45959..e49748ab7d480 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index fac4df845894b..4c81401857143 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_reporting_export_types_png.mdx index 69107fed8ee71..a1ed1c82d8f38 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: 2023-12-28 +date: 2024-01-01 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 c59fe56cd90bd..5bc8c3a6f9d19 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: 2023-12-28 +date: 2024-01-01 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 e4706d33e67f0..0d73857851066 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: 2023-12-28 +date: 2024-01-01 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 5483ba88aa0cd..a9353c4364431 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index 22eb96258fea9..7bb6f635cfa82 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: 2023-12-28 +date: 2024-01-01 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 75d8aa64ce38f..0212d187da5d2 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: 2023-12-28 +date: 2024-01-01 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 0e268f00d0e3c..4b36bf4ae7fec 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: 2023-12-28 +date: 2024-01-01 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 4829e250083f9..fba7aa0776fcc 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: 2023-12-28 +date: 2024-01-01 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 61296c4801b8b..e534d6721bf48 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: 2023-12-28 +date: 2024-01-01 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 458d0b941dbb9..20d5d677d797c 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: 2023-12-28 +date: 2024-01-01 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 5c10b2e0ee4c6..cadcd2c01c032 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: 2023-12-28 +date: 2024-01-01 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 d8062d317e099..3a6716c8f89bd 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: 2023-12-28 +date: 2024-01-01 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 f3377ab693b7f..ae96cdef85b9d 100644 --- a/api_docs/kbn_search_connectors.devdocs.json +++ b/api_docs/kbn_search_connectors.devdocs.json @@ -35392,6 +35392,206 @@ "trackAdoption": false } ] + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.use_document_level_security", + "type": "Object", + "tags": [], + "label": "use_document_level_security", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.use_document_level_security.default_value", + "type": "Uncategorized", + "tags": [], + "label": "default_value", + "description": [], + "signature": [ + "null" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.use_document_level_security.depends_on", + "type": "Array", + "tags": [], + "label": "depends_on", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.use_document_level_security.display", + "type": "string", + "tags": [], + "label": "display", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.DisplayType", + "text": "DisplayType" + }, + ".TOGGLE" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.use_document_level_security.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.use_document_level_security.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.use_document_level_security.order", + "type": "number", + "tags": [], + "label": "order", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.use_document_level_security.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.use_document_level_security.sensitive", + "type": "boolean", + "tags": [], + "label": "sensitive", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.use_document_level_security.tooltip", + "type": "string", + "tags": [], + "label": "tooltip", + "description": [], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.use_document_level_security.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-connectors", + "scope": "common", + "docId": "kibKbnSearchConnectorsPluginApi", + "section": "def-common.FieldType", + "text": "FieldType" + }, + ".BOOLEAN" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.use_document_level_security.ui_restrictions", + "type": "Array", + "tags": [], + "label": "ui_restrictions", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.use_document_level_security.validations", + "type": "Array", + "tags": [], + "label": "validations", + "description": [], + "signature": [ + "never[]" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-connectors", + "id": "def-common.NATIVE_CONNECTOR_DEFINITIONS.servicenow.configuration.use_document_level_security.value", + "type": "boolean", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "false" + ], + "path": "packages/kbn-search-connectors/types/native_connectors.ts", + "deprecated": false, + "trackAdoption": false + } + ] } ] }, diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index de1280abe309f..e331bfcc146d0 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 2649 | 0 | 2649 | 0 | +| 2663 | 0 | 2663 | 0 | ## Common diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index 00aa8d8bc2423..cbad19a32bd08 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: 2023-12-28 +date: 2024-01-01 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 4741e7fa2366e..cb36507e728a2 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: 2023-12-28 +date: 2024-01-01 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 bdb33661bb988..acd2b4668e57e 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: 2023-12-28 +date: 2024-01-01 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 eb5f5c77ff5c5..146143e3abc67 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: 2023-12-28 +date: 2024-01-01 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 0d0da06d8cc6d..92be158c8ed66 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: 2023-12-28 +date: 2024-01-01 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 757980044adb2..8f4a343d15e0e 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_security_solution_features.mdx index 17e46426e826f..ba17c0b7fb0d5 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: 2023-12-28 +date: 2024-01-01 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 c6e15b3637c67..2fb7e33a3d1c4 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: 2023-12-28 +date: 2024-01-01 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 c4ca1f9c912f2..9b79f0f495e9b 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: 2023-12-28 +date: 2024-01-01 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 616102e2788ee..16a0070da3d17 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: 2023-12-28 +date: 2024-01-01 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 36b8192c50015..702f7e49ab9e6 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: 2023-12-28 +date: 2024-01-01 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 78c17ceabd838..ddb3f6af677fc 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: 2023-12-28 +date: 2024-01-01 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 56abb706ec4a1..2586dc668d281 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: 2023-12-28 +date: 2024-01-01 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 1ccf5e4195632..756ccbe7ac440 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index ba284b7e4fd26..e0636c073fe34 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_securitysolution_grouping.mdx index 78f120e992fec..c827ff4a287b4 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: 2023-12-28 +date: 2024-01-01 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 b2ee47dda8a15..96ed681103f96 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: 2023-12-28 +date: 2024-01-01 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 b597ad39858c8..1571464b123b7 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index f5cb1f2509df6..8cf777d7132e0 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index edbf3a246e0c6..2ed210ab50e64 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: 2023-12-28 +date: 2024-01-01 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 3338d3ee9bd5f..46155a116a716 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: 2023-12-28 +date: 2024-01-01 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 8830ab42b13f2..5441f8cddad1c 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: 2023-12-28 +date: 2024-01-01 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 dc1fcf69235a0..bd49031642499 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: 2023-12-28 +date: 2024-01-01 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 f6e9e5cd75f33..4fa2196960bde 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: 2023-12-28 +date: 2024-01-01 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 c3f105de213c5..0f614724b67d2 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: 2023-12-28 +date: 2024-01-01 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 12d23df8b51d1..df700c51f22c7 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: 2023-12-28 +date: 2024-01-01 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 c7a221e5d49f9..4ef2968fb3b48 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: 2023-12-28 +date: 2024-01-01 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 7990ea0970e33..4cfac7f0ec84f 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: 2023-12-28 +date: 2024-01-01 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 e56456ad313cb..5dc2f1150b5ff 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: 2023-12-28 +date: 2024-01-01 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 72eb8c335a03b..6540577807077 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: 2023-12-28 +date: 2024-01-01 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 2ef99d3e4eca7..172df4268cc08 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: 2023-12-28 +date: 2024-01-01 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 59f9d90dc4820..b1250190dc368 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: 2023-12-28 +date: 2024-01-01 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 c73e80e49bb7f..26782e3ffc8e9 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: 2023-12-28 +date: 2024-01-01 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 b917072124ebb..f6c8be0080f29 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: 2023-12-28 +date: 2024-01-01 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 ad3bbf1e9afa5..5f72155243ec1 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: 2023-12-28 +date: 2024-01-01 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 ee0c0d35ea220..8fedfb31d9a83 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: 2023-12-28 +date: 2024-01-01 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 5dcb0a4d9d3a4..9b66c554abf42 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: 2023-12-28 +date: 2024-01-01 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 adfd6a54bd23c..06701a75c24c2 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: 2023-12-28 +date: 2024-01-01 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 613769d973837..fd3bd8cf1e895 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 8056549580e48..8d54cfc2c5830 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index 2676dd7e3c36d..b628c03314948 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index b7bce610912a3..3ccafda48012f 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: 2023-12-28 +date: 2024-01-01 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 ed360a9810328..051102a25a89a 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: 2023-12-28 +date: 2024-01-01 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 02088c92f7e14..5a72143571bb4 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: 2023-12-28 +date: 2024-01-01 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 f1a4a0bf56082..58a1e9b966ea3 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: 2023-12-28 +date: 2024-01-01 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 4ce6833ee9acb..81df33298ab19 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: 2023-12-28 +date: 2024-01-01 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 b487290ce3a60..32c668f1e8311 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: 2023-12-28 +date: 2024-01-01 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 0e478af073f5d..a704d0553268a 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: 2023-12-28 +date: 2024-01-01 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 cdbb5b49c32bc..b00d460aa2f93 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: 2023-12-28 +date: 2024-01-01 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 e9168fa7d7214..95dd77ccc3e75 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: 2023-12-28 +date: 2024-01-01 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 1ffbe35e3d4d2..f81c642ce5f4b 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: 2023-12-28 +date: 2024-01-01 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 ba0814a0e4f0c..a8a220f0e18eb 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: 2023-12-28 +date: 2024-01-01 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 0459990d30cc7..a7296a8e5ce91 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: 2023-12-28 +date: 2024-01-01 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 838ed95f41d10..3bb92a066b121 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: 2023-12-28 +date: 2024-01-01 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 a0a700803eb49..5a1f923895120 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: 2023-12-28 +date: 2024-01-01 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 35b4457142e9b..b59badf167bdb 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: 2023-12-28 +date: 2024-01-01 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 cde9d0412c85b..1932e19bcd02e 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: 2023-12-28 +date: 2024-01-01 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 f3c1aaecd7150..9108f448b60aa 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: 2023-12-28 +date: 2024-01-01 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 711f0b5347485..04cef2640b6c5 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: 2023-12-28 +date: 2024-01-01 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 746d04556f419..d1bc6cb4e9a6b 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: 2023-12-28 +date: 2024-01-01 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 a3b93e62675b3..260d94e94a1f0 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: 2023-12-28 +date: 2024-01-01 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 1e84672e44390..727a975aed3d7 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: 2023-12-28 +date: 2024-01-01 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 81d578cfc8289..24e261383654c 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: 2023-12-28 +date: 2024-01-01 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 1107ebd963a4b..d7590f26e83ee 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: 2023-12-28 +date: 2024-01-01 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 eb956fe7b3d5b..a8d6c9298dc41 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: 2023-12-28 +date: 2024-01-01 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 0f0017cc65abd..29f37c497fe99 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: 2023-12-28 +date: 2024-01-01 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 a4497fc501e9b..cc986eddc79e0 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: 2023-12-28 +date: 2024-01-01 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 f9091e00f32fa..27297a9215300 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: 2023-12-28 +date: 2024-01-01 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 168f9e1b92ec6..6d720b027757b 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: 2023-12-28 +date: 2024-01-01 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 bb88fff0f39bc..4ade754f6a9cd 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: 2023-12-28 +date: 2024-01-01 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 baa418ee292a5..6120b379670b9 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: 2023-12-28 +date: 2024-01-01 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 1c84a36759976..02e7746f25eab 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: 2023-12-28 +date: 2024-01-01 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 de976937e266d..67129e8756ffa 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: 2023-12-28 +date: 2024-01-01 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 03454d37eec86..6d44a89190796 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: 2023-12-28 +date: 2024-01-01 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.mdx b/api_docs/kbn_shared_ux_utility.mdx index 97867c3d28b9e..f2d447a8be247 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index 79540fec69b0b..8cdc1382044c9 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 764a02931f1df..f3092792e556f 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 7e4114b9f0dc9..b70db19811752 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: 2023-12-28 +date: 2024-01-01 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 0cf2fa5e5d935..0c385091a506d 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: 2023-12-28 +date: 2024-01-01 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 61cfbb8c5ba04..3757afa017b67 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: 2023-12-28 +date: 2024-01-01 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 c4a9bc7b9fa18..fdc698587b7a4 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index dbf3736e1f6f4..6b89e54b3359b 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index b875ceb02b534..c81fcf4042cdd 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: 2023-12-28 +date: 2024-01-01 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 df188aa02af6d..c4bfd193d09cd 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: 2023-12-28 +date: 2024-01-01 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 68df9a83587a9..93316014fab60 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: 2023-12-28 +date: 2024-01-01 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 2f4da82845bbb..7b7eda7a4e842 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: 2023-12-28 +date: 2024-01-01 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 f96adfe632a08..28e4a557e6ece 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: 2023-12-28 +date: 2024-01-01 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 298f00476bcaa..38f212ba15d32 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: 2023-12-28 +date: 2024-01-01 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 65679c4b58ffc..16e4f52ac8d72 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: 2023-12-28 +date: 2024-01-01 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 ccb3f24833187..cf33083cafe6d 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: 2023-12-28 +date: 2024-01-01 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 f44047350ce0f..51c894e4d3968 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: 2023-12-28 +date: 2024-01-01 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 752ae9f308d4f..de5657353c5e2 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: 2023-12-28 +date: 2024-01-01 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 456ba53166756..bb302bf78daec 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: 2023-12-28 +date: 2024-01-01 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 6ad911b0799b4..1e2944b919e91 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: 2023-12-28 +date: 2024-01-01 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 a0cc6a0300527..afa3979264987 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: 2023-12-28 +date: 2024-01-01 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 a9d8d7f0d2d10..7ba280c0d5562 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: 2023-12-28 +date: 2024-01-01 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 0f9b894c87e7f..5a9c6b3bbe991 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: 2023-12-28 +date: 2024-01-01 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 08d9c40469994..9b9249f8958de 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: 2023-12-28 +date: 2024-01-01 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 96037a34d125f..d2382d8c0a16a 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: 2023-12-28 +date: 2024-01-01 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 64bf690686945..d01cabe215e19 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: 2023-12-28 +date: 2024-01-01 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 d53509c0b3f7b..59973ee478f7f 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: 2023-12-28 +date: 2024-01-01 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 78970f4c88499..65273d87f7928 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: 2023-12-28 +date: 2024-01-01 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 a0c223271c064..ca79f8f0524a1 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: 2023-12-28 +date: 2024-01-01 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 1c56665b9f99c..34781f2d8f4d2 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: 2023-12-28 +date: 2024-01-01 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 bedbd9354a867..95f5f8428e4bb 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: 2023-12-28 +date: 2024-01-01 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 9080a06179d35..b9ab418fd0089 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: 2023-12-28 +date: 2024-01-01 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 aba611d65d84a..8515dab0feae6 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: 2023-12-28 +date: 2024-01-01 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 4a597a0825501..9381f293b0050 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 2892b6920d3c4..23e4bd42251fc 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: 2023-12-28 +date: 2024-01-01 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 8b8fdf300986b..eb9eae5210ef2 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: 2023-12-28 +date: 2024-01-01 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 16128f8032936..818b248dcfe4d 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index e7fccb9dc5b31..61d574c6e2c06 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index d5537c7130996..ac1eaa02adda9 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: 2023-12-28 +date: 2024-01-01 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 54ed62fc43171..4017a420ba3c6 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: 2023-12-28 +date: 2024-01-01 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 19af033a4e8b6..6f3c86b5226ae 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: 2023-12-28 +date: 2024-01-01 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 ca01f322cd7d6..5f7f79d0ad1dc 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: 2023-12-28 +date: 2024-01-01 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 867563037fea1..7f02ef1c2f781 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/log_explorer.mdx b/api_docs/log_explorer.mdx index 5854f58db646f..3f2d742c3092b 100644 --- a/api_docs/log_explorer.mdx +++ b/api_docs/log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logExplorer title: "logExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logExplorer plugin -date: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logExplorer'] --- import logExplorerObj from './log_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 4b9f0d85a871f..62b82c294fbec 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index ff1d481c717e7..c51306d5b0cd6 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: 2023-12-28 +date: 2024-01-01 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 227d4bbb0ec67..f88c896c2e932 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: 2023-12-28 +date: 2024-01-01 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 cc038d8e61378..80734c8adde98 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index 8808bf15b3187..ca1fb4498cad3 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: 2023-12-28 +date: 2024-01-01 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 0baa64215b869..a6e65abf0f2b1 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: 2023-12-28 +date: 2024-01-01 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 9872403b4d82f..a88c4975937c0 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: 2023-12-28 +date: 2024-01-01 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 def3cad297dc7..7dfef3b18b6a7 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: 2023-12-28 +date: 2024-01-01 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 c1effb2f0a949..151955aab91e0 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: 2023-12-28 +date: 2024-01-01 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 12ab894e499d6..1b2e123ff2ced 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: 2023-12-28 +date: 2024-01-01 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 b6ae395bcb140..283e6c74ba398 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: 2023-12-28 +date: 2024-01-01 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 18bbd3868b443..76f0c4370a70d 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: 2023-12-28 +date: 2024-01-01 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 6b400619f57c7..231318742b841 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index c7b6189860c30..40f637033d550 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 419599917dcba..d8827d1632430 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_log_explorer.mdx b/api_docs/observability_log_explorer.mdx index 33660ca957c6f..523a46f2ce2b2 100644 --- a/api_docs/observability_log_explorer.mdx +++ b/api_docs/observability_log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogExplorer title: "observabilityLogExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogExplorer plugin -date: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogExplorer'] --- import observabilityLogExplorerObj from './observability_log_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 82211d18f3086..720a231fcfc06 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: 2023-12-28 +date: 2024-01-01 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 3438e7759ec5f..97b06513ee346 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: 2023-12-28 +date: 2024-01-01 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 dc6e3ba3c882c..a17aac67fe6b2 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: 2023-12-28 +date: 2024-01-01 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 52d34bb880c2e..75399e23c209f 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: 2023-12-28 +date: 2024-01-01 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 215d6ed221f4a..2b1345ebddfad 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 77958 | 234 | 66677 | 1695 | +| 77972 | 234 | 66691 | 1695 | ## Plugin Directory @@ -576,7 +576,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-detections-response](https://github.com/orgs/elastic/teams/security-detections-response) | - | 120 | 0 | 117 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 75 | 0 | 75 | 0 | -| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 2649 | 0 | 2649 | 0 | +| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 2663 | 0 | 2663 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 18 | 1 | 17 | 1 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 25 | 0 | 25 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 20 | 0 | 18 | 1 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 81a3e95f641ff..5bc9888d38c88 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: 2023-12-28 +date: 2024-01-01 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 95b881a2260e0..0d3b31cbecaae 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: 2023-12-28 +date: 2024-01-01 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 8963fcba93b73..9489999ccc376 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: 2023-12-28 +date: 2024-01-01 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 34db35c12204e..1dfeb9676aaa0 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: 2023-12-28 +date: 2024-01-01 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 367f42ad0baaf..240f53d604379 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: 2023-12-28 +date: 2024-01-01 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 6b1ea9175c71d..07659171cfffc 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index f0040d2445636..a0f33fdfaa35c 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: 2023-12-28 +date: 2024-01-01 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 bae5c7e1c2cd7..349f5372c9de6 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: 2023-12-28 +date: 2024-01-01 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 ae89ab98f2538..e8913f9d3235e 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: 2023-12-28 +date: 2024-01-01 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 7309f01d3dcf2..e4b2c16754518 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index 6622a2951c4dd..70bf201b45ccb 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index 94ed884e43cbf..1230986cdbe7a 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: 2023-12-28 +date: 2024-01-01 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 c9d27515c3e58..c72a45686069a 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: 2023-12-28 +date: 2024-01-01 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 a50c4daac04ee..edd1a51288348 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: 2023-12-28 +date: 2024-01-01 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 77c90a0b7654f..906bb382ea7b7 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: 2023-12-28 +date: 2024-01-01 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 b6458f92c45e3..aaf50282fa1ab 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: 2023-12-28 +date: 2024-01-01 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 cace6898e8a37..e391f5e25865d 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 1d5a9e79c7730..cbdf000bd9bf9 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: 2023-12-28 +date: 2024-01-01 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 07a096b8b1606..7277d735a7163 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: 2023-12-28 +date: 2024-01-01 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 d7b2452dcf033..352c5ced1de15 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: 2023-12-28 +date: 2024-01-01 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 19f8e0751a7a5..0790d325fb864 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: 2023-12-28 +date: 2024-01-01 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 70687c4d26445..1ca94faf135c3 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: 2023-12-28 +date: 2024-01-01 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 981d9892edad3..0d2c7733fe6f6 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: 2023-12-28 +date: 2024-01-01 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 6ad47574de75d..0384de23c946f 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: 2023-12-28 +date: 2024-01-01 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 c9570bad3c60d..7cf7a9867e5b7 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: 2023-12-28 +date: 2024-01-01 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 9e703c274affd..9c253773f3161 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: 2023-12-28 +date: 2024-01-01 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 cd73f2ed33f97..1300d51ba0f18 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: 2023-12-28 +date: 2024-01-01 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 5e6e32c990be3..f98bb4a7d1039 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: 2023-12-28 +date: 2024-01-01 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 7f6c09a8040e3..a244c5d1680c5 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: 2023-12-28 +date: 2024-01-01 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 529fc21e46309..6abd8bd8cca58 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: 2023-12-28 +date: 2024-01-01 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 cfc0586ba0a6c..43bcbb79a95e4 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: 2023-12-28 +date: 2024-01-01 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 19aeb1f2972fa..1ca2685f6694f 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: 2023-12-28 +date: 2024-01-01 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 628f681ba61d6..add50e8aab38b 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: 2023-12-28 +date: 2024-01-01 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 b86093717bd1f..83ada11544cf2 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: 2023-12-28 +date: 2024-01-01 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 afdf3583a7df3..a711ff90c5d9f 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: 2023-12-28 +date: 2024-01-01 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 ffdeeeda95023..3946de9fef409 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index b1fd33e56e074..8d9af8ee52d09 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: 2023-12-28 +date: 2024-01-01 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 26e1a063b8750..60784adb0cb72 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: 2023-12-28 +date: 2024-01-01 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 1f4b8fc2c8729..d8b4f3911c4c4 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: 2023-12-28 +date: 2024-01-01 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 4eb7a82fc0055..07fe409fc4150 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: 2023-12-28 +date: 2024-01-01 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 6f2cee4eccf01..2ec68c19f2a64 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: 2023-12-28 +date: 2024-01-01 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 ca448a5b6ea02..90b1656f5213a 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 7a007288c1257..2ac0e1c31f6c5 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: 2023-12-28 +date: 2024-01-01 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 ec8fbb60f0cec..e19c07bb183d5 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: 2023-12-28 +date: 2024-01-01 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 7e4ed776c6a6b..7d9d4a8f3f464 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: 2023-12-28 +date: 2024-01-01 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 75f36a25139ce..82233f9515117 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: 2023-12-28 +date: 2024-01-01 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 40176ab873ec3..414aff7aadd3f 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: 2023-12-28 +date: 2024-01-01 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 3cb73c31470f4..b622fc4225d5c 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: 2023-12-28 +date: 2024-01-01 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 13d7895352175..cdd31753c3f0b 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: 2023-12-28 +date: 2024-01-01 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 a9a1eb0a174a2..1a416fc3109ee 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: 2023-12-28 +date: 2024-01-01 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 9578591809d3e..1551915dd9324 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: 2023-12-28 +date: 2024-01-01 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 3c6cace3a08c6..e726345dbaf5a 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: 2023-12-28 +date: 2024-01-01 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 fb511db62c115..fd6cb5a1c44d4 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: 2023-12-28 +date: 2024-01-01 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 f508cbe1cf879..eeddd3b362c49 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: 2023-12-28 +date: 2024-01-01 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 797ee06ba352c..1e11f5decb098 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: 2023-12-28 +date: 2024-01-01 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 31b49711ca866..6dc37b7c2927f 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: 2023-12-28 +date: 2024-01-01 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 28e904a278ad5..aa2e08bae34b2 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: 2023-12-28 +date: 2024-01-01 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 9a541972a83fb..d9a8ea6e0f1ee 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: 2023-12-28 +date: 2024-01-01 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 6b03c5e9336f4..e6d691ea9dd6e 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index b01d1aa330703..b0e3c22aef17c 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: 2023-12-28 +date: 2024-01-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/fleet_packages.json b/fleet_packages.json index 9d3a9d77b68c6..5e2f76b1293e0 100644 --- a/fleet_packages.json +++ b/fleet_packages.json @@ -30,7 +30,7 @@ }, { "name": "elastic_agent", - "version": "1.15.0" + "version": "1.16.0" }, { "name": "endpoint", diff --git a/package.json b/package.json index 8cbf3288874ed..68122ca59fc5b 100644 --- a/package.json +++ b/package.json @@ -74,12 +74,12 @@ "url": "https://github.com/elastic/kibana.git" }, "engines": { - "node": "18.18.2", + "node": "20.10.0", "yarn": "^1.22.19" }, "resolutions": { "**/@hello-pangea/dnd": "16.2.0", - "**/@types/node": "18.18.5", + "**/@types/node": "20.10.5", "**/@typescript-eslint/utils": "5.62.0", "**/chokidar": "^3.5.3", "**/globule/minimatch": "^3.1.2", @@ -508,6 +508,7 @@ "@kbn/kubernetes-security-plugin": "link:x-pack/plugins/kubernetes_security", "@kbn/language-documentation-popover": "link:packages/kbn-language-documentation-popover", "@kbn/lens-embeddable-utils": "link:packages/kbn-lens-embeddable-utils", + "@kbn/lens-formula-docs": "link:packages/kbn-lens-formula-docs", "@kbn/lens-plugin": "link:x-pack/plugins/lens", "@kbn/license-api-guard-plugin": "link:x-pack/plugins/license_api_guard", "@kbn/license-management-plugin": "link:x-pack/plugins/license_management", @@ -864,7 +865,7 @@ "@opentelemetry/sdk-metrics-base": "^0.31.0", "@opentelemetry/semantic-conventions": "^1.4.0", "@reduxjs/toolkit": "1.7.2", - "@slack/webhook": "^5.0.4", + "@slack/webhook": "^7.0.1", "@smithy/eventstream-codec": "^2.0.12", "@smithy/util-utf8": "^2.0.0", "@tanstack/react-query": "^4.29.12", @@ -1009,7 +1010,7 @@ "normalize-path": "^3.0.0", "object-hash": "^1.3.1", "object-path-immutable": "^3.1.1", - "openai": "^3.3.0", + "openai": "^4.24.1", "openpgp": "5.10.1", "opn": "^5.5.0", "ora": "^4.0.4", @@ -1412,7 +1413,7 @@ "@types/multistream": "^4.1.0", "@types/mustache": "^0.8.31", "@types/nock": "^10.0.3", - "@types/node": "18.18.5", + "@types/node": "20.10.5", "@types/node-fetch": "2.6.4", "@types/node-forge": "^1.3.10", "@types/nodemailer": "^6.4.0", @@ -1486,7 +1487,7 @@ "abab": "^2.0.4", "aggregate-error": "^3.1.0", "antlr4ts-cli": "^0.5.0-alpha.3", - "apidoc-markdown": "^7.2.4", + "apidoc-markdown": "^7.3.0", "argsplit": "^1.0.5", "autoprefixer": "^10.4.7", "axe-core": "^4.8.2", diff --git a/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_parser.test.ts b/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_parser.test.ts index f940e49805cd5..202cef2ca09d4 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_parser.test.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_parser.test.ts @@ -59,7 +59,7 @@ test('return error when manifest content is not a valid JSON', async () => { }); await expect(parseManifest(pluginPath, packageInfo)).rejects.toMatchObject({ - message: `Unexpected token o in JSON at position 1 (invalid-manifest, ${pluginManifestPath})`, + message: `Unexpected token 'o', "not-json" is not valid JSON (invalid-manifest, ${pluginManifestPath})`, type: PluginDiscoveryErrorType.InvalidManifest, path: pluginManifestPath, }); diff --git a/packages/core/plugins/core-plugins-server-internal/src/discovery/plugins_discovery.test.ts b/packages/core/plugins/core-plugins-server-internal/src/discovery/plugins_discovery.test.ts index 9ab50d8786cca..93657a1f2533e 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/discovery/plugins_discovery.test.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/discovery/plugins_discovery.test.ts @@ -278,7 +278,7 @@ describe('plugins discovery system', () => { .toPromise(); expect(errors).toContain( - `Error: Unexpected token o in JSON at position 1 (invalid-manifest, ${manifestPath( + `Error: Unexpected token 'o', "not-json" is not valid JSON (invalid-manifest, ${manifestPath( 'plugin_a' )})` ); diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index a259d76c6affb..8016b5aaee223 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -877,7 +877,9 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D integrations: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-your-data`, integrationsLogstash: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-data-through-logstash`, integrationsBeats: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-data-through-beats`, - integrationsConnectorClient: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-your-data`, + integrationsConnectorClient: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-data-through-integrations-connector-client`, + integrationsConnectorClientRunFromSource: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-data-through-integrations-connector-client#run-from-source`, + integrationsConnectorClientRunWithDocker: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-data-through-integrations-connector-client#run-with-docker`, gettingStartedExplore: `${SERVERLESS_ELASTICSEARCH_DOCS}get-started`, gettingStartedIngest: `${SERVERLESS_ELASTICSEARCH_DOCS}get-started`, gettingStartedSearch: `${SERVERLESS_ELASTICSEARCH_DOCS}get-started`, diff --git a/packages/kbn-doc-links/src/types.ts b/packages/kbn-doc-links/src/types.ts index 910c0c218dcc5..e48f7327984b9 100644 --- a/packages/kbn-doc-links/src/types.ts +++ b/packages/kbn-doc-links/src/types.ts @@ -623,6 +623,8 @@ export interface DocLinks { readonly integrations: string; readonly integrationsBeats: string; readonly integrationsConnectorClient: string; + readonly integrationsConnectorClientRunFromSource: string; + readonly integrationsConnectorClientRunWithDocker: string; readonly integrationsLogstash: string; }; readonly serverlessSecurity: { diff --git a/packages/kbn-es-archiver/src/lib/archives/parse.test.ts b/packages/kbn-es-archiver/src/lib/archives/parse.test.ts index b87e6f71400e0..9e0d5c02238b8 100644 --- a/packages/kbn-es-archiver/src/lib/archives/parse.test.ts +++ b/packages/kbn-es-archiver/src/lib/archives/parse.test.ts @@ -98,7 +98,7 @@ describe('esArchiver createParseArchiveStreams', () => { ] as [Readable, ...Writable[]]); throw new Error('should have failed'); } catch (err) { - expect(err.message).toEqual(expect.stringContaining('Unexpected number')); + expect(err.message).toEqual(`Expected property name or '}' in JSON at position 1`); } }); }); diff --git a/packages/kbn-es/src/integration_tests/__fixtures__/es_bin.js b/packages/kbn-es/src/integration_tests/__fixtures__/es_bin.js index 5ef6145698811..0d44b8a775b25 100644 --- a/packages/kbn-es/src/integration_tests/__fixtures__/es_bin.js +++ b/packages/kbn-es/src/integration_tests/__fixtures__/es_bin.js @@ -87,11 +87,11 @@ const { ES_KEY_PATH, ES_CERT_PATH } = require('@kbn/dev-utils'); } ); - // setup server auto close after 1 second of silence + // setup server auto close after 5 second of silence let serverCloseTimer; const delayServerClose = () => { clearTimeout(serverCloseTimer); - serverCloseTimer = setTimeout(() => server.close(), 1000); + serverCloseTimer = setTimeout(() => server.close(), 5000); }; server.on('request', delayServerClose); server.on('listening', delayServerClose); diff --git a/packages/kbn-es/src/utils/docker.test.ts b/packages/kbn-es/src/utils/docker.test.ts index d877e5bdf8261..122914c3fa667 100644 --- a/packages/kbn-es/src/utils/docker.test.ts +++ b/packages/kbn-es/src/utils/docker.test.ts @@ -7,8 +7,7 @@ */ import mockFs from 'mock-fs'; -import { existsSync } from 'fs'; -import { stat } from 'fs/promises'; +import Fsp from 'fs/promises'; import { basename } from 'path'; import { @@ -115,7 +114,7 @@ const volumeCmdTest = async (volumeCmd: string[]) => { // extract only permission from mode // eslint-disable-next-line no-bitwise - expect((await stat(serverlessObjectStorePath)).mode & 0o777).toBe(0o777); + expect((await Fsp.stat(serverlessObjectStorePath)).mode & 0o777).toBe(0o777); }; describe('resolveDockerImage()', () => { @@ -508,7 +507,7 @@ describe('setupServerlessVolumes()', () => { const volumeCmd = await setupServerlessVolumes(log, { basePath: baseEsPath }); volumeCmdTest(volumeCmd); - expect(existsSync(serverlessObjectStorePath)).toBe(true); + await expect(Fsp.access(serverlessObjectStorePath)).resolves.not.toThrow(); }); test('should use an existing object store', async () => { @@ -517,7 +516,9 @@ describe('setupServerlessVolumes()', () => { const volumeCmd = await setupServerlessVolumes(log, { basePath: baseEsPath }); volumeCmdTest(volumeCmd); - expect(existsSync(`${serverlessObjectStorePath}/cluster_state/lease`)).toBe(true); + await expect( + Fsp.access(`${serverlessObjectStorePath}/cluster_state/lease`) + ).resolves.not.toThrow(); }); test('should remove an existing object store when clean is passed', async () => { @@ -526,7 +527,9 @@ describe('setupServerlessVolumes()', () => { const volumeCmd = await setupServerlessVolumes(log, { basePath: baseEsPath, clean: true }); volumeCmdTest(volumeCmd); - expect(existsSync(`${serverlessObjectStorePath}/cluster_state/lease`)).toBe(false); + await expect( + Fsp.access(`${serverlessObjectStorePath}/cluster_state/lease`) + ).rejects.toThrowError(); }); test('should add SSL and IDP metadata volumes when ssl and kibanaUrl are passed', async () => { diff --git a/packages/kbn-es/src/utils/docker.ts b/packages/kbn-es/src/utils/docker.ts index 31c00beb7a71f..8273d0267b319 100644 --- a/packages/kbn-es/src/utils/docker.ts +++ b/packages/kbn-es/src/utils/docker.ts @@ -542,12 +542,19 @@ export async function setupServerlessVolumes(log: ToolingLog, options: Serverles log.info(chalk.bold(`Checking for local serverless ES object store at ${objectStorePath}`)); log.indent(4); - if (clean && fs.existsSync(objectStorePath)) { + let exists = null; + try { + await Fsp.access(objectStorePath); + exists = true; + } catch (e) { + exists = false; + } + if (clean && exists) { log.info('Cleaning existing object store.'); await Fsp.rm(objectStorePath, { recursive: true, force: true }); } - if (clean || !fs.existsSync(objectStorePath)) { + if (clean || !exists) { await Fsp.mkdir(objectStorePath, { recursive: true }).then(() => log.info('Created new object store.') ); diff --git a/packages/kbn-ftr-common-functional-services/services/retry/retry_for_success.ts b/packages/kbn-ftr-common-functional-services/services/retry/retry_for_success.ts index 8b131db4c05e5..088f6fedc85f7 100644 --- a/packages/kbn-ftr-common-functional-services/services/retry/retry_for_success.ts +++ b/packages/kbn-ftr-common-functional-services/services/retry/retry_for_success.ts @@ -52,12 +52,16 @@ export async function retryForSuccess(log: ToolingLog, options: Options) { const start = Date.now(); const retryDelay = 502; + const criticalWebDriverErrors = ['NoSuchSessionError', 'NoSuchWindowError']; let lastError; while (true) { if (Date.now() - start > timeout) { await onFailure(lastError); throw new Error('expected onFailure() option to throw an error'); + } else if (lastError && criticalWebDriverErrors.includes(lastError.name)) { + // Aborting retry since WebDriver session is invalid or browser window is closed + throw new Error('WebDriver session is invalid, retry was aborted'); } else if (lastError && onFailureBlock) { const before = await runAttempt(onFailureBlock); if ('error' in before) { diff --git a/packages/kbn-i18n/GUIDELINE.md b/packages/kbn-i18n/GUIDELINE.md index 98f6f176d0be8..983515a16c737 100644 --- a/packages/kbn-i18n/GUIDELINE.md +++ b/packages/kbn-i18n/GUIDELINE.md @@ -128,7 +128,7 @@ Here's a rule of id naming: 'kbn.management.createIndexPattern.includeSystemIndicesToggleSwitch' 'kbn.management.editIndexPattern.wrongTypeErrorMessage' 'kbn.management.editIndexPattern.scripted.table.nameDescription' - 'xpack.lens.formulaDocumentation.filterRatioDescription.markdown' + 'lensFormulaDocs.documentation.filterRatioDescription.markdown' ``` - For complex messages, which are divided into several parts, use the following approach: @@ -183,7 +183,7 @@ Each message id should end with a type of the message. | tooltip | `kbn.management.editIndexPattern.removeTooltip` | | error message | `kbn.management.createIndexPattern.step.invalidCharactersErrorMessage` | | toggleSwitch | `kbn.management.createIndexPattern.includeSystemIndicesToggleSwitch` | -| markdown | `xpack.lens.formulaDocumentation.filterRatioDescription.markdown` | +| markdown | `lensFormulaDocs.documentation.filterRatioDescription.markdown` | For example: @@ -278,7 +278,7 @@ For example: = [ + average, + count, + cardinality, + counterRate, + cumulativeSum, + differences, + interval, + lastValue, + max, + median, + min, + movingAverage, + normalizeByUnit, + now, + overallAverge, + overallMax, + overallMin, + overallSum, + percentileRank, + percentile, + stdDeviation, + sum, + timeRange, +].reduce((memo: Record, op: OperationDocumentationType) => { + memo[op.id] = op; + return memo; +}, {}); + +export { tinymathFunctions, getTypeI18n } from './src/math'; +export { sections } from './src/sections'; diff --git a/packages/kbn-lens-formula-docs/jest.config.js b/packages/kbn-lens-formula-docs/jest.config.js new file mode 100644 index 0000000000000..65a09b087a8e7 --- /dev/null +++ b/packages/kbn-lens-formula-docs/jest.config.js @@ -0,0 +1,13 @@ +/* + * 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: ['/packages/kbn-lens-formula-docs'], +}; diff --git a/packages/kbn-lens-formula-docs/kibana.jsonc b/packages/kbn-lens-formula-docs/kibana.jsonc new file mode 100644 index 0000000000000..11135fcff7d7e --- /dev/null +++ b/packages/kbn-lens-formula-docs/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/lens-formula-docs", + "owner": ["@elastic/kibana-visualizations"] +} diff --git a/packages/kbn-lens-formula-docs/package.json b/packages/kbn-lens-formula-docs/package.json new file mode 100644 index 0000000000000..c9494c6248a90 --- /dev/null +++ b/packages/kbn-lens-formula-docs/package.json @@ -0,0 +1,7 @@ +{ + "name": "@kbn/lens-formula-docs", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0", + "sideEffects": false + } \ No newline at end of file diff --git a/packages/kbn-lens-formula-docs/src/math/index.ts b/packages/kbn-lens-formula-docs/src/math/index.ts new file mode 100644 index 0000000000000..5ce1c12e0a5ba --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/math/index.ts @@ -0,0 +1,640 @@ +/* + * 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 function getTypeI18n(type: string) { + if (type === 'number') { + return i18n.translate('lensFormulaDocs.number', { defaultMessage: 'number' }); + } + if (type === 'string') { + return i18n.translate('lensFormulaDocs.string', { defaultMessage: 'string' }); + } + if (type === 'boolean') { + return i18n.translate('lensFormulaDocs.boolean', { defaultMessage: 'boolean' }); + } + return ''; +} + +export const tinymathFunctions: Record< + string, + { + section: 'math' | 'comparison'; + positionalArguments: Array<{ + name: string; + optional?: boolean; + defaultValue?: string | number; + type?: string; + alternativeWhenMissing?: string; + }>; + // Help is in Markdown format + help: string; + // When omitted defaults to "number". + // Used for comparison functions return type + outputType?: string; + } +> = { + add: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.addFunction.markdown', { + defaultMessage: ` +Adds up two numbers. +Also works with \`+\` symbol. + +Example: Calculate the sum of two fields + +\`sum(price) + sum(tax)\` + +Example: Offset count by a static value + +\`add(count(), 5)\` + `, + }), + }, + subtract: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.subtractFunction.markdown', { + defaultMessage: ` +Subtracts the first number from the second number. +Also works with \`-\` symbol. + +Example: Calculate the range of a field +\`subtract(max(bytes), min(bytes))\` + `, + }), + }, + multiply: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.multiplyFunction.markdown', { + defaultMessage: ` +Multiplies two numbers. +Also works with \`*\` symbol. + +Example: Calculate price after current tax rate +\`sum(bytes) * last_value(tax_rate)\` + +Example: Calculate price after constant tax rate +\`multiply(sum(price), 1.2)\` + `, + }), + }, + divide: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.divideFunction.markdown', { + defaultMessage: ` +Divides the first number by the second number. +Also works with \`/\` symbol + +Example: Calculate profit margin +\`sum(profit) / sum(revenue)\` + +Example: \`divide(sum(bytes), 2)\` + `, + }), + }, + abs: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.absFunction.markdown', { + defaultMessage: ` +Calculates absolute value. A negative value is multiplied by -1, a positive value stays the same. + +Example: Calculate average distance to sea level \`abs(average(altitude))\` + `, + }), + }, + cbrt: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.cbrtFunction.markdown', { + defaultMessage: ` +Cube root of value. + +Example: Calculate side length from volume +\`cbrt(last_value(volume))\` + `, + }), + }, + ceil: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.ceilFunction.markdown', { + defaultMessage: ` +Ceiling of value, rounds up. + +Example: Round up price to the next dollar +\`ceil(sum(price))\` + `, + }), + }, + clamp: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.min', { defaultMessage: 'min' }), + type: getTypeI18n('number'), + alternativeWhenMissing: 'pick_max', + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.max', { defaultMessage: 'max' }), + type: getTypeI18n('number'), + alternativeWhenMissing: 'pick_min', + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.clampFunction.markdown', { + defaultMessage: ` +Limits the value from a minimum to maximum. + +Example: Make sure to catch outliers +\`\`\` +clamp( + average(bytes), + percentile(bytes, percentile=5), + percentile(bytes, percentile=95) +) +\`\`\` +`, + }), + }, + cube: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.cubeFunction.markdown', { + defaultMessage: ` +Calculates the cube of a number. + +Example: Calculate volume from side length +\`cube(last_value(length))\` + `, + }), + }, + exp: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.expFunction.markdown', { + defaultMessage: ` +Raises *e* to the nth power. + +Example: Calculate the natural exponential function + +\`exp(last_value(duration))\` + `, + }), + }, + fix: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.fixFunction.markdown', { + defaultMessage: ` +For positive values, takes the floor. For negative values, takes the ceiling. + +Example: Rounding towards zero +\`fix(sum(profit))\` + `, + }), + }, + floor: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.floorFunction.markdown', { + defaultMessage: ` +Round down to nearest integer value + +Example: Round down a price +\`floor(sum(price))\` + `, + }), + }, + log: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.base', { defaultMessage: 'base' }), + optional: true, + defaultValue: 'e', + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.logFunction.markdown', { + defaultMessage: ` +Logarithm with optional base. The natural base *e* is used as default. + +Example: Calculate number of bits required to store values +\`\`\` +log(sum(bytes)) +log(sum(bytes), 2) +\`\`\` + `, + }), + }, + mod: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.base', { defaultMessage: 'base' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.modFunction.markdown', { + defaultMessage: ` +Remainder after dividing the function by a number + +Example: Calculate last three digits of a value +\`mod(sum(price), 1000)\` + `, + }), + }, + pow: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.base', { defaultMessage: 'base' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.powFunction.markdown', { + defaultMessage: ` +Raises the value to a certain power. The second argument is required + +Example: Calculate volume based on side length +\`pow(last_value(length), 3)\` + `, + }), + }, + round: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.decimals', { defaultMessage: 'decimals' }), + optional: true, + defaultValue: 0, + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.roundFunction.markdown', { + defaultMessage: ` +Rounds to a specific number of decimal places, default of 0 + +Examples: Round to the cent +\`\`\` +round(sum(bytes)) +round(sum(bytes), 2) +\`\`\` + `, + }), + }, + sqrt: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.sqrtFunction.markdown', { + defaultMessage: ` +Square root of a positive value only + +Example: Calculate side length based on area +\`sqrt(last_value(area))\` + `, + }), + }, + square: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.squareFunction.markdown', { + defaultMessage: ` +Raise the value to the 2nd power + +Example: Calculate area based on side length +\`square(last_value(length))\` + `, + }), + }, + pick_max: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.maxFunction.markdown', { + defaultMessage: ` +Finds the maximum value between two numbers. + +Example: Find the maximum between two fields averages +\`pick_max(average(bytes), average(memory))\` + `, + }), + }, + pick_min: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.minFunction.markdown', { + defaultMessage: ` +Finds the minimum value between two numbers. + +Example: Find the minimum between two fields averages +\`pick_min(average(bytes), average(memory))\` + `, + }), + }, + defaults: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.defaultValue', { + defaultMessage: 'default', + }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.defaultFunction.markdown', { + defaultMessage: ` +Returns a default numeric value when value is null. + +Example: Return -1 when a field has no data +\`defaults(average(bytes), -1)\` +`, + }), + }, + lt: { + section: 'comparison', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + outputType: getTypeI18n('boolean'), + help: i18n.translate('lensFormulaDocs.tinymath.ltFunction.markdown', { + defaultMessage: ` +Performs a lower than comparison between two values. +To be used as condition for \`ifelse\` comparison function. +Also works with \`<\` symbol. + +Example: Returns true if the average of bytes is lower than the average amount of memory +\`average(bytes) <= average(memory)\` + +Example: \`lt(average(bytes), 1000)\` + `, + }), + }, + gt: { + section: 'comparison', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + outputType: getTypeI18n('boolean'), + help: i18n.translate('lensFormulaDocs.tinymath.gtFunction.markdown', { + defaultMessage: ` +Performs a greater than comparison between two values. +To be used as condition for \`ifelse\` comparison function. +Also works with \`>\` symbol. + +Example: Returns true if the average of bytes is greater than the average amount of memory +\`average(bytes) > average(memory)\` + +Example: \`gt(average(bytes), 1000)\` + `, + }), + }, + eq: { + section: 'comparison', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + outputType: getTypeI18n('boolean'), + help: i18n.translate('lensFormulaDocs.tinymath.eqFunction.markdown', { + defaultMessage: ` +Performs an equality comparison between two values. +To be used as condition for \`ifelse\` comparison function. +Also works with \`==\` symbol. + +Example: Returns true if the average of bytes is exactly the same amount of average memory +\`average(bytes) == average(memory)\` + +Example: \`eq(sum(bytes), 1000000)\` + `, + }), + }, + lte: { + section: 'comparison', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + outputType: getTypeI18n('boolean'), + help: i18n.translate('lensFormulaDocs.tinymath.lteFunction.markdown', { + defaultMessage: ` +Performs a lower than or equal comparison between two values. +To be used as condition for \`ifelse\` comparison function. +Also works with \`<=\` symbol. + +Example: Returns true if the average of bytes is lower than or equal to the average amount of memory +\`average(bytes) <= average(memory)\` + +Example: \`lte(average(bytes), 1000)\` + `, + }), + }, + gte: { + section: 'comparison', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + outputType: getTypeI18n('boolean'), + help: i18n.translate('lensFormulaDocs.tinymath.gteFunction.markdown', { + defaultMessage: ` +Performs a greater than comparison between two values. +To be used as condition for \`ifelse\` comparison function. +Also works with \`>=\` symbol. + +Example: Returns true if the average of bytes is greater than or equal to the average amount of memory +\`average(bytes) >= average(memory)\` + +Example: \`gte(average(bytes), 1000)\` + `, + }), + }, + ifelse: { + section: 'comparison', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.condition', { defaultMessage: 'condition' }), + type: getTypeI18n('boolean'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.ifElseFunction.markdown', { + defaultMessage: ` +Returns a value depending on whether the element of condition is true or false. + +Example: Average revenue per customer but in some cases customer id is not provided which counts as additional customer +\`sum(total)/(unique_count(customer_id) + ifelse( count() > count(kql='customer_id:*'), 1, 0))\` + `, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/average.ts b/packages/kbn-lens-formula-docs/src/operations/average.ts new file mode 100644 index 0000000000000..84e755be52782 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/average.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 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'; +import { buildMetricDocumentationDefinition } from './helpers'; + +export const AVG_ID = 'average'; +export const AVG_NAME = i18n.translate('lensFormulaDocs.avg', { + defaultMessage: 'Average', +}); + +export const average = buildMetricDocumentationDefinition({ + id: AVG_ID, + name: AVG_NAME, +}); diff --git a/packages/kbn-lens-formula-docs/src/operations/cardinality.ts b/packages/kbn-lens-formula-docs/src/operations/cardinality.ts new file mode 100644 index 0000000000000..6bb1ddb9e2889 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/cardinality.ts @@ -0,0 +1,37 @@ +/* + * 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'; +import { OperationDocumentationType } from './types'; + +export const CARDINALITY_ID = 'unique_count'; +export const CARDINALITY_NAME = i18n.translate('lensFormulaDocs.cardinality', { + defaultMessage: 'Unique Count', +}); + +export const cardinality: OperationDocumentationType = { + id: CARDINALITY_ID, + name: CARDINALITY_NAME, + documentation: { + section: 'elasticsearch', + signature: i18n.translate('lensFormulaDocs.cardinality.signature', { + defaultMessage: 'field: string', + }), + description: i18n.translate('lensFormulaDocs.cardinality.documentation.markdown', { + defaultMessage: ` +Calculates the number of unique values of a specified field. Works for number, string, date and boolean values. + +Example: Calculate the number of different products: +\`unique_count(product.name)\` + +Example: Calculate the number of different products from the "clothes" group: +\`unique_count(product.name, kql='product.group=clothes')\` + `, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/count.ts b/packages/kbn-lens-formula-docs/src/operations/count.ts new file mode 100644 index 0000000000000..db5fdf37df5e1 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/count.ts @@ -0,0 +1,39 @@ +/* + * 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'; +import { OperationDocumentationType } from './types'; + +export const COUNT_ID = 'count'; +export const COUNT_NAME = i18n.translate('lensFormulaDocs.count', { + defaultMessage: 'Count', +}); + +export const count: OperationDocumentationType = { + id: COUNT_ID, + name: COUNT_NAME, + documentation: { + section: 'elasticsearch', + signature: i18n.translate('lensFormulaDocs.count.signature', { + defaultMessage: '[field: string]', + }), + description: i18n.translate('lensFormulaDocs.count.documentation.markdown', { + defaultMessage: ` +The total number of documents. When you provide a field, the total number of field values is counted. When you use the Count function for fields that have multiple values in a single document, all values are counted. + +#### Examples + +To calculate the total number of documents, use \`count()\`. + +To calculate the number of products in all orders, use \`count(products.id)\`. + +To calculate the number of documents that match a specific filter, use \`count(kql='price > 500')\`. +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/counter_rate.ts b/packages/kbn-lens-formula-docs/src/operations/counter_rate.ts new file mode 100644 index 0000000000000..7321fb30e354b --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/counter_rate.ts @@ -0,0 +1,38 @@ +/* + * 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'; +import { OperationDocumentationType } from './types'; + +export const COUNTER_RATE_ID = 'counter_rate'; +export const COUNTER_RATE_NAME = i18n.translate('lensFormulaDocs.counterRate', { + defaultMessage: 'Counter rate', +}); + +export const counterRate: OperationDocumentationType = { + id: COUNTER_RATE_ID, + name: COUNTER_RATE_NAME, + documentation: { + section: 'calculation', + signature: i18n.translate('lensFormulaDocs.counterRate.signature', { + defaultMessage: 'metric: number', + }), + description: i18n.translate('lensFormulaDocs.counterRate.documentation.markdown', { + defaultMessage: ` +Calculates the rate of an ever increasing counter. This function will only yield helpful results on counter metric fields which contain a measurement of some kind monotonically growing over time. +If the value does get smaller, it will interpret this as a counter reset. To get most precise results, \`counter_rate\` should be calculated on the \`max\` of a field. + +This calculation will be done separately for separate series defined by filters or top values dimensions. +It uses the current interval when used in Formula. + +Example: Visualize the rate of bytes received over time by a memcached server: +\`counter_rate(max(memcached.stats.read.bytes))\` + `, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/cumulative_sum.ts b/packages/kbn-lens-formula-docs/src/operations/cumulative_sum.ts new file mode 100644 index 0000000000000..d25b76f3cb5b8 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/cumulative_sum.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 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'; +import { OperationDocumentationType } from './types'; + +export const CUMULATIVE_SUM_ID = 'cumulative_sum'; +export const CUMULATIVE_SUM_NAME = i18n.translate('lensFormulaDocs.cumulativeSum', { + defaultMessage: 'Cumulative sum', +}); + +export const cumulativeSum: OperationDocumentationType = { + id: CUMULATIVE_SUM_ID, + name: CUMULATIVE_SUM_NAME, + documentation: { + section: 'calculation', + signature: i18n.translate('lensFormulaDocs.cumulative_sum.signature', { + defaultMessage: 'metric: number', + }), + description: i18n.translate('lensFormulaDocs.cumulativeSum.documentation.markdown', { + defaultMessage: ` +Calculates the cumulative sum of a metric over time, adding all previous values of a series to each value. To use this function, you need to configure a date histogram dimension as well. + +This calculation will be done separately for separate series defined by filters or top values dimensions. + +Example: Visualize the received bytes accumulated over time: +\`cumulative_sum(sum(bytes))\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/differences.ts b/packages/kbn-lens-formula-docs/src/operations/differences.ts new file mode 100644 index 0000000000000..ccbf4e091083a --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/differences.ts @@ -0,0 +1,37 @@ +/* + * 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'; +import { OperationDocumentationType } from './types'; + +export const DIFFERENCES_ID = 'differences'; +export const DIFFERENCES_NAME = i18n.translate('lensFormulaDocs.derivative', { + defaultMessage: 'Differences', +}); + +export const differences: OperationDocumentationType = { + id: DIFFERENCES_ID, + name: DIFFERENCES_NAME, + documentation: { + section: 'calculation', + signature: i18n.translate('lensFormulaDocs.differences.signature', { + defaultMessage: 'metric: number', + }), + description: i18n.translate('lensFormulaDocs.differences.documentation.markdown', { + defaultMessage: ` +Calculates the difference to the last value of a metric over time. To use this function, you need to configure a date histogram dimension as well. +Differences requires the data to be sequential. If your data is empty when using differences, try increasing the date histogram interval. + +This calculation will be done separately for separate series defined by filters or top values dimensions. + +Example: Visualize the change in bytes received over time: +\`differences(sum(bytes))\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/helpers.ts b/packages/kbn-lens-formula-docs/src/operations/helpers.ts new file mode 100644 index 0000000000000..0749dcab277b4 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/helpers.ts @@ -0,0 +1,87 @@ +/* + * 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'; +import { OperationDocumentationType } from './types'; + +function buildDocumentationDefinition({ + id, + name, + documentation, + signature, + section, +}: { + id: string; + name: string; + documentation: string; + signature: string; + section: 'elasticsearch' | 'calculation' | 'constants'; +}): OperationDocumentationType { + return { + id, + name, + documentation: { + section, + signature, + description: documentation, + }, + }; +} + +export function buildMetricDocumentationDefinition({ + id, + name, + documentation, +}: { + id: string; + name: string; + documentation?: string; +}): OperationDocumentationType { + return buildDocumentationDefinition({ + id, + name, + documentation: + documentation || + i18n.translate('lensFormulaDocs.metric.documentation.markdown', { + defaultMessage: ` +Returns the {metric} of a field. This function only works for number fields. + +Example: Get the {metric} of price: +\`{metric}(price)\` + +Example: Get the {metric} of price for orders from the UK: +\`{metric}(price, kql='location:UK')\` + `, + values: { + metric: id, + }, + }), + section: 'elasticsearch', + signature: i18n.translate('lensFormulaDocs.metric.signature', { + defaultMessage: 'field: string', + }), + }); +} + +export function buildContextVariableDocumentationDefinition({ + id, + name, + documentation, +}: { + id: string; + name: string; + documentation: string; +}): OperationDocumentationType { + return buildDocumentationDefinition({ + id, + name, + documentation, + section: 'constants', + signature: '', + }); +} diff --git a/packages/kbn-lens-formula-docs/src/operations/interval.ts b/packages/kbn-lens-formula-docs/src/operations/interval.ts new file mode 100644 index 0000000000000..b36f9a34914fc --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/interval.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 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'; +import { buildContextVariableDocumentationDefinition } from './helpers'; + +export const INTERVAL_ID = 'interval'; +export const INTERVAL_NAME = i18n.translate('lensFormulaDocs.interval', { + defaultMessage: 'Date histogram interval', +}); + +export const interval = buildContextVariableDocumentationDefinition({ + id: INTERVAL_ID, + name: INTERVAL_NAME, + documentation: i18n.translate('lensFormulaDocs.interval.help', { + defaultMessage: ` +The specified minimum interval for the date histogram, in milliseconds (ms). + +Example: Dynamically normalize the metric based on bucket interval size: +\`sum(bytes) / interval()\` +`, + }), +}); diff --git a/packages/kbn-lens-formula-docs/src/operations/last_value.ts b/packages/kbn-lens-formula-docs/src/operations/last_value.ts new file mode 100644 index 0000000000000..5705aad8ef090 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/last_value.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 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'; +import { OperationDocumentationType } from './types'; + +export const LAST_VALUE_ID = 'last_value'; +export const LAST_VALUE_NAME = i18n.translate('lensFormulaDocs.lastValue', { + defaultMessage: 'Last value', +}); + +export const lastValue: OperationDocumentationType = { + id: LAST_VALUE_ID, + name: LAST_VALUE_NAME, + documentation: { + section: 'elasticsearch', + signature: i18n.translate('lensFormulaDocs.lastValue.signature', { + defaultMessage: 'field: string', + }), + description: i18n.translate('lensFormulaDocs.lastValue.documentation.markdown', { + defaultMessage: ` +Returns the value of a field from the last document, ordered by the default time field of the data view. + +This function is usefull the retrieve the latest state of an entity. + +Example: Get the current status of server A: +\`last_value(server.status, kql=\'server.name="A"\')\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/max.ts b/packages/kbn-lens-formula-docs/src/operations/max.ts new file mode 100644 index 0000000000000..1068d796f1028 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/max.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 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'; +import { buildMetricDocumentationDefinition } from './helpers'; + +export const MAX_ID = 'max'; +export const MAX_NAME = i18n.translate('lensFormulaDocs.max', { + defaultMessage: 'Maximum', +}); + +export const max = buildMetricDocumentationDefinition({ + id: MAX_ID, + name: MAX_NAME, +}); diff --git a/packages/kbn-lens-formula-docs/src/operations/median.ts b/packages/kbn-lens-formula-docs/src/operations/median.ts new file mode 100644 index 0000000000000..7dfdaefa9b86c --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/median.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 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'; +import { buildMetricDocumentationDefinition } from './helpers'; + +export const MEDIAN_ID = 'median'; +export const MEDIAN_NAME = i18n.translate('lensFormulaDocs.median', { + defaultMessage: 'Median', +}); + +export const median = buildMetricDocumentationDefinition({ + id: MEDIAN_ID, + name: MEDIAN_NAME, +}); diff --git a/packages/kbn-lens-formula-docs/src/operations/min.ts b/packages/kbn-lens-formula-docs/src/operations/min.ts new file mode 100644 index 0000000000000..b2f8650d30081 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/min.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 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'; +import { buildMetricDocumentationDefinition } from './helpers'; + +export const MIN_ID = 'min'; +export const MIN_NAME = i18n.translate('lensFormulaDocs.min', { + defaultMessage: 'Minimum', +}); + +export const min = buildMetricDocumentationDefinition({ + id: MIN_ID, + name: MIN_NAME, +}); diff --git a/packages/kbn-lens-formula-docs/src/operations/moving_average.ts b/packages/kbn-lens-formula-docs/src/operations/moving_average.ts new file mode 100644 index 0000000000000..4c3177db93b11 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/moving_average.ts @@ -0,0 +1,43 @@ +/* + * 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'; +import { OperationDocumentationType } from './types'; + +export const MOVING_AVERAGE_ID = 'moving_average'; +export const MOVING_AVERAGE_NAME = i18n.translate('lensFormulaDocs.movingAverage', { + defaultMessage: 'Moving average', +}); +export const MOVING_AVERAGE_WINDOW_DEFAULT_VALUE = 5; + +export const movingAverage: OperationDocumentationType = { + id: MOVING_AVERAGE_ID, + name: MOVING_AVERAGE_NAME, + documentation: { + section: 'calculation', + signature: i18n.translate('lensFormulaDocs.moving_average.signature', { + defaultMessage: 'metric: number, [window]: number', + }), + description: i18n.translate('lensFormulaDocs.movingAverage.documentation.markdown', { + defaultMessage: ` +Calculates the moving average of a metric over time, averaging the last n-th values to calculate the current value. To use this function, you need to configure a date histogram dimension as well. +The default window value is {defaultValue}. + +This calculation will be done separately for separate series defined by filters or top values dimensions. + +Takes a named parameter \`window\` which specifies how many last values to include in the average calculation for the current value. + +Example: Smooth a line of measurements: +\`moving_average(sum(bytes), window=5)\` +`, + values: { + defaultValue: MOVING_AVERAGE_WINDOW_DEFAULT_VALUE, + }, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/normalize_by_unit.ts b/packages/kbn-lens-formula-docs/src/operations/normalize_by_unit.ts new file mode 100644 index 0000000000000..f66768f13a2b5 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/normalize_by_unit.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 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'; +import { OperationDocumentationType } from './types'; + +export const NORMALIZE_BY_UNIT_ID = 'normalize_by_unit'; +export const NORMALIZE_BY_UNIT_NAME = i18n.translate('lensFormulaDocs.timeScale', { + defaultMessage: 'Normalize by unit', +}); + +export const normalizeByUnit: OperationDocumentationType = { + id: NORMALIZE_BY_UNIT_ID, + name: NORMALIZE_BY_UNIT_NAME, + documentation: { + section: 'calculation', + signature: i18n.translate('lensFormulaDocs.time_scale', { + defaultMessage: 'metric: number, unit: s|m|h|d|w|M|y', + }), + description: i18n.translate('lensFormulaDocs.time_scale.documentation.markdown', { + defaultMessage: ` +This advanced function is useful for normalizing counts and sums to a specific time interval. It allows for integration with metrics that are stored already normalized to a specific time interval. + +This function can only be used if there's a date histogram function used in the current chart. + +Example: A ratio comparing an already normalized metric to another metric that needs to be normalized. +\`normalize_by_unit(counter_rate(max(system.diskio.write.bytes)), unit='s') / last_value(apache.status.bytes_per_second)\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/now.ts b/packages/kbn-lens-formula-docs/src/operations/now.ts new file mode 100644 index 0000000000000..cb5f1a6686d25 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/now.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 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'; +import { buildContextVariableDocumentationDefinition } from './helpers'; + +export const NOW_ID = 'now'; +export const NOW_NAME = i18n.translate('lensFormulaDocs.now', { + defaultMessage: 'Current now', +}); + +export const now = buildContextVariableDocumentationDefinition({ + id: NOW_ID, + name: NOW_NAME, + documentation: i18n.translate('lensFormulaDocs.now.help', { + defaultMessage: ` +The current now moment used in Kibana expressed in milliseconds (ms). + +Example: How long (in ms) has been the server running since the last restart? +\`now() - last_value(start_time)\` +`, + }), +}); diff --git a/packages/kbn-lens-formula-docs/src/operations/overall_average.ts b/packages/kbn-lens-formula-docs/src/operations/overall_average.ts new file mode 100644 index 0000000000000..328c97fde47d6 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/overall_average.ts @@ -0,0 +1,37 @@ +/* + * 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'; +import { OperationDocumentationType } from './types'; + +export const OVERALL_AVERAGE_ID = 'overall_average'; +export const OVERALL_AVERAGE_NAME = i18n.translate('lensFormulaDocs.overallAverage', { + defaultMessage: 'Overall average', +}); + +export const overallAverge: OperationDocumentationType = { + id: OVERALL_AVERAGE_ID, + name: OVERALL_AVERAGE_NAME, + documentation: { + section: 'calculation', + signature: i18n.translate('lensFormulaDocs.overall_metric', { + defaultMessage: 'metric: number', + }), + description: i18n.translate('lensFormulaDocs.overall_average.documentation.markdown', { + defaultMessage: ` +Calculates the average of a metric for all data points of a series in the current chart. A series is defined by a dimension using a date histogram or interval function. +Other dimensions breaking down the data like top values or filter are treated as separate series. + +If no date histograms or interval functions are used in the current chart, \`overall_average\` is calculating the average over all dimensions no matter the used function + +Example: Divergence from the mean: +\`sum(bytes) - overall_average(sum(bytes))\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/overall_max.ts b/packages/kbn-lens-formula-docs/src/operations/overall_max.ts new file mode 100644 index 0000000000000..4da02a7f1265f --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/overall_max.ts @@ -0,0 +1,37 @@ +/* + * 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'; +import { OperationDocumentationType } from './types'; + +export const OVERALL_MAX_ID = 'overall_max'; +export const OVERALL_MAX_NAME = i18n.translate('lensFormulaDocs.overallMax', { + defaultMessage: 'Overall max', +}); + +export const overallMax: OperationDocumentationType = { + id: OVERALL_MAX_ID, + name: OVERALL_MAX_NAME, + documentation: { + section: 'calculation', + signature: i18n.translate('lensFormulaDocs.overall_metric', { + defaultMessage: 'metric: number', + }), + description: i18n.translate('lensFormulaDocs.overall_max.documentation.markdown', { + defaultMessage: ` +Calculates the maximum of a metric for all data points of a series in the current chart. A series is defined by a dimension using a date histogram or interval function. +Other dimensions breaking down the data like top values or filter are treated as separate series. + +If no date histograms or interval functions are used in the current chart, \`overall_max\` is calculating the maximum over all dimensions no matter the used function + +Example: Percentage of range: +\`(sum(bytes) - overall_min(sum(bytes))) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/overall_min.ts b/packages/kbn-lens-formula-docs/src/operations/overall_min.ts new file mode 100644 index 0000000000000..f775f8d8448fa --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/overall_min.ts @@ -0,0 +1,37 @@ +/* + * 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'; +import { OperationDocumentationType } from './types'; + +export const OVERALL_MIN_ID = 'overall_min'; +export const OVERALL_MIN_NAME = i18n.translate('lensFormulaDocs.overallMin', { + defaultMessage: 'Overall min', +}); + +export const overallMin: OperationDocumentationType = { + id: OVERALL_MIN_ID, + name: OVERALL_MIN_NAME, + documentation: { + section: 'calculation', + signature: i18n.translate('lensFormulaDocs.overall_metric', { + defaultMessage: 'metric: number', + }), + description: i18n.translate('lensFormulaDocs.overall_min.documentation.markdown', { + defaultMessage: ` +Calculates the minimum of a metric for all data points of a series in the current chart. A series is defined by a dimension using a date histogram or interval function. +Other dimensions breaking down the data like top values or filter are treated as separate series. + +If no date histograms or interval functions are used in the current chart, \`overall_min\` is calculating the minimum over all dimensions no matter the used function + +Example: Percentage of range: +\`(sum(bytes) - overall_min(sum(bytes)) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/overall_sum.ts b/packages/kbn-lens-formula-docs/src/operations/overall_sum.ts new file mode 100644 index 0000000000000..b786cda98e4c8 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/overall_sum.ts @@ -0,0 +1,37 @@ +/* + * 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'; +import { OperationDocumentationType } from './types'; + +export const OVERALL_SUM_ID = 'overall_sum'; +export const OVERALL_SUM_NAME = i18n.translate('lensFormulaDocs.overallSum', { + defaultMessage: 'Overall sum', +}); + +export const overallSum: OperationDocumentationType = { + id: OVERALL_SUM_ID, + name: OVERALL_SUM_NAME, + documentation: { + section: 'calculation', + signature: i18n.translate('lensFormulaDocs.overall_metric', { + defaultMessage: 'metric: number', + }), + description: i18n.translate('lensFormulaDocs.overall_sum.documentation.markdown', { + defaultMessage: ` +Calculates the sum of a metric of all data points of a series in the current chart. A series is defined by a dimension using a date histogram or interval function. +Other dimensions breaking down the data like top values or filter are treated as separate series. + +If no date histograms or interval functions are used in the current chart, \`overall_sum\` is calculating the sum over all dimensions no matter the used function. + +Example: Percentage of total: +\`sum(bytes) / overall_sum(sum(bytes))\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/percentile.ts b/packages/kbn-lens-formula-docs/src/operations/percentile.ts new file mode 100644 index 0000000000000..35c94a0c3d2be --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/percentile.ts @@ -0,0 +1,34 @@ +/* + * 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'; +import { OperationDocumentationType } from './types'; + +export const PERCENTILE_ID = 'percentile'; +export const PERCENTILE_NAME = i18n.translate('lensFormulaDocs.percentile', { + defaultMessage: 'Percentile', +}); + +export const percentile: OperationDocumentationType = { + id: PERCENTILE_ID, + name: PERCENTILE_NAME, + documentation: { + section: 'elasticsearch', + signature: i18n.translate('lensFormulaDocs.percentile.signature', { + defaultMessage: 'field: string, [percentile]: number', + }), + description: i18n.translate('lensFormulaDocs.percentile.documentation.markdown', { + defaultMessage: ` +Returns the specified percentile of the values of a field. This is the value n percent of the values occuring in documents are smaller. + +Example: Get the number of bytes larger than 95 % of values: +\`percentile(bytes, percentile=95)\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/percentile_ranks.ts b/packages/kbn-lens-formula-docs/src/operations/percentile_ranks.ts new file mode 100644 index 0000000000000..2131131a2bf00 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/percentile_ranks.ts @@ -0,0 +1,34 @@ +/* + * 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'; +import { OperationDocumentationType } from './types'; + +export const PERCENTILE_RANK_ID = 'percentile_rank'; +export const PERCENTILE_RANK_NAME = i18n.translate('lensFormulaDocs.percentileRank', { + defaultMessage: 'Percentile rank', +}); + +export const percentileRank: OperationDocumentationType = { + id: PERCENTILE_RANK_ID, + name: PERCENTILE_RANK_NAME, + documentation: { + section: 'elasticsearch', + signature: i18n.translate('lensFormulaDocs.percentileRanks.signature', { + defaultMessage: 'field: string, [value]: number', + }), + description: i18n.translate('lensFormulaDocs.percentileRanks.documentation.markdown', { + defaultMessage: ` +Returns the percentage of values which are below a certain value. For example, if a value is greater than or equal to 95% of the observed values it is said to be at the 95th percentile rank + +Example: Get the percentage of values which are below of 100: +\`percentile_rank(bytes, value=100)\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/std_deviation.ts b/packages/kbn-lens-formula-docs/src/operations/std_deviation.ts new file mode 100644 index 0000000000000..6c0b0d1604b5b --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/std_deviation.ts @@ -0,0 +1,31 @@ +/* + * 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'; +import { buildMetricDocumentationDefinition } from './helpers'; + +export const STD_DEVIATION_ID = 'standard_deviation'; +export const STD_DEVIATION_NAME = i18n.translate('lensFormulaDocs.standardDeviation', { + defaultMessage: 'Standard deviation', +}); + +export const stdDeviation = buildMetricDocumentationDefinition({ + id: STD_DEVIATION_ID, + name: STD_DEVIATION_NAME, + documentation: i18n.translate('lensFormulaDocs.standardDeviation.documentation.markdown', { + defaultMessage: ` +Returns the amount of variation or dispersion of the field. The function works only for number fields. + +#### Examples + +To get the standard deviation of price, use \`standard_deviation(price)\`. + +To get the variance of price for orders from the UK, use \`square(standard_deviation(price, kql='location:UK'))\`. +`, + }), +}); diff --git a/packages/kbn-lens-formula-docs/src/operations/sum.ts b/packages/kbn-lens-formula-docs/src/operations/sum.ts new file mode 100644 index 0000000000000..8c7882b213a09 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/sum.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 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'; +import { buildMetricDocumentationDefinition } from './helpers'; + +export const SUM_ID = 'sum'; +export const SUM_NAME = i18n.translate('lensFormulaDocs.sum', { + defaultMessage: 'Sum', +}); + +export const sum = buildMetricDocumentationDefinition({ + id: SUM_ID, + name: SUM_NAME, +}); diff --git a/packages/kbn-lens-formula-docs/src/operations/time_range.ts b/packages/kbn-lens-formula-docs/src/operations/time_range.ts new file mode 100644 index 0000000000000..58107cbee1587 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/time_range.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 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'; +import { buildContextVariableDocumentationDefinition } from './helpers'; + +export const TIME_RANGE_ID = 'time_range'; +export const TIME_RANGE_NAME = i18n.translate('lensFormulaDocs.time_range', { + defaultMessage: 'Time range', +}); + +export const timeRange = buildContextVariableDocumentationDefinition({ + id: TIME_RANGE_ID, + name: TIME_RANGE_NAME, + documentation: i18n.translate('lensFormulaDocs.timeRange.help', { + defaultMessage: ` +The specified time range, in milliseconds (ms). + +Example: How long is the current time range? +\`time_range()\` +`, + }), +}); diff --git a/packages/kbn-lens-formula-docs/src/operations/types.ts b/packages/kbn-lens-formula-docs/src/operations/types.ts new file mode 100644 index 0000000000000..1351a9e9db28b --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/types.ts @@ -0,0 +1,17 @@ +/* + * 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 interface OperationDocumentationType { + id: string; + name: string; + documentation: { + signature: string; + description: string; + section: 'elasticsearch' | 'calculation' | 'constants'; + }; +} diff --git a/packages/kbn-lens-formula-docs/src/sections/calculations.ts b/packages/kbn-lens-formula-docs/src/sections/calculations.ts new file mode 100644 index 0000000000000..824e171087ff3 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/sections/calculations.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 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 calculationsSection = { + label: i18n.translate('lensFormulaDocs.documentation.columnCalculationSection', { + defaultMessage: 'Column calculations', + }), + description: i18n.translate('lensFormulaDocs.documentation.columnCalculationSectionDescription', { + defaultMessage: + 'These functions are executed for each row, but are provided with the whole column as context. This is also known as a window function.', + }), +}; diff --git a/packages/kbn-lens-formula-docs/src/sections/common.ts b/packages/kbn-lens-formula-docs/src/sections/common.ts new file mode 100644 index 0000000000000..050b3edc810b9 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/sections/common.ts @@ -0,0 +1,106 @@ +/* + * 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 commonFormulas = { + label: i18n.translate('lensFormulaDocs.frequentlyUsedHeading', { + defaultMessage: 'Common formulas', + }), + description: i18n.translate('lensFormulaDocs.CommonFormulaDocumentation', { + defaultMessage: `The most common formulas are dividing two values to produce a percent. To display accurately, set "value format" to "percent".`, + }), + items: [ + { + label: i18n.translate('lensFormulaDocs.documentation.filterRatio', { + defaultMessage: 'Filter ratio', + }), + description: i18n.translate('lensFormulaDocs.documentation.filterRatioDescription.markdown', { + defaultMessage: `### Filter ratio: + +Use \`kql=''\` to filter one set of documents and compare it to other documents within the same grouping. +For example, to see how the error rate changes over time: + +\`\`\` +count(kql='response.status_code > 400') / count() +\`\`\` + `, + + description: + 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', + }), + }, + { + label: i18n.translate('lensFormulaDocs.documentation.weekOverWeek', { + defaultMessage: 'Week over week', + }), + description: i18n.translate( + 'lensFormulaDocs.documentation.weekOverWeekDescription.markdown', + { + defaultMessage: `### Week over week: + +Use \`shift='1w'\` to get the value of each grouping from +the previous week. Time shift should not be used with the *Top values* function. + +\`\`\` +percentile(system.network.in.bytes, percentile=99) / +percentile(system.network.in.bytes, percentile=99, shift='1w') +\`\`\` + `, + + description: + 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', + } + ), + }, + { + label: i18n.translate('lensFormulaDocs.documentation.percentOfTotal', { + defaultMessage: 'Percent of total', + }), + description: i18n.translate( + 'lensFormulaDocs.documentation.percentOfTotalDescription.markdown', + { + defaultMessage: `### Percent of total + +Formulas can calculate \`overall_sum\` for all the groupings, +which lets you convert each grouping into a percent of total: + +\`\`\` +sum(products.base_price) / overall_sum(sum(products.base_price)) +\`\`\` + `, + + description: + 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', + } + ), + }, + { + label: i18n.translate('lensFormulaDocs.documentation.recentChange', { + defaultMessage: 'Recent change', + }), + description: i18n.translate( + 'lensFormulaDocs.documentation.recentChangeDescription.markdown', + { + defaultMessage: `### Recent change + +Use \`reducedTimeRange='30m'\` to add an additional filter on the time range of a metric aligned with the end of the global time range. This can be used to calculate how much a value changed recently. + +\`\`\` +max(system.network.in.bytes, reducedTimeRange="30m") +- min(system.network.in.bytes, reducedTimeRange="30m") +\`\`\` + `, + + description: + 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', + } + ), + }, + ], +}; diff --git a/packages/kbn-lens-formula-docs/src/sections/comparison.ts b/packages/kbn-lens-formula-docs/src/sections/comparison.ts new file mode 100644 index 0000000000000..152b521301832 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/sections/comparison.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 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 comparisonSection = { + label: i18n.translate('lensFormulaDocs.documentation.comparisonSection', { + defaultMessage: 'Comparison', + }), + description: i18n.translate('lensFormulaDocs.documentation.comparisonSectionDescription', { + defaultMessage: 'These functions are used to perform value comparison.', + }), +}; diff --git a/packages/kbn-lens-formula-docs/src/sections/context.ts b/packages/kbn-lens-formula-docs/src/sections/context.ts new file mode 100644 index 0000000000000..c4bb989d6b5e7 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/sections/context.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 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 contextSection = { + label: i18n.translate('lensFormulaDocs.documentation.constantsSection', { + defaultMessage: 'Kibana context', + }), + description: i18n.translate('lensFormulaDocs.documentation.constantsSectionDescription', { + defaultMessage: + 'These functions are used to retrieve Kibana context variables, which are the date histogram `interval`, the current `now` and the selected `time_range` and help you to compute date math operations.', + }), +}; diff --git a/packages/kbn-lens-formula-docs/src/sections/elasticsearch.ts b/packages/kbn-lens-formula-docs/src/sections/elasticsearch.ts new file mode 100644 index 0000000000000..2570c96f08f70 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/sections/elasticsearch.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 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 elasticsearchSection = { + label: i18n.translate('lensFormulaDocs.documentation.elasticsearchSection', { + defaultMessage: 'Elasticsearch', + }), + description: i18n.translate('lensFormulaDocs.documentation.elasticsearchSectionDescription', { + defaultMessage: + 'These functions will be executed on the raw documents for each row of the resulting table, aggregating all documents matching the break down dimensions into a single value.', + }), +}; diff --git a/packages/kbn-lens-formula-docs/src/sections/how_to.ts b/packages/kbn-lens-formula-docs/src/sections/how_to.ts new file mode 100644 index 0000000000000..76eb91023013e --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/sections/how_to.ts @@ -0,0 +1,46 @@ +/* + * 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 howToSection = i18n.translate('lensFormulaDocs.documentation.markdown', { + defaultMessage: `## How it works + +Lens formulas let you do math using a combination of Elasticsearch aggregations and +math functions. There are three main types of functions: + +* Elasticsearch metrics, like \`sum(bytes)\` +* Time series functions use Elasticsearch metrics as input, like \`cumulative_sum()\` +* Math functions like \`round()\` + +An example formula that uses all of these: + +\`\`\` +round(100 * moving_average( +average(cpu.load.pct), +window=10, +kql='datacenter.name: east*' +)) +\`\`\` + +Elasticsearch functions take a field name, which can be in quotes. \`sum(bytes)\` is the same +as \`sum('bytes')\`. + +Some functions take named arguments, like \`moving_average(count(), window=5)\`. + +Elasticsearch metrics can be filtered using KQL or Lucene syntax. To add a filter, use the named +parameter \`kql='field: value'\` or \`lucene=''\`. Always use single quotes when writing KQL or Lucene +queries. If your search has a single quote in it, use a backslash to escape, like: \`kql='Women's'\' + +Math functions can take positional arguments, like pow(count(), 3) is the same as count() * count() * count() + +Use the symbols +, -, /, and * to perform basic math. +`, + description: + 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', +}); diff --git a/packages/kbn-lens-formula-docs/src/sections/index.ts b/packages/kbn-lens-formula-docs/src/sections/index.ts new file mode 100644 index 0000000000000..dafa94b8269f0 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/sections/index.ts @@ -0,0 +1,25 @@ +/* + * 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 { elasticsearchSection } from './elasticsearch'; +import { commonFormulas } from './common'; +import { comparisonSection } from './comparison'; +import { mathSection } from './math'; +import { calculationsSection } from './calculations'; +import { contextSection } from './context'; +import { howToSection } from './how_to'; + +export const sections = { + howTo: howToSection, + elasticsearch: elasticsearchSection, + common: commonFormulas, + comparison: comparisonSection, + math: mathSection, + calculations: calculationsSection, + context: contextSection, +}; diff --git a/packages/kbn-lens-formula-docs/src/sections/math.ts b/packages/kbn-lens-formula-docs/src/sections/math.ts new file mode 100644 index 0000000000000..d3fcaf6a15b93 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/sections/math.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 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 mathSection = { + label: i18n.translate('lensFormulaDocs.documentation.mathSection', { + defaultMessage: 'Math', + }), + description: i18n.translate('lensFormulaDocs.documentation.mathSectionDescription', { + defaultMessage: + 'These functions will be executed for reach row of the resulting table using single values from the same row calculated using other functions.', + }), +}; diff --git a/packages/kbn-lens-formula-docs/tsconfig.json b/packages/kbn-lens-formula-docs/tsconfig.json new file mode 100644 index 0000000000000..d28d082af4d18 --- /dev/null +++ b/packages/kbn-lens-formula-docs/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": ["jest", "node"] + }, + "include": ["**/*.ts"], + "exclude": ["target/**/*"], + "kbn_references": [ + "@kbn/i18n", + ] +} 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 bfb9ecaee8d80..c6bf698319228 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 @@ -291,6 +291,7 @@ describe('autocomplete', () => { testSuggestions('from a,', suggestedIndexes); testSuggestions('from a, b ', ['[metadata $0 ]', '|', ',']); testSuggestions('from *,', suggestedIndexes); + testSuggestions('from index', suggestedIndexes, 6 /* index index in from */); }); describe('where', () => { diff --git a/packages/kbn-monaco/src/esql/lib/ast/definitions/functions.ts b/packages/kbn-monaco/src/esql/lib/ast/definitions/functions.ts index 820ab04fea3bf..9d19305a25060 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/definitions/functions.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/definitions/functions.ts @@ -18,9 +18,15 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }), signatures: [ { - params: [{ name: 'field', type: 'number' }], + params: [ + { name: 'field', type: 'number' }, + { name: 'decimals', type: 'number', optional: true }, + ], returnType: 'number', - examples: [`from index | eval round_value = round(field)`], + examples: [ + `from index | eval round_value = round(field)`, + `from index | eval round_value = round(field, 2)`, + ], }, ], }, diff --git a/packages/kbn-monaco/src/esql/lib/ast/shared/context.ts b/packages/kbn-monaco/src/esql/lib/ast/shared/context.ts index 3a51038ec4e92..d175ae1b2f3af 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/shared/context.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/shared/context.ts @@ -20,6 +20,7 @@ import { isColumnItem, getLastCharFromTrimmed, getFunctionDefinition, + isSourceItem, } from './helpers'; function findNode(nodes: ESQLAstItem[], offset: number): ESQLSingleAstItem | undefined { @@ -69,7 +70,9 @@ function findOption(nodes: ESQLAstItem[], offset: number): ESQLCommandOption | u } function isMarkerNode(node: ESQLSingleAstItem | undefined): boolean { - return Boolean(node && isColumnItem(node) && node.name === EDITOR_MARKER); + return Boolean( + node && (isColumnItem(node) || isSourceItem(node)) && node.name.endsWith(EDITOR_MARKER) + ); } function cleanMarkerNode(node: ESQLSingleAstItem | undefined): ESQLSingleAstItem | undefined { diff --git a/packages/kbn-search-connectors/components/configuration/connector_configuration.tsx b/packages/kbn-search-connectors/components/configuration/connector_configuration.tsx index fb1ebce945306..b3fc911460bf7 100644 --- a/packages/kbn-search-connectors/components/configuration/connector_configuration.tsx +++ b/packages/kbn-search-connectors/components/configuration/connector_configuration.tsx @@ -118,6 +118,27 @@ export const ConnectorConfigurationComponent: React.FC {children && {children}} + {!uncategorizedDisplayList.length && ( + + + {i18n.translate( + 'searchConnectors.configurationConnector.config.noConfigCallout.description', + { + defaultMessage: + 'This connector has no configuration fields. Has your connector connected successfully to Elasticsearch and set its configuration?', + } + )} + + + )} {isEditing ? ( { const [, error1] = await promise1; const [result1] = await promise2; expect(error1).toMatchObject({ - message: 'Unexpected token N in JSON at position 0', + message: `Unexpected token 'N', "Not a JSON\n" is not valid JSON`, code: 'STREAM', }); expect(result1).toMatchObject({ diff --git a/src/plugins/data/public/search/expressions/esdsl.test.ts b/src/plugins/data/public/search/expressions/esdsl.test.ts index 2bf2ef1148507..603dbf1e8f3eb 100644 --- a/src/plugins/data/public/search/expressions/esdsl.test.ts +++ b/src/plugins/data/public/search/expressions/esdsl.test.ts @@ -63,7 +63,7 @@ describe('esdsl', () => { } catch (error) { errorMessage = error.message; } - expect(errorMessage).toEqual('Unexpected token i in JSON at position 0'); + expect(errorMessage).toEqual(`Unexpected token 'i', "invalid json" is not valid JSON`); }); test('adds filters', async () => { diff --git a/src/plugins/kibana_utils/public/index.ts b/src/plugins/kibana_utils/public/index.ts index 9a717953d60f8..4bf4939714975 100644 --- a/src/plugins/kibana_utils/public/index.ts +++ b/src/plugins/kibana_utils/public/index.ts @@ -6,7 +6,6 @@ * Side Public License, v 1. */ -import { PluginInitializerContext } from '@kbn/core/public'; import { KibanaUtilsPublicPlugin } from './plugin'; export type { Get, Set } from '../common'; @@ -114,6 +113,6 @@ export { applyDiff } from './state_management/utils/diff_object'; export type { KibanaUtilsPublicSetup as KibanaUtilsSetup, KibanaUtilsPublicStart } from './plugin'; -export function plugin(initializerContext: PluginInitializerContext) { - return new KibanaUtilsPublicPlugin(initializerContext); +export function plugin() { + return new KibanaUtilsPublicPlugin(); } diff --git a/src/plugins/kibana_utils/public/mocks.ts b/src/plugins/kibana_utils/public/mocks.ts index cb872838af4b4..e30587d71772a 100644 --- a/src/plugins/kibana_utils/public/mocks.ts +++ b/src/plugins/kibana_utils/public/mocks.ts @@ -12,9 +12,7 @@ export type Setup = jest.Mocked; export type Start = jest.Mocked; const createSetupContract = (): Setup => { - return { - setVersion: jest.fn(), - }; + return undefined; }; const createStartContract = (): Start => { diff --git a/src/plugins/kibana_utils/public/plugin.ts b/src/plugins/kibana_utils/public/plugin.ts index 05d8ede256498..f9c1e37928ba5 100644 --- a/src/plugins/kibana_utils/public/plugin.ts +++ b/src/plugins/kibana_utils/public/plugin.ts @@ -6,13 +6,9 @@ * Side Public License, v 1. */ -import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; -import { History } from 'history'; -import { setVersion } from './set_version'; +import { CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; -export interface KibanaUtilsPublicSetup { - setVersion: (history: Pick) => void; -} +export type KibanaUtilsPublicSetup = undefined; export type KibanaUtilsPublicStart = undefined; @@ -31,16 +27,8 @@ export class KibanaUtilsPublicPlugin KibanaUtilsPublicStartDependencies > { - private readonly version: string; - - constructor(initializerContext: PluginInitializerContext) { - this.version = initializerContext.env.packageInfo.version; - } - public setup(_core: CoreSetup): KibanaUtilsPublicSetup { - return { - setVersion: this.setVersion, - }; + return undefined; } public start(_core: CoreStart): KibanaUtilsPublicStart { @@ -48,8 +36,4 @@ export class KibanaUtilsPublicPlugin } public stop() {} - - private setVersion = (history: Pick) => { - setVersion(history, this.version); - }; } diff --git a/src/plugins/kibana_utils/public/set_version.test.ts b/src/plugins/kibana_utils/public/set_version.test.ts deleted file mode 100644 index eb70d889d0f03..0000000000000 --- a/src/plugins/kibana_utils/public/set_version.test.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 { History } from 'history'; -import { setVersion } from './set_version'; - -describe('setVersion', () => { - test('sets version, if one is not set', () => { - const history: Pick = { - location: { - hash: '', - search: '', - pathname: '/', - state: {}, - }, - replace: jest.fn(), - }; - setVersion(history, '1.2.3'); - - expect(history.replace).toHaveBeenCalledTimes(1); - expect(history.replace).toHaveBeenCalledWith('/?_v=1.2.3'); - }); - - test('overwrites, if version already set to a different value', () => { - const history: Pick = { - location: { - hash: '/view/dashboards', - search: 'a=b&_v=7.16.6', - pathname: '/foo/bar', - state: {}, - }, - replace: jest.fn(), - }; - setVersion(history, '8.0.0'); - - expect(history.replace).toHaveBeenCalledTimes(1); - expect(history.replace).toHaveBeenCalledWith('/foo/bar?a=b&_v=8.0.0#/view/dashboards'); - }); - - test('does nothing, if version already set to correct value', () => { - const history: Pick = { - location: { - hash: '/view/dashboards', - search: 'a=b&_v=8.0.0', - pathname: '/foo/bar', - state: {}, - }, - replace: jest.fn(), - }; - setVersion(history, '8.0.0'); - - expect(history.replace).toHaveBeenCalledTimes(0); - }); -}); diff --git a/src/plugins/kibana_utils/public/set_version.ts b/src/plugins/kibana_utils/public/set_version.ts deleted file mode 100644 index b3acb39ed5134..0000000000000 --- a/src/plugins/kibana_utils/public/set_version.ts +++ /dev/null @@ -1,21 +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 { History } from 'history'; - -export const setVersion = (history: Pick, version: string) => { - const search = new URLSearchParams(history.location.search); - if (search.get('_v') === version) return; - search.set('_v', version); - const path = - history.location.pathname + - '?' + - search.toString() + - (history.location.hash ? '#' + history.location.hash : ''); - history.replace(path); -}; diff --git a/src/setup_node_env/exit_on_warning.js b/src/setup_node_env/exit_on_warning.js index 5e7bae8254c04..dc6e321074224 100644 --- a/src/setup_node_env/exit_on_warning.js +++ b/src/setup_node_env/exit_on_warning.js @@ -46,6 +46,13 @@ var IGNORE_WARNINGS = [ // We need to discard that warning name: 'ProductNotSupportedSecurityError', }, + // https://github.com/browserify/browserify-rsa/pull/20 + { + name: 'DeprecationWarning', + code: 'DEP0170', + message: + 'The URL https://github.com:crypto-browserify/browserify-rsa.git is invalid. Future versions of Node.js will throw an error.', + }, ]; if (process.noProcessWarnings !== true) { diff --git a/src/setup_node_env/heap_snapshot.js b/src/setup_node_env/heap_snapshot.js deleted file mode 100644 index 94e4b35e2f887..0000000000000 --- a/src/setup_node_env/heap_snapshot.js +++ /dev/null @@ -1,46 +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. - */ - -var getopts = require('getopts'); -var path = require('path'); -var v8 = require('node:v8'); -var worker = require('node:worker_threads'); - -var execOpts = getopts(process.execArgv); -var envOpts = getopts(process.env.NODE_OPTIONS ? process.env.NODE_OPTIONS.split(/\s+/) : []); -var diagnosticDir = execOpts['diagnostic-dir'] || envOpts['diagnostic-dir']; -var heapSnapshotSignal = execOpts['heapsnapshot-signal'] || envOpts['heapsnapshot-signal']; -var heapSnapshotSerial = 0; - -function getHeapSnapshotPath() { - var now = new Date(); - - var year = now.getFullYear(); - var month = String(now.getMonth() + 1).padStart(2, '0'); - var day = String(now.getDate()).padStart(2, '0'); - var hours = String(now.getHours()).padStart(2, '0'); - var minutes = String(now.getMinutes()).padStart(2, '0'); - var seconds = String(now.getSeconds()).padStart(2, '0'); - - var date = `${year}${month}${day}`; - var time = `${hours}${minutes}${seconds}`; - var pid = process.pid; - var threadId = worker.threadId; - var serial = (++heapSnapshotSerial).toString().padStart(3, '0'); - - return path.join(diagnosticDir, `Heap.${date}.${time}.${pid}.${threadId}.${serial}.heapsnapshot`); -} - -if (diagnosticDir && heapSnapshotSignal) { - process.removeAllListeners(heapSnapshotSignal); - - process.on(heapSnapshotSignal, function () { - var heapSnapshotPath = getHeapSnapshotPath(); - v8.writeHeapSnapshot(heapSnapshotPath); - }); -} diff --git a/src/setup_node_env/setup_env.js b/src/setup_node_env/setup_env.js index d3076a2c3b9cf..7b37d98011cfb 100644 --- a/src/setup_node_env/setup_env.js +++ b/src/setup_node_env/setup_env.js @@ -11,8 +11,6 @@ require('./exit_on_warning'); require('./harden'); // The following require statements MUST be executed before any others - END -// @todo Remove when migrated to Node 20 (#162696) -require('./heap_snapshot'); require('symbol-observable'); require('source-map-support').install(); require('./node_version_validator'); diff --git a/test/common/services/security/test_user.ts b/test/common/services/security/test_user.ts index bc5dbf68698bc..e8d88d81bb167 100644 --- a/test/common/services/security/test_user.ts +++ b/test/common/services/security/test_user.ts @@ -61,7 +61,10 @@ export class TestUser extends FtrService { }); if (this.browser && this.testSubjects && !options?.skipBrowserRefresh) { - if (await this.testSubjects.exists('kibanaChrome', { allowHidden: true })) { + if ( + (await this.browser.hasOpenWindow()) && + (await this.testSubjects.exists('kibanaChrome', { allowHidden: true })) + ) { await this.browser.refresh(); // accept alert if it pops up const alert = await this.browser.getAlert(); diff --git a/test/functional/apps/discover/group1/_discover_histogram.ts b/test/functional/apps/discover/group1/_discover_histogram.ts index 72ad1854a605e..64e9b0e47dc90 100644 --- a/test/functional/apps/discover/group1/_discover_histogram.ts +++ b/test/functional/apps/discover/group1/_discover_histogram.ts @@ -43,6 +43,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ); await security.testUser.setRoles(['kibana_admin', 'long_window_logstash']); await kibanaServer.uiSettings.replace(defaultSettings); + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); await PageObjects.common.navigateToApp('discover'); }); after(async () => { @@ -65,13 +66,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should modify the time range when the histogram is brushed', async function () { await PageObjects.common.navigateToApp('discover'); await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.timePicker.setDefaultAbsoluteRange(); - await PageObjects.discover.waitUntilSearchingHasFinished(); // this is the number of renderings of the histogram needed when new data is fetched let renderingCountInc = 1; const prevRenderingCount = await elasticChart.getVisualizationRenderingCount(); - await PageObjects.timePicker.setDefaultAbsoluteRange(); - await PageObjects.discover.waitUntilSearchingHasFinished(); + await queryBar.submitQuery(); await retry.waitFor('chart rendering complete', async () => { const actualCount = await elasticChart.getVisualizationRenderingCount(); const expectedCount = prevRenderingCount + renderingCountInc; @@ -107,8 +105,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should update correctly when switching data views and brushing the histogram', async () => { await PageObjects.common.navigateToApp('discover'); await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.timePicker.setDefaultAbsoluteRange(); - await PageObjects.discover.waitUntilSearchingHasFinished(); await PageObjects.discover.selectIndexPattern('logstash-*'); await PageObjects.discover.waitUntilSearchingHasFinished(); await PageObjects.discover.selectIndexPattern('long-window-logstash-*'); @@ -281,7 +277,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should recover from broken query search when clearing the query bar', async () => { await PageObjects.common.navigateToApp('discover'); await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.timePicker.setDefaultAbsoluteRange(); // Make sure the chart is visible await testSubjects.click('unifiedHistogramChartOptionsToggle'); await testSubjects.click('unifiedHistogramChartToggle'); @@ -294,8 +289,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // now remove the query await queryBar.clearQuery(); - await queryBar.clickQuerySubmitButton(); - await PageObjects.header.waitUntilLoadingHasFinished(); + await queryBar.submitQuery(); await PageObjects.discover.waitUntilSearchingHasFinished(); // check no error state expect(await PageObjects.discover.isChartVisible()).to.be(true); diff --git a/test/functional/services/remote/remote.ts b/test/functional/services/remote/remote.ts index b3038130b0187..6ee7b6e8d9085 100644 --- a/test/functional/services/remote/remote.ts +++ b/test/functional/services/remote/remote.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { NoSuchSessionError } from 'selenium-webdriver/lib/error'; +import { NoSuchSessionError, NoSuchWindowError } from 'selenium-webdriver/lib/error'; import { FtrProviderContext } from '../../ftr_provider_context'; import { initWebDriver, BrowserConfig } from './webdriver'; import { Browsers } from './browsers'; @@ -37,6 +37,10 @@ export async function RemoteProvider({ getService }: FtrProviderContext) { // Avoid duplicating NoSuchSessionError error output on each hook // https://developer.mozilla.org/en-US/docs/Web/WebDriver/Errors/InvalidSessionID log.error('WebDriver session is no longer valid'); + } else if (error instanceof NoSuchWindowError) { + // Avoid duplicating NoSuchWindowError error output on each hook + // https://developer.mozilla.org/en-US/docs/Web/WebDriver/Errors + log.error('Browser window is already closed'); } else { throw error; } diff --git a/tsconfig.base.json b/tsconfig.base.json index 178f70c927e28..d241aace37840 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -966,6 +966,8 @@ "@kbn/language-documentation-popover/*": ["packages/kbn-language-documentation-popover/*"], "@kbn/lens-embeddable-utils": ["packages/kbn-lens-embeddable-utils"], "@kbn/lens-embeddable-utils/*": ["packages/kbn-lens-embeddable-utils/*"], + "@kbn/lens-formula-docs": ["packages/kbn-lens-formula-docs"], + "@kbn/lens-formula-docs/*": ["packages/kbn-lens-formula-docs/*"], "@kbn/lens-plugin": ["x-pack/plugins/lens"], "@kbn/lens-plugin/*": ["x-pack/plugins/lens/*"], "@kbn/license-api-guard-plugin": ["x-pack/plugins/license_api_guard"], diff --git a/versions.json b/versions.json index ce91f8f76bb7e..8406528bb4428 100644 --- a/versions.json +++ b/versions.json @@ -13,10 +13,16 @@ "currentMajor": true, "previousMinor": true }, + { + "version": "8.11.4", + "branch": "8.11", + "currentMajor": true, + "previousMinor": true + }, { "version": "7.17.17", "branch": "7.17", "previousMajor": true } ] -} +} \ No newline at end of file diff --git a/x-pack/examples/gen_ai_streaming_response_example/server/plugin.ts b/x-pack/examples/gen_ai_streaming_response_example/server/plugin.ts index 05f9612bcf73d..02be370d08e25 100644 --- a/x-pack/examples/gen_ai_streaming_response_example/server/plugin.ts +++ b/x-pack/examples/gen_ai_streaming_response_example/server/plugin.ts @@ -6,7 +6,7 @@ */ import Boom from '@hapi/boom'; -import { CreateChatCompletionResponse } from 'openai'; +import type OpenAI from 'openai'; import { Readable } from 'stream'; import { Plugin, CoreSetup } from '@kbn/core/server'; import { schema } from '@kbn/config-schema'; @@ -112,7 +112,7 @@ export class GenAiStreamingResponseExamplePlugin implements Plugin { } return response.ok({ - body: executeResult.data as CreateChatCompletionResponse | Readable, + body: executeResult.data as OpenAI.ChatCompletion | Readable, }); } ); diff --git a/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.ts b/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.ts index 0091faca468e3..0aa5fca22d0ff 100644 --- a/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.ts +++ b/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.ts @@ -9,7 +9,7 @@ import { encode } from 'gpt-tokenizer'; import { isEmpty, omitBy } from 'lodash'; import { Readable } from 'stream'; import { finished } from 'stream/promises'; -import { CreateChatCompletionRequest } from 'openai'; +import type OpenAI from 'openai'; import { Logger } from '@kbn/logging'; export async function getTokenCountFromOpenAIStream({ @@ -25,7 +25,9 @@ export async function getTokenCountFromOpenAIStream({ prompt: number; completion: number; }> { - const chatCompletionRequest = JSON.parse(body) as CreateChatCompletionRequest; + const chatCompletionRequest = JSON.parse( + body + ) as OpenAI.ChatCompletionCreateParams.ChatCompletionCreateParamsStreaming; // per https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb const tokensFromMessages = encode( @@ -33,9 +35,9 @@ export async function getTokenCountFromOpenAIStream({ .map( (msg) => `<|start|>${msg.role}\n${msg.content}\n${ - msg.name + 'name' in msg ? msg.name - : msg.function_call + : 'function_call' in msg && msg.function_call ? msg.function_call.name + '\n' + msg.function_call.arguments : '' }<|end|>` diff --git a/x-pack/plugins/alerting/server/task_runner/execution_handler.ts b/x-pack/plugins/alerting/server/task_runner/execution_handler.ts index 29f56b630eaf8..3a464c8f30521 100644 --- a/x-pack/plugins/alerting/server/task_runner/execution_handler.ts +++ b/x-pack/plugins/alerting/server/task_runner/execution_handler.ts @@ -9,7 +9,11 @@ import type { PublicMethodsOf } from '@kbn/utility-types'; import { Logger } from '@kbn/core/server'; import { ALERT_UUID, getRuleDetailsRoute, triggersActionsRoute } from '@kbn/rule-data-utils'; import { asSavedObjectExecutionSource } from '@kbn/actions-plugin/server'; -import { isEphemeralTaskRejectedDueToCapacityError } from '@kbn/task-manager-plugin/server'; +import { + createTaskRunError, + isEphemeralTaskRejectedDueToCapacityError, + TaskErrorSource, +} from '@kbn/task-manager-plugin/server'; import { ExecuteOptions as EnqueueExecutionOptions, ExecutionResponseItem, @@ -360,10 +364,15 @@ export class ExecutionHandler< if (!!bulkActions.length) { for (const c of chunk(bulkActions, CHUNK_SIZE)) { - const response = await this.actionsClient!.bulkEnqueueExecution(c); - if (response.errors) { + let enqueueResponse; + try { + enqueueResponse = await this.actionsClient!.bulkEnqueueExecution(c); + } catch (e) { + throw createTaskRunError(e, TaskErrorSource.FRAMEWORK); + } + if (enqueueResponse.errors) { bulkActionsResponse = bulkActionsResponse.concat( - response.items.filter( + enqueueResponse.items.filter( (i) => i.response === ExecutionResponseType.QUEUED_ACTIONS_LIMIT_ERROR ) ); @@ -730,7 +739,13 @@ export class ExecutionHandler< executionUuid: this.executionId, }; } - const alerts = await this.alertsClient.getSummarizedAlerts!(options); + + let alerts; + try { + alerts = await this.alertsClient.getSummarizedAlerts!(options); + } catch (e) { + throw createTaskRunError(e, TaskErrorSource.FRAMEWORK); + } /** * We need to remove all new alerts with maintenance windows retrieved from diff --git a/x-pack/plugins/alerting/server/task_runner/rule_loader.test.ts b/x-pack/plugins/alerting/server/task_runner/rule_loader.test.ts index 380d436c95e65..f3417312881e8 100644 --- a/x-pack/plugins/alerting/server/task_runner/rule_loader.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/rule_loader.test.ts @@ -19,6 +19,7 @@ import { ErrorWithReason, getReasonFromError } from '../lib/error_with_reason'; import { alertingEventLoggerMock } from '../lib/alerting_event_logger/alerting_event_logger.mock'; import { mockedRawRuleSO, mockedRule } from './fixtures'; import { RULE_SAVED_OBJECT_TYPE } from '../saved_objects'; +import { getErrorSource, TaskErrorSource } from '@kbn/task-manager-plugin/server/task_running'; // create mocks const rulesClient = rulesClientMock.create(); @@ -142,6 +143,7 @@ describe('rule_loader', () => { } catch (err) { outcome = 'failure'; expect(getReasonFromError(err)).toBe(RuleExecutionStatusErrorReasons.Disabled); + expect(getErrorSource(err)).toBe(TaskErrorSource.FRAMEWORK); } expect(outcome).toBe('failure'); }); @@ -162,6 +164,7 @@ describe('rule_loader', () => { outcome = 'failure'; expect(err.message).toBe('rule-type-not-enabled: 2112'); expect(getReasonFromError(err)).toBe(RuleExecutionStatusErrorReasons.License); + expect(getErrorSource(err)).toBe(TaskErrorSource.USER); } expect(outcome).toBe('failure'); }); @@ -178,6 +181,7 @@ describe('rule_loader', () => { outcome = 'failure'; expect(err.message).toMatch('[bar]: expected value of type [boolean] but got [string]'); expect(getReasonFromError(err)).toBe(RuleExecutionStatusErrorReasons.Validate); + expect(getErrorSource(err)).toBe(TaskErrorSource.USER); } expect(outcome).toBe('failure'); }); @@ -229,8 +233,12 @@ describe('rule_loader', () => { } ); - const promise = getRuleAttributes(context, ruleId, spaceId); - await expect(promise).rejects.toThrow('wops'); + try { + await getRuleAttributes(context, ruleId, spaceId); + } catch (e) { + expect(e.message).toMatch('wops'); + expect(getErrorSource(e)).toBe(TaskErrorSource.FRAMEWORK); + } }); }); diff --git a/x-pack/plugins/alerting/server/task_runner/rule_loader.ts b/x-pack/plugins/alerting/server/task_runner/rule_loader.ts index fb037b802ec9b..ccf40adbf0920 100644 --- a/x-pack/plugins/alerting/server/task_runner/rule_loader.ts +++ b/x-pack/plugins/alerting/server/task_runner/rule_loader.ts @@ -6,12 +6,13 @@ */ import { addSpaceIdToPath } from '@kbn/spaces-plugin/server'; -import { CoreKibanaRequest, FakeRawRequest, Headers } from '@kbn/core/server'; +import { CoreKibanaRequest, FakeRawRequest, Headers, SavedObject } from '@kbn/core/server'; import { PublicMethodsOf } from '@kbn/utility-types'; import { LoadedIndirectParams, LoadIndirectParamsResult, } from '@kbn/task-manager-plugin/server/task'; +import { createTaskRunError, TaskErrorSource } from '@kbn/task-manager-plugin/server'; import { TaskRunnerContext } from './task_runner_factory'; import { ErrorWithReason, validateRuleTypeParams } from '../lib'; import { @@ -70,23 +71,33 @@ export function validateRule( const { enabled, apiKey } = indirectParams; if (!enabled) { - throw new ErrorWithReason( - RuleExecutionStatusErrorReasons.Disabled, - new Error(`Rule failed to execute because rule ran after it was disabled.`) + throw createTaskRunError( + new ErrorWithReason( + RuleExecutionStatusErrorReasons.Disabled, + new Error(`Rule failed to execute because rule ran after it was disabled.`) + ), + TaskErrorSource.FRAMEWORK ); } + alertingEventLogger.setRuleName(rule.name); try { ruleTypeRegistry.ensureRuleTypeEnabled(rule.alertTypeId); } catch (err) { - throw new ErrorWithReason(RuleExecutionStatusErrorReasons.License, err); + throw createTaskRunError( + new ErrorWithReason(RuleExecutionStatusErrorReasons.License, err), + TaskErrorSource.USER + ); } let validatedParams: Params; try { validatedParams = validateRuleTypeParams(rule.params, paramValidator); } catch (err) { - throw new ErrorWithReason(RuleExecutionStatusErrorReasons.Validate, err); + throw createTaskRunError( + new ErrorWithReason(RuleExecutionStatusErrorReasons.Validate, err), + TaskErrorSource.USER + ); } if (rule.monitoring) { @@ -114,11 +125,17 @@ export async function getRuleAttributes( ): Promise> { const namespace = context.spaceIdToNamespace(spaceId); - const rawRule = await context.encryptedSavedObjectsClient.getDecryptedAsInternalUser( - RULE_SAVED_OBJECT_TYPE, - ruleId, - { namespace } - ); + let rawRule: SavedObject; + + try { + rawRule = await context.encryptedSavedObjectsClient.getDecryptedAsInternalUser( + RULE_SAVED_OBJECT_TYPE, + ruleId, + { namespace } + ); + } catch (e) { + throw createTaskRunError(e, TaskErrorSource.FRAMEWORK); + } const fakeRequest = getFakeKibanaRequest(context, spaceId, rawRule.attributes.apiKey); const rulesClient = context.getRulesClientWithRequest(fakeRequest); diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts b/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts index 23d5d5f576ce3..d395ff3364cd7 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts @@ -18,7 +18,11 @@ import { RuleAction, RuleAlertData, } from '../types'; -import { ConcreteTaskInstance, isUnrecoverableError } from '@kbn/task-manager-plugin/server'; +import { + ConcreteTaskInstance, + isUnrecoverableError, + TaskErrorSource, +} from '@kbn/task-manager-plugin/server'; import { TaskRunnerContext } from './task_runner_factory'; import { TaskRunner } from './task_runner'; import { encryptedSavedObjectsMock } from '@kbn/encrypted-saved-objects-plugin/server/mocks'; @@ -83,6 +87,7 @@ import { getMockMaintenanceWindow } from '../data/maintenance_window/test_helper import { alertsClientMock } from '../alerts_client/alerts_client.mock'; import { MaintenanceWindow } from '../application/maintenance_window/types'; import { RULE_SAVED_OBJECT_TYPE } from '../saved_objects'; +import { getErrorSource } from '@kbn/task-manager-plugin/server/task_running'; jest.mock('uuid', () => ({ v4: () => '5f6aa57d-3e22-484e-bae8-cbed868f4d28', @@ -1942,6 +1947,7 @@ describe('Task Runner', () => { expect(loggerMeta?.tags).toEqual(['test', '1', 'rule-run-failed']); expect(loggerMeta?.error?.stack_trace).toBeDefined(); expect(logger.error).toBeCalledTimes(1); + expect(getErrorSource(runnerResult.taskRunError as Error)).toBe(TaskErrorSource.USER); }); test('recovers gracefully when the Rule Task Runner throws an exception when loading rule to prepare for run', async () => { @@ -3326,6 +3332,7 @@ describe('Task Runner', () => { expect(encryptedSavedObjectsClient.getDecryptedAsInternalUser).toHaveBeenCalledTimes(1); expect(result).toEqual({ error }); + expect(getErrorSource(result.error as Error)).toBe(TaskErrorSource.FRAMEWORK); }); function testAlertingEventLogCalls({ diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner.ts b/x-pack/plugins/alerting/server/task_runner/task_runner.ts index 532dd7b1e12ba..208e46b88a1f6 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner.ts @@ -12,12 +12,13 @@ import { v4 as uuidv4 } from 'uuid'; import { Logger } from '@kbn/core/server'; import { ConcreteTaskInstance, - throwUnrecoverableError, createTaskRunError, TaskErrorSource, + throwUnrecoverableError, } from '@kbn/task-manager-plugin/server'; import { nanosToMillis } from '@kbn/event-log-plugin/server'; import { DEFAULT_NAMESPACE_STRING } from '@kbn/core-saved-objects-utils-server'; +import { getErrorSource } from '@kbn/task-manager-plugin/server/task_running'; import { ExecutionHandler, RunResult } from './execution_handler'; import { TaskRunnerContext } from './task_runner_factory'; import { @@ -25,20 +26,20 @@ import { ErrorWithReason, executionStatusFromError, executionStatusFromState, - ruleExecutionStatusToRaw, + getNextRun, isRuleSnoozed, lastRunFromError, - getNextRun, + ruleExecutionStatusToRaw, } from '../lib'; import { - RuleExecutionStatus, - RuleExecutionStatusErrorReasons, IntervalSchedule, RawRuleExecutionStatus, + RawRuleLastRun, RawRuleMonitoring, + RuleExecutionStatus, + RuleExecutionStatusErrorReasons, RuleTaskState, RuleTypeRegistry, - RawRuleLastRun, } from '../types'; import { asErr, asOk, isErr, isOk, map, resolveErr, Result } from '../lib/result_type'; import { taskInstanceToAlertTaskInstance } from './alert_task_instance'; @@ -47,18 +48,18 @@ import { partiallyUpdateRule, RULE_SAVED_OBJECT_TYPE } from '../saved_objects'; import { AlertInstanceContext, AlertInstanceState, - RuleTypeParams, - RuleTypeState, parseDuration, RawAlertInstance, - RuleLastRunOutcomeOrderMap, RuleAlertData, - SanitizedRule, + RuleLastRunOutcomeOrderMap, RuleNotifyWhen, + RuleTypeParams, + RuleTypeState, + SanitizedRule, } from '../../common'; import { NormalizedRuleType, UntypedNormalizedRuleType } from '../rule_type_registry'; import { getEsErrorMessage } from '../lib/errors'; -import { InMemoryMetrics, IN_MEMORY_METRICS } from '../monitoring'; +import { IN_MEMORY_METRICS, InMemoryMetrics } from '../monitoring'; import { RuleTaskInstance, RuleTaskRunResult, @@ -552,7 +553,10 @@ export class TaskRunner< message: err, stackTrace: err.stack, }; - throw new ErrorWithReason(RuleExecutionStatusErrorReasons.Execute, err); + throw createTaskRunError( + new ErrorWithReason(RuleExecutionStatusErrorReasons.Execute, err), + TaskErrorSource.USER + ); } } @@ -838,7 +842,10 @@ export class TaskRunner< const data = await getRuleAttributes(this.context, ruleId, spaceId); this.ruleData = { data }; } catch (err) { - const error = new ErrorWithReason(RuleExecutionStatusErrorReasons.Decrypt, err); + const error = createTaskRunError( + new ErrorWithReason(RuleExecutionStatusErrorReasons.Decrypt, err), + getErrorSource(err) + ); this.ruleData = { error }; } return this.ruleData; @@ -930,6 +937,14 @@ export class TaskRunner< timings: this.timer.toJson(), }); + const getTaskRunError = (state: Result) => { + return isErr(state) + ? { + taskRunError: createTaskRunError(state.error, getErrorSource(state.error)), + } + : {}; + }; + return { state: map( stateWithMetrics, @@ -977,9 +992,7 @@ export class TaskRunner< return { interval: retryInterval }; }), monitoring: this.ruleMonitoring.getMonitoring(), - ...(isErr(schedule) - ? { taskRunError: createTaskRunError(schedule.error, TaskErrorSource.FRAMEWORK) } - : {}), + ...getTaskRunError(stateWithMetrics), }; } diff --git a/x-pack/plugins/cases/server/saved_object_types/migrations/user_actions/connector_id.test.ts b/x-pack/plugins/cases/server/saved_object_types/migrations/user_actions/connector_id.test.ts index ed43cc40649c6..2ed37837f5100 100644 --- a/x-pack/plugins/cases/server/saved_object_types/migrations/user_actions/connector_id.test.ts +++ b/x-pack/plugins/cases/server/saved_object_types/migrations/user_actions/connector_id.test.ts @@ -254,7 +254,7 @@ describe('user action migrations', () => { const log = context.log as jest.Mocked; expect(log.error.mock.calls[0]).toMatchInlineSnapshot(` Array [ - "Failed to migrate user action connector with doc id: 1 version: 8.0.0 error: Unexpected token a in JSON at position 1", + "Failed to migrate user action connector with doc id: 1 version: 8.0.0 error: Expected property name or '}' in JSON at position 1", Object { "migrations": Object { "userAction": Object { @@ -448,7 +448,7 @@ describe('user action migrations', () => { const log = context.log as jest.Mocked; expect(log.error.mock.calls[0]).toMatchInlineSnapshot(` Array [ - "Failed to migrate user action connector with doc id: 1 version: 8.0.0 error: Unexpected token b in JSON at position 1", + "Failed to migrate user action connector with doc id: 1 version: 8.0.0 error: Expected property name or '}' in JSON at position 1", Object { "migrations": Object { "userAction": Object { @@ -644,7 +644,7 @@ describe('user action migrations', () => { const log = context.log as jest.Mocked; expect(log.error.mock.calls[0]).toMatchInlineSnapshot(` Array [ - "Failed to migrate user action connector with doc id: 1 version: 8.0.0 error: Unexpected token e in JSON at position 1", + "Failed to migrate user action connector with doc id: 1 version: 8.0.0 error: Unexpected token 'e', \\"new json value\\" is not valid JSON", Object { "migrations": Object { "userAction": Object { diff --git a/x-pack/plugins/cloud_security_posture/public/common/api/use_latest_findings_data_view.ts b/x-pack/plugins/cloud_security_posture/public/common/api/use_latest_findings_data_view.ts index 86b9692cbfc43..c8e98703cdbf0 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/api/use_latest_findings_data_view.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/api/use_latest_findings_data_view.ts @@ -62,15 +62,19 @@ export const useLatestFindingsDataView = (dataView: string) => { } if (dataView === LATEST_FINDINGS_INDEX_PATTERN) { + let shouldUpdate = false; Object.entries(cloudSecurityFieldLabels).forEach(([field, label]) => { if ( !dataViewObj.getFieldAttrs()[field]?.customLabel || dataViewObj.getFieldAttrs()[field]?.customLabel === field ) { dataViewObj.setFieldCustomLabel(field, label); + shouldUpdate = true; } }); - await dataViews.updateSavedObject(dataViewObj); + if (shouldUpdate) { + await dataViews.updateSavedObject(dataViewObj); + } } return dataViewObj; diff --git a/x-pack/plugins/cloud_security_posture/public/common/constants.ts b/x-pack/plugins/cloud_security_posture/public/common/constants.ts index 404ea0f036017..833f941c95292 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/constants.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/constants.ts @@ -49,6 +49,8 @@ export const LOCAL_STORAGE_DASHBOARD_BENCHMARK_SORT_KEY = 'cloudPosture:complianceDashboard:benchmarkSort'; export const LOCAL_STORAGE_FINDINGS_LAST_SELECTED_TAB_KEY = 'cloudPosture:findings:lastSelectedTab'; +export const SESSION_STORAGE_FIELDS_MODAL_SHOW_SELECTED = 'cloudPosture:fieldsModal:showSelected'; + export type CloudPostureIntegrations = Record< CloudSecurityPolicyTemplate, CloudPostureIntegrationProps diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_table/use_cloud_posture_table.ts b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_table/use_cloud_posture_table.ts index 0becb56e6ec22..d06e29a95e46d 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_table/use_cloud_posture_table.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_table/use_cloud_posture_table.ts @@ -40,9 +40,9 @@ export interface CloudPostureTableResult { getRowsFromPages: (data: Array<{ page: DataTableRecord[] }> | undefined) => DataTableRecord[]; } -/* - Hook for managing common table state and methods for Cloud Posture -*/ +/** + * @deprecated will be replaced by useCloudPostureDataTable + */ export const useCloudPostureTable = ({ defaultQuery = getDefaultQuery, dataView, diff --git a/x-pack/plugins/cloud_security_posture/public/common/types.ts b/x-pack/plugins/cloud_security_posture/public/common/types.ts index a4c26643293fd..ac483445407e4 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/types.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/types.ts @@ -22,6 +22,8 @@ export interface FindingsBaseURLQuery { export interface FindingsBaseProps { dataView: DataView; + dataViewRefetch?: () => void; + dataViewIsRefetching?: boolean; } export interface FindingsBaseESQueryConfig { diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/additional_controls.tsx b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/additional_controls.tsx index ff411d2dcd9e0..ea9b276339f6a 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/additional_controls.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/additional_controls.tsx @@ -4,13 +4,14 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { useState } from 'react'; -import { i18n } from '@kbn/i18n'; +import React from 'react'; import { EuiButtonEmpty, EuiFlexItem } from '@elastic/eui'; import { type DataView } from '@kbn/data-views-plugin/common'; -import { FieldsSelectorModal } from './fields_selector'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { FieldsSelectorModal, useFieldsModal } from './fields_selector'; import { useStyles } from './use_styles'; import { getAbbreviatedNumber } from '../../common/utils/get_abbreviated_number'; +import { CSP_FIELDS_SELECTOR_OPEN_BUTTON } from '../test_subjects'; const GroupSelectorWrapper: React.FC = ({ children }) => { const styles = useStyles(); @@ -30,6 +31,7 @@ export const AdditionalControls = ({ onAddColumn, onRemoveColumn, groupSelectorComponent, + onResetColumns, }: { total: number; title: string; @@ -38,11 +40,10 @@ export const AdditionalControls = ({ onAddColumn: (column: string) => void; onRemoveColumn: (column: string) => void; groupSelectorComponent?: JSX.Element; + onResetColumns: () => void; }) => { - const [isFieldSelectorModalVisible, setIsFieldSelectorModalVisible] = useState(false); - - const closeModal = () => setIsFieldSelectorModalVisible(false); - const showModal = () => setIsFieldSelectorModalVisible(true); + const { isFieldSelectorModalVisible, closeFieldsSelectorModal, openFieldsSelectorModal } = + useFieldsModal(); return ( <> @@ -50,9 +51,10 @@ export const AdditionalControls = ({ )} @@ -62,13 +64,12 @@ export const AdditionalControls = ({ - {i18n.translate('xpack.csp.dataTable.fields', { - defaultMessage: 'Fields', - })} + {groupSelectorComponent && ( diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx new file mode 100644 index 0000000000000..7ddbe28a7da07 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx @@ -0,0 +1,102 @@ +/* + * 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 { render } from '@testing-library/react'; +import React from 'react'; +import { TestProvider } from '../../test/test_provider'; +import { CloudSecurityDataTable, CloudSecurityDataTableProps } from './cloud_security_data_table'; + +const mockDataView = { + fields: { + getAll: () => [ + { id: 'field1', name: 'field1', customLabel: 'Label 1', visualizable: true }, + { id: 'field2', name: 'field2', customLabel: 'Label 2', visualizable: true }, + ], + getByName: (name: string) => ({ id: name }), + }, + getFieldByName: (name: string) => ({ id: name }), + getFormatterForField: (name: string) => ({ + convert: (value: string) => value, + }), +} as any; + +const mockDefaultColumns = [{ id: 'field1' }, { id: 'field2' }]; + +const mockCloudPostureDataTable = { + setUrlQuery: jest.fn(), + columnsLocalStorageKey: 'test', + filters: [], + onSort: jest.fn(), + sort: [], + query: {}, + queryError: undefined, + pageIndex: 0, + urlQuery: {}, + setTableOptions: jest.fn(), + handleUpdateQuery: jest.fn(), + pageSize: 10, + setPageSize: jest.fn(), + onChangeItemsPerPage: jest.fn(), + onChangePage: jest.fn(), + onResetFilters: jest.fn(), + getRowsFromPages: jest.fn(), +} as any; + +const renderDataTable = (props: Partial = {}) => { + const defaultProps: CloudSecurityDataTableProps = { + dataView: mockDataView, + isLoading: false, + defaultColumns: mockDefaultColumns, + rows: [], + total: 0, + flyoutComponent: () => <>, + cloudPostureDataTable: mockCloudPostureDataTable, + loadMore: jest.fn(), + title: 'Test Table', + }; + + return render( + + + + ); +}; + +describe('CloudSecurityDataTable', () => { + it('renders loading state', () => { + const { getByTestId } = renderDataTable({ isLoading: true }); + expect(getByTestId('unifiedDataTableLoading')).toBeInTheDocument(); + }); + + it('renders empty state when no rows are present', () => { + const { getByTestId } = renderDataTable(); + expect(getByTestId('csp:empty-state')).toBeInTheDocument(); + }); + + it('renders data table with rows', async () => { + const mockRows = [ + { + id: '1', + raw: { + field1: 'Label 1', + field2: 'Label 2', + }, + flattened: { + field1: 'Label 1', + field2: 'Label 2', + }, + }, + ] as any; + const { getByTestId, getByText } = renderDataTable({ + rows: mockRows, + total: mockRows.length, + }); + + expect(getByTestId('discoverDocTable')).toBeInTheDocument(); + expect(getByText('Label 1')).toBeInTheDocument(); + expect(getByText('Label 2')).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.tsx b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.tsx index 50e81a0a0c7ec..3f0c3da73a986 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.tsx @@ -17,7 +17,7 @@ import { generateFilters } from '@kbn/data-plugin/public'; import { DocViewFilterFn } from '@kbn/unified-doc-viewer/types'; import useLocalStorage from 'react-use/lib/useLocalStorage'; import { useKibana } from '../../common/hooks/use_kibana'; -import { CloudPostureTableResult } from '../../common/hooks/use_cloud_posture_table'; +import { CloudPostureDataTableResult } from '../../common/hooks/use_cloud_posture_data_table'; import { EmptyState } from '../empty_state'; import { MAX_FINDINGS_TO_LOAD } from '../../common/constants'; import { useStyles } from './use_styles'; @@ -40,7 +40,7 @@ const useNewFieldsApi = true; // Hide Checkbox, enable open details Flyout const controlColumnIds = ['openDetails']; -interface CloudSecurityDataGridProps { +export interface CloudSecurityDataTableProps { dataView: DataView; isLoading: boolean; defaultColumns: CloudSecurityDefaultColumn[]; @@ -52,10 +52,10 @@ interface CloudSecurityDataGridProps { */ flyoutComponent: (hit: DataTableRecord, onCloseFlyout: () => void) => JSX.Element; /** - * This is the object that contains all the data and functions from the useCloudPostureTable hook. + * This is the object that contains all the data and functions from the useCloudPostureDataTable hook. * This is also used to manage the table state from the parent component. */ - cloudPostureTable: CloudPostureTableResult; + cloudPostureDataTable: CloudPostureDataTableResult; title: string; /** * This is a function that returns a map of column ids to custom cell renderers. @@ -78,6 +78,16 @@ interface CloudSecurityDataGridProps { * Height override for the data grid. */ height?: number; + /** + * Callback Function when the DataView field is edited. + * Required to enable editing of the field in the data grid. + */ + dataViewRefetch?: () => void; + /** + * Flag to indicate if the data view is refetching. + * Required for smoothing re-rendering the DataTable columns. + */ + dataViewIsRefetching?: boolean; } export const CloudSecurityDataTable = ({ @@ -87,14 +97,16 @@ export const CloudSecurityDataTable = ({ rows, total, flyoutComponent, - cloudPostureTable, + cloudPostureDataTable, loadMore, title, customCellRenderer, groupSelectorComponent, height, + dataViewRefetch, + dataViewIsRefetching, ...rest -}: CloudSecurityDataGridProps) => { +}: CloudSecurityDataTableProps) => { const { columnsLocalStorageKey, pageSize, @@ -104,7 +116,7 @@ export const CloudSecurityDataTable = ({ onResetFilters, filters, sort, - } = cloudPostureTable; + } = cloudPostureDataTable; const [columns, setColumns] = useLocalStorage( columnsLocalStorageKey, @@ -208,6 +220,10 @@ export const CloudSecurityDataTable = ({ return customCellRenderer(rows); }, [customCellRenderer, rows]); + const onResetColumns = () => { + setColumns(defaultColumns.map((c) => c.id)); + }; + if (!isLoading && !rows.length) { return ; } @@ -221,6 +237,7 @@ export const CloudSecurityDataTable = ({ onAddColumn={onAddColumn} onRemoveColumn={onRemoveColumn} groupSelectorComponent={groupSelectorComponent} + onResetColumns={onResetColumns} /> ); @@ -237,6 +254,9 @@ export const CloudSecurityDataTable = ({ opacity: isLoading ? 1 : 0, }; + const loadingState = + isLoading || dataViewIsRefetching ? DataLoadingState.loading : DataLoadingState.loaded; + return (
diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector.test.tsx b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector.test.tsx deleted file mode 100644 index 85d00612651eb..0000000000000 --- a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector.test.tsx +++ /dev/null @@ -1,69 +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 from 'react'; -import { render, fireEvent } from '@testing-library/react'; -import { FieldsSelectorTable, FieldsSelectorCommonProps } from './fields_selector'; -import { TestProvider } from '../../test/test_provider'; - -const mockDataView = { - fields: { - getAll: () => [ - { id: 'field1', name: 'field1', customLabel: 'Label 1', visualizable: true }, - { id: 'field2', name: 'field2', customLabel: 'Label 2', visualizable: true }, - ], - }, -} as any; - -const renderFieldsTable = (props: Partial = {}) => { - const defaultProps: FieldsSelectorCommonProps = { - dataView: mockDataView, - columns: [], - onAddColumn: jest.fn(), - onRemoveColumn: jest.fn(), - }; - - return render( - - - - ); -}; - -describe('FieldsSelectorTable', () => { - it('renders the table with data correctly', () => { - const { getByText } = renderFieldsTable(); - - expect(getByText('Label 1')).toBeInTheDocument(); - expect(getByText('Label 2')).toBeInTheDocument(); - }); - - it('calls onAddColumn when a checkbox is checked', () => { - const onAddColumn = jest.fn(); - const { getAllByRole } = renderFieldsTable({ - onAddColumn, - }); - - const checkbox = getAllByRole('checkbox')[0]; - fireEvent.click(checkbox); - - expect(onAddColumn).toHaveBeenCalledWith('field1'); - }); - - it('calls onRemoveColumn when a checkbox is unchecked', () => { - const onRemoveColumn = jest.fn(); - const { getAllByRole } = renderFieldsTable({ - columns: ['field1', 'field2'], - onRemoveColumn, - }); - - const checkbox = getAllByRole('checkbox')[1]; - fireEvent.click(checkbox); - - expect(onRemoveColumn).toHaveBeenCalledWith('field2'); - }); -}); diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_modal.tsx b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_modal.tsx new file mode 100644 index 0000000000000..862fe219afa14 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_modal.tsx @@ -0,0 +1,91 @@ +/* + * 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, { useCallback } from 'react'; +import { + EuiButton, + EuiButtonEmpty, + EuiModal, + EuiModalBody, + EuiModalFooter, + EuiModalHeader, + EuiModalHeaderTitle, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { type DataView } from '@kbn/data-views-plugin/common'; +import useSessionStorage from 'react-use/lib/useSessionStorage'; +import { SESSION_STORAGE_FIELDS_MODAL_SHOW_SELECTED } from '../../../common/constants'; +import { FieldsSelectorTable } from './fields_selector_table'; +import { + CSP_FIELDS_SELECTOR_CLOSE_BUTTON, + CSP_FIELDS_SELECTOR_MODAL, + CSP_FIELDS_SELECTOR_RESET_BUTTON, +} from '../../test_subjects'; + +interface FieldsSelectorModalProps { + dataView: DataView; + columns: string[]; + onAddColumn: (column: string) => void; + onRemoveColumn: (column: string) => void; + closeModal: () => void; + onResetColumns: () => void; +} + +const title = i18n.translate('xpack.csp.dataTable.fieldsModalTitle', { + defaultMessage: 'Fields', +}); + +export const FieldsSelectorModal = ({ + closeModal, + dataView, + columns, + onAddColumn, + onRemoveColumn, + onResetColumns, +}: FieldsSelectorModalProps) => { + const [isFilterSelectedEnabled, setIsFilterSelectedEnabled] = useSessionStorage( + SESSION_STORAGE_FIELDS_MODAL_SHOW_SELECTED, + false + ); + + const onFilterSelectedChange = useCallback( + (enabled: boolean) => { + setIsFilterSelectedEnabled(enabled); + }, + [setIsFilterSelectedEnabled] + ); + + return ( + + + {title} + + + + + + + + + + + + + + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx new file mode 100644 index 0000000000000..58caad6e26f82 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.test.tsx @@ -0,0 +1,126 @@ +/* + * 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 { render, fireEvent } from '@testing-library/react'; +import { waitForEuiPopoverOpen } from '@elastic/eui/lib/test/rtl'; +import { TestProvider } from '../../../test/test_provider'; +import { FieldsSelectorTable, FieldsSelectorTableProps } from './fields_selector_table'; + +const mockDataView = { + fields: { + getAll: () => [ + { id: 'field1', name: 'field1', customLabel: 'Label 1', visualizable: true }, + { id: 'field2', name: 'field2', customLabel: 'Label 2', visualizable: true }, + ], + }, +} as any; + +const mockOnFilterSelectedChange = jest.fn(); + +const renderFieldsTable = (props: Partial = {}) => { + const defaultProps: FieldsSelectorTableProps = { + dataView: mockDataView, + columns: [], + onAddColumn: jest.fn(), + onRemoveColumn: jest.fn(), + title: 'title', + onFilterSelectedChange: mockOnFilterSelectedChange, + isFilterSelectedEnabled: false, + }; + + return render( + + + + ); +}; + +describe('FieldsSelectorTable', () => { + it('renders the table with data correctly', () => { + const { getByText } = renderFieldsTable(); + + expect(getByText('Label 1')).toBeInTheDocument(); + expect(getByText('Label 2')).toBeInTheDocument(); + }); + + it('calls onAddColumn when a checkbox is checked', () => { + const onAddColumn = jest.fn(); + const { getAllByRole } = renderFieldsTable({ + onAddColumn, + }); + + const checkbox = getAllByRole('checkbox')[0]; + fireEvent.click(checkbox); + + expect(onAddColumn).toHaveBeenCalledWith('field1'); + }); + + it('calls onRemoveColumn when a checkbox is unchecked', () => { + const onRemoveColumn = jest.fn(); + const { getAllByRole } = renderFieldsTable({ + columns: ['field1', 'field2'], + onRemoveColumn, + }); + + const checkbox = getAllByRole('checkbox')[1]; + fireEvent.click(checkbox); + + expect(onRemoveColumn).toHaveBeenCalledWith('field2'); + }); + + describe('View selected', () => { + beforeEach(() => { + mockOnFilterSelectedChange.mockClear(); + }); + + it('should render "view all" option when filterSelected is not enabled', () => { + const { getByTestId } = renderFieldsTable({ isFilterSelectedEnabled: false }); + + expect(getByTestId('viewSelectorButton').textContent).toBe('View: all'); + }); + + it('should render "view selected" option when filterSelected is not enabled', () => { + const { getByTestId } = renderFieldsTable({ isFilterSelectedEnabled: true }); + + expect(getByTestId('viewSelectorButton').textContent).toBe('View: selected'); + }); + + it('should open the view selector with button click', async () => { + const { queryByTestId, getByTestId } = renderFieldsTable(); + + expect(queryByTestId('viewSelectorMenu')).not.toBeInTheDocument(); + expect(queryByTestId('viewSelectorOption-all')).not.toBeInTheDocument(); + expect(queryByTestId('viewSelectorOption-selected')).not.toBeInTheDocument(); + + getByTestId('viewSelectorButton').click(); + await waitForEuiPopoverOpen(); + + expect(getByTestId('viewSelectorMenu')).toBeInTheDocument(); + expect(getByTestId('viewSelectorOption-all')).toBeInTheDocument(); + expect(getByTestId('viewSelectorOption-selected')).toBeInTheDocument(); + }); + + it('should callback when "view all" option is clicked', async () => { + const { getByTestId } = renderFieldsTable({ isFilterSelectedEnabled: false }); + + getByTestId('viewSelectorButton').click(); + await waitForEuiPopoverOpen(); + getByTestId('viewSelectorOption-all').click(); + expect(mockOnFilterSelectedChange).toHaveBeenCalledWith(false); + }); + + it('should callback when "view selected" option is clicked', async () => { + const { getByTestId } = renderFieldsTable({ isFilterSelectedEnabled: false }); + + getByTestId('viewSelectorButton').click(); + await waitForEuiPopoverOpen(); + getByTestId('viewSelectorOption-selected').click(); + expect(mockOnFilterSelectedChange).toHaveBeenCalledWith(true); + }); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector.tsx b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.tsx similarity index 55% rename from x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector.tsx rename to x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.tsx index 750e2eb8d8448..bae971749bc78 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/fields_selector_table.tsx @@ -4,25 +4,33 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { useState, useMemo } from 'react'; + import { EuiBasicTableColumn, - EuiButton, + EuiButtonEmpty, EuiCheckbox, + EuiContextMenuItem, + EuiContextMenuPanel, EuiFlexGroup, EuiFlexItem, + EuiHorizontalRule, EuiInMemoryTable, - EuiModal, - EuiModalBody, - EuiModalFooter, - EuiModalHeader, - EuiModalHeaderTitle, + EuiPopover, EuiSearchBarProps, EuiText, } from '@elastic/eui'; +import { DataView } from '@kbn/data-views-plugin/common'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { type DataView } from '@kbn/data-views-plugin/common'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; + +const ACTION_COLUMN_WIDTH = '24px'; +const defaultSorting = { + sort: { + field: 'name', + direction: 'asc', + }, +} as const; interface Field { id: string; @@ -30,30 +38,37 @@ interface Field { displayName: string; } -export interface FieldsSelectorCommonProps { +const VIEW_LABEL = i18n.translate('xpack.csp.dataTable.fieldsModal.viewLabel', { + defaultMessage: 'View', +}); + +const VIEW_VALUE_SELECTED = i18n.translate('xpack.csp.dataTable.fieldsModal.viewSelected', { + defaultMessage: 'selected', +}); + +const VIEW_VALUE_ALL = i18n.translate('xpack.csp.dataTable.fieldsModal.viewAll', { + defaultMessage: 'all', +}); + +export interface FieldsSelectorTableProps { dataView: DataView; columns: string[]; onAddColumn: (column: string) => void; onRemoveColumn: (column: string) => void; + title: string; + onFilterSelectedChange: (enabled: boolean) => void; + isFilterSelectedEnabled: boolean; } -const ACTION_COLUMN_WIDTH = '24px'; -const defaultSorting = { - sort: { - field: 'name', - direction: 'asc', - }, -} as const; - export const FieldsSelectorTable = ({ title, dataView, columns, onAddColumn, onRemoveColumn, -}: FieldsSelectorCommonProps & { - title: string; -}) => { + isFilterSelectedEnabled, + onFilterSelectedChange, +}: FieldsSelectorTableProps) => { const dataViewFields = useMemo(() => { return dataView.fields .getAll() @@ -69,6 +84,25 @@ export const FieldsSelectorTable = ({ const [fields, setFields] = useState(dataViewFields); + useEffect(() => { + if (isFilterSelectedEnabled) { + const filteredItems = dataViewFields.filter((field) => { + return columns.includes(field.id); + }); + setFields(filteredItems); + } else { + setFields(dataViewFields); + } + }, [columns, dataViewFields, isFilterSelectedEnabled]); + + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + + const togglePopover = useCallback(() => { + setIsPopoverOpen((open) => !open); + }, []); + const closePopover = useCallback(() => { + setIsPopoverOpen(false); + }, []); let debounceTimeoutId: ReturnType; const onQueryChange: EuiSearchBarProps['onChange'] = ({ query }) => { @@ -85,8 +119,6 @@ export const FieldsSelectorTable = ({ }, 300); }; - const [fieldsSelected, setFieldsSelected] = useState(columns); - const tableColumns: Array> = [ { field: 'action', @@ -96,13 +128,11 @@ export const FieldsSelectorTable = ({ render: (_, { id }: Field) => { return ( { const isChecked = e.target.checked; - setFieldsSelected( - isChecked ? [...fieldsSelected, id] : fieldsSelected.filter((f) => f !== id) - ); return isChecked ? onAddColumn(id) : onRemoveColumn(id); }} /> @@ -164,9 +194,65 @@ export const FieldsSelectorTable = ({ />
+ + + {`${VIEW_LABEL}: ${isFilterSelectedEnabled ? VIEW_VALUE_SELECTED : VIEW_VALUE_ALL}`} + + } + > + { + onFilterSelectedChange(false); + closePopover(); + }} + > + {`${VIEW_LABEL} ${VIEW_VALUE_ALL}`} + , + , + { + onFilterSelectedChange(true); + closePopover(); + }} + > + {`${VIEW_LABEL} ${VIEW_VALUE_SELECTED}`} + , + ]} + /> + +
); - }, [fields.length]); + }, [ + closePopover, + fields.length, + isFilterSelectedEnabled, + isPopoverOpen, + onFilterSelectedChange, + togglePopover, + ]); return ( ); }; - -export const FieldsSelectorModal = ({ - closeModal, - dataView, - columns, - onAddColumn, - onRemoveColumn, -}: FieldsSelectorCommonProps & { - closeModal: () => void; -}) => { - const title = i18n.translate('xpack.csp.dataTable.fieldsModalTitle', { - defaultMessage: 'Fields', - }); - - return ( - - - {title} - - - - - - - Close - - - - ); -}; diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/index.ts b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/index.ts new file mode 100644 index 0000000000000..d097d5098a73c --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/index.ts @@ -0,0 +1,10 @@ +/* + * 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 { FieldsSelectorModal } from './fields_selector_modal'; +export { FieldsSelectorTable } from './fields_selector_table'; +export { useFieldsModal } from './use_fields_modal'; diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/use_fields_modal.ts b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/use_fields_modal.ts new file mode 100644 index 0000000000000..9ca88d3d97b76 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/fields_selector/use_fields_modal.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 { useState } from 'react'; + +export const useFieldsModal = () => { + const [isFieldSelectorModalVisible, setIsFieldSelectorModalVisible] = useState(false); + + const closeFieldsSelectorModal = () => setIsFieldSelectorModalVisible(false); + const openFieldsSelectorModal = () => setIsFieldSelectorModalVisible(true); + + return { + isFieldSelectorModalVisible, + closeFieldsSelectorModal, + openFieldsSelectorModal, + }; +}; diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/use_styles.ts b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/use_styles.ts index a2b923bf26b5b..7823698ebd5c8 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/use_styles.ts +++ b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/use_styles.ts @@ -70,6 +70,9 @@ export const useStyles = () => { & .unifiedDataTable__cellValue { font-family: ${euiTheme.font.family}; } + & .unifiedDataTable__inner .euiDataGrid__controls { + border-top: none; + } `; const groupBySelector = css` diff --git a/x-pack/plugins/cloud_security_posture/public/components/test_subjects.ts b/x-pack/plugins/cloud_security_posture/public/components/test_subjects.ts index c51d562fec44a..250b5d01c82ce 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/test_subjects.ts +++ b/x-pack/plugins/cloud_security_posture/public/components/test_subjects.ts @@ -44,6 +44,11 @@ export const CSP_GROUPING = 'cloudSecurityGrouping'; export const CSP_GROUPING_LOADING = 'cloudSecurityGroupingLoading'; export const CSP_FINDINGS_COMPLIANCE_SCORE = 'cloudSecurityFindingsComplianceScore'; +export const CSP_FIELDS_SELECTOR_MODAL = 'cloudSecurityFieldsSelectorModal'; +export const CSP_FIELDS_SELECTOR_OPEN_BUTTON = 'cloudSecurityFieldsSelectorOpenButton'; +export const CSP_FIELDS_SELECTOR_RESET_BUTTON = 'cloudSecurityFieldsSelectorResetButton'; +export const CSP_FIELDS_SELECTOR_CLOSE_BUTTON = 'cloudSecurityFieldsSelectorCloseButton'; + export const AWS_CREDENTIALS_TYPE_SELECTOR_TEST_SUBJ = 'aws-credentials-type-selector'; export const AWS_CREDENTIALS_TYPE_OPTIONS_TEST_SUBJ = { CLOUDFORMATION: 'aws-cloudformation-setup-option', diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx b/x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx index d1b35ab617a96..7b7bd42561204 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx @@ -26,7 +26,6 @@ import { render } from '@testing-library/react'; import { expectIdsInDoc } from '../../test/utils'; import { PACKAGE_NOT_INSTALLED_TEST_SUBJECT } from '../../components/cloud_posture_page'; import { useLicenseManagementLocatorApi } from '../../common/api/use_license_management_locator_api'; -import { useCloudPostureTable } from '../../common/hooks/use_cloud_posture_table'; jest.mock('../../common/api/use_latest_findings_data_view'); jest.mock('../../common/api/use_setup_status_api'); @@ -34,7 +33,6 @@ jest.mock('../../common/api/use_license_management_locator_api'); jest.mock('../../common/hooks/use_subscription_status'); jest.mock('../../common/navigation/use_navigate_to_cis_integration_policies'); jest.mock('../../common/navigation/use_csp_integration_link'); -jest.mock('../../common/hooks/use_cloud_posture_table'); const chance = new Chance(); @@ -54,13 +52,6 @@ beforeEach(() => { data: true, }) ); - - (useCloudPostureTable as jest.Mock).mockImplementation(() => ({ - getRowsFromPages: jest.fn(), - columnsLocalStorageKey: 'test', - filters: [], - sort: [], - })); }); const renderFindingsPage = () => { diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.tsx b/x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.tsx index 9e87d1d8eda6d..7e8bbfeedb832 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.tsx @@ -50,7 +50,11 @@ export const Configurations = () => { path={findingsNavigation.findings_default.path} render={() => ( - + )} /> diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_container.tsx b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_container.tsx index 9d536f0f0b180..e070847b6df55 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_container.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_container.tsx @@ -18,7 +18,11 @@ import { groupPanelRenderer, groupStatsRenderer } from './latest_findings_group_ import { FindingsDistributionBar } from '../layout/findings_distribution_bar'; import { ErrorCallout } from '../layout/error_callout'; -export const LatestFindingsContainer = ({ dataView }: FindingsBaseProps) => { +export const LatestFindingsContainer = ({ + dataView, + dataViewRefetch, + dataViewIsRefetching, +}: FindingsBaseProps) => { const renderChildComponent = useCallback( (groupFilters: Filter[]) => { return ( @@ -27,10 +31,12 @@ export const LatestFindingsContainer = ({ dataView }: FindingsBaseProps) => { nonPersistedFilters={groupFilters} height={DEFAULT_TABLE_HEIGHT} showDistributionBar={false} + dataViewRefetch={dataViewRefetch} + dataViewIsRefetching={dataViewIsRefetching} /> ); }, - [dataView] + [dataView, dataViewIsRefetching, dataViewRefetch] ); const { @@ -94,7 +100,12 @@ export const LatestFindingsContainer = ({ dataView }: FindingsBaseProps) => { return ( <> - + ); }; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_table.tsx b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_table.tsx index be6d34a1df933..3adb10259871d 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_table.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_table.tsx @@ -27,6 +27,8 @@ type LatestFindingsTableProps = FindingsBaseProps & { height?: number; showDistributionBar?: boolean; nonPersistedFilters?: Filter[]; + dataViewRefetch?: () => void; + dataViewIsRefetching?: boolean; }; /** @@ -87,9 +89,11 @@ export const LatestFindingsTable = ({ height, showDistributionBar = true, nonPersistedFilters, + dataViewRefetch, + dataViewIsRefetching, }: LatestFindingsTableProps) => { const { - cloudPostureTable, + cloudPostureDataTable, rows, error, isFetching, @@ -134,12 +138,14 @@ export const LatestFindingsTable = ({ rows={rows} total={total} flyoutComponent={flyoutComponent} - cloudPostureTable={cloudPostureTable} + cloudPostureDataTable={cloudPostureDataTable} loadMore={fetchNextPage} title={title} customCellRenderer={customCellRenderer} groupSelectorComponent={groupSelectorComponent} height={height} + dataViewRefetch={dataViewRefetch} + dataViewIsRefetching={dataViewIsRefetching} /> )} diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_table.tsx b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_table.tsx index 50ebb01f363f0..b60eefac2ac81 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_table.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_table.tsx @@ -28,7 +28,7 @@ export const useLatestFindingsTable = ({ nonPersistedFilters?: Filter[]; showDistributionBar?: boolean; }) => { - const cloudPostureTable = useCloudPostureDataTable({ + const cloudPostureDataTable = useCloudPostureDataTable({ dataView, paginationLocalStorageKey: LOCAL_STORAGE_DATA_TABLE_PAGE_SIZE_KEY, columnsLocalStorageKey, @@ -36,7 +36,7 @@ export const useLatestFindingsTable = ({ nonPersistedFilters, }); - const { query, sort, queryError, setUrlQuery, filters, getRowsFromPages } = cloudPostureTable; + const { query, sort, queryError, setUrlQuery, filters, getRowsFromPages } = cloudPostureDataTable; const { data, @@ -72,7 +72,7 @@ export const useLatestFindingsTable = ({ const canShowDistributionBar = showDistributionBar && total > 0; return { - cloudPostureTable, + cloudPostureDataTable, rows, error, isFetching, diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/document_creation_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/document_creation_logic.test.ts index 3e39c50ff8de7..925f5af35ff48 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/document_creation_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/document_creation_logic.test.ts @@ -404,7 +404,7 @@ describe('DocumentCreationLogic', () => { DocumentCreationLogic.actions.onSubmitJson(); expect(DocumentCreationLogic.actions.setErrors).toHaveBeenCalledWith([ - 'Unexpected token i in JSON at position 0', + `Unexpected token 'i', "invalid JSON" is not valid JSON`, ]); expect(DocumentCreationLogic.actions.uploadDocuments).not.toHaveBeenCalled(); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts index 1da16c533a337..de7cd30a343ec 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts @@ -85,6 +85,13 @@ export const CONNECTORS_DICT: Record = { icon: CONNECTOR_ICONS.jira_cloud, platinumOnly: true, }, + microsoft_teams: { + docsUrl: docLinks.connectorsTeams, + externalAuthDocsUrl: '', + externalDocsUrl: '', + icon: CONNECTOR_ICONS.teams, + platinumOnly: true, + }, mongodb: { docsUrl: docLinks.connectorsMongoDB, externalAuthDocsUrl: 'https://www.mongodb.com/docs/atlas/app-services/authentication/', @@ -182,13 +189,6 @@ export const CONNECTORS_DICT: Record = { icon: CONNECTOR_ICONS.slack, platinumOnly: true, }, - teams: { - docsUrl: docLinks.connectorsTeams, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.teams, - platinumOnly: true, - }, zoom: { docsUrl: docLinks.connectorsZoom, externalAuthDocsUrl: '', diff --git a/x-pack/plugins/fleet/common/types/models/agent.ts b/x-pack/plugins/fleet/common/types/models/agent.ts index 1242a61124952..47d9c424ef0e0 100644 --- a/x-pack/plugins/fleet/common/types/models/agent.ts +++ b/x-pack/plugins/fleet/common/types/models/agent.ts @@ -449,5 +449,7 @@ export interface AgentUpgradeDetails { download_rate?: number; // bytes per second failed_state?: AgentUpgradeStateType; error_msg?: string; + retry_error_msg?: string; + retry_until?: string; }; } diff --git a/x-pack/plugins/fleet/common/types/models/epm.ts b/x-pack/plugins/fleet/common/types/models/epm.ts index 1a7c4cefca34d..b1bea249ee9de 100644 --- a/x-pack/plugins/fleet/common/types/models/epm.ts +++ b/x-pack/plugins/fleet/common/types/models/epm.ts @@ -125,6 +125,14 @@ export type DataType = typeof dataTypes; export type MonitoringType = typeof monitoringTypes; export type InstallablePackage = RegistryPackage | ArchivePackage; +export type AssetsMap = Map; + +export interface PackageInstallContext { + packageInfo: InstallablePackage; + assetsMap: AssetsMap; + paths: string[]; +} + export type ArchivePackage = PackageSpecManifest & // should an uploaded package be able to specify `internal`? Pick; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx index f27d428bd42cc..45d5ead9909ee 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx @@ -23,7 +23,11 @@ import { FormattedMessage, FormattedRelative } from '@kbn/i18n-react'; import type { Agent, AgentPolicy } from '../../../../../types'; import { useAgentVersion } from '../../../../../hooks'; -import { ExperimentalFeaturesService, isAgentUpgradeable } from '../../../../../services'; +import { + ExperimentalFeaturesService, + isAgentUpgradeable, + getNotUpgradeableMessage, +} from '../../../../../services'; import { AgentPolicySummaryLine } from '../../../../../components'; import { AgentHealth } from '../../../components'; import { Tags } from '../../../components/tags'; @@ -186,6 +190,7 @@ export const AgentDetailsOverviewSection: React.FunctionComponent<{ agentUpgradeStartedAt={agent.upgrade_started_at} agentUpgradedAt={agent.upgraded_at} agentUpgradeDetails={agent.upgrade_details} + notUpgradeableMessage={getNotUpgradeableMessage(agent, latestAgentVersion)} /> diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.test.tsx index a5f3498fd0b59..1155176bf7915 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.test.tsx @@ -7,6 +7,7 @@ import { fireEvent, waitFor } from '@testing-library/react'; import React from 'react'; +import moment from 'moment'; import { createFleetTestRendererMock } from '../../../../../../mock'; @@ -176,6 +177,69 @@ describe('AgentUpgradeStatus', () => { await expectTooltip(results, 'Downloading the new agent artifact version (16.4%).'); }); + it('should render UPG_DOWNLOADING with a warning if agent has a retry_message and retry_until', async () => { + const results = render({ + agentUpgradeDetails: { + target_version: 'XXX', + action_id: 'xxx', + state: 'UPG_DOWNLOADING', + metadata: { + download_percent: 16.4, + retry_error_msg: 'unable to download', + retry_until: `${moment().add(10, 'minutes').toISOString()}`, + }, + }, + }); + + expectUpgradeStatusBadgeLabel(results, 'Upgrade downloading'); + fireEvent.mouseOver(results.getByText('Info')); + await waitFor(() => { + const tooltip = results.getByRole('tooltip'); + expect(tooltip).toHaveTextContent('Upgrade failing: unable to download. Retrying until:'); + expect(tooltip).toHaveTextContent('(00:09 remaining)'); + }); + }); + + it('should not render retry_until if the remaining time is negative', async () => { + const results = render({ + agentUpgradeDetails: { + target_version: 'XXX', + action_id: 'xxx', + state: 'UPG_DOWNLOADING', + metadata: { + download_percent: 16.4, + retry_error_msg: 'unable to download', + retry_until: `${moment().subtract(10, 'minutes').toISOString()}`, + }, + }, + }); + + expectUpgradeStatusBadgeLabel(results, 'Upgrade downloading'); + fireEvent.mouseOver(results.getByText('Info')); + await waitFor(() => { + const tooltip = results.getByRole('tooltip'); + expect(tooltip).toHaveTextContent('Upgrade failing: unable to download.'); + expect(tooltip).not.toHaveTextContent('remaining'); + }); + }); + + it('should render UPG_DOWNLOADING with a warning if agent has a retry_message', async () => { + const results = render({ + agentUpgradeDetails: { + target_version: 'XXX', + action_id: 'xxx', + state: 'UPG_DOWNLOADING', + metadata: { + download_percent: 16.4, + retry_error_msg: 'unable to download', + }, + }, + }); + + expectUpgradeStatusBadgeLabel(results, 'Upgrade downloading'); + await expectTooltip(results, 'Upgrade failing: unable to download.'); + }); + it('should render UPG_EXTRACTING state correctly', async () => { const results = render({ agentUpgradeDetails: { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.tsx index e5cf2eb7913c6..cf3ad42292533 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.tsx @@ -8,6 +8,7 @@ import React, { useMemo } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiBadge, EuiFlexGroup, EuiFlexItem, EuiIconTip } from '@elastic/eui'; +import moment from 'moment'; import type { AgentUpgradeDetails } from '../../../../../../../common/types'; @@ -62,6 +63,16 @@ const formatRate = (downloadRate: number) => { } return downloadRate.toFixed(1) + byteUnits[i]; }; +const formatRetryUntil = (retryUntil: string | undefined) => { + if (!retryUntil) return ''; + const eta = new Date(retryUntil).toISOString(); + const remainingTime = Date.parse(retryUntil) - Date.now(); + const duration = moment + .utc(moment.duration(remainingTime, 'milliseconds').asMilliseconds()) + .format('HH:mm'); + + return remainingTime > 0 ? `Retrying until: ${eta} (${duration} remaining)` : ''; +}; function getStatusComponents(agentUpgradeDetails?: AgentUpgradeDetails) { switch (agentUpgradeDetails?.state) { @@ -103,6 +114,28 @@ function getStatusComponents(agentUpgradeDetails?: AgentUpgradeDetails) { ), }; case 'UPG_DOWNLOADING': + if (agentUpgradeDetails?.metadata?.retry_error_msg) { + return { + Badge: ( + + + + ), + WarningTooltipText: ( + + ), + }; + } return { Badge: ( @@ -252,24 +285,6 @@ export const AgentUpgradeStatus: React.FC<{ const status = useMemo(() => getStatusComponents(agentUpgradeDetails), [agentUpgradeDetails]); const minVersion = '8.12'; - if (!isAgentUpgradable && notUpgradeableMessage) { - return ( - - } - color="subdued" - /> - ); - } - if (isAgentUpgradable) { return ( @@ -285,9 +300,16 @@ export const AgentUpgradeStatus: React.FC<{ return ( {status.Badge} - - - + {status.TooltipText && ( + + + + )} + {status.WarningTooltipText && ( + + + + )} ); } @@ -310,5 +332,23 @@ export const AgentUpgradeStatus: React.FC<{ ); } + if (!isAgentUpgradable && notUpgradeableMessage) { + return ( + + } + color="subdued" + /> + ); + } + return null; }; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_validators.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_validators.test.tsx index d5da6f553cf89..4352a3a6b8248 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_validators.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_validators.test.tsx @@ -83,6 +83,12 @@ describe('Output form validation', () => { expect(res).toEqual([{ message: 'URL is required' }]); }); + it('should not work with empty url', () => { + const res = validateESHosts(['']); + + expect(res).toEqual([{ index: 0, message: 'URL is required' }]); + }); + it('should work with valid url', () => { const res = validateESHosts(['https://test.fr:9200']); @@ -117,6 +123,11 @@ describe('Output form validation', () => { { index: 1, message: 'Duplicate URL' }, ]); }); + it('should return an error when invalid protocol', () => { + const res = validateESHosts(['ftp://test.fr']); + + expect(res).toEqual([{ index: 0, message: 'Invalid protocol' }]); + }); }); describe('validateLogstashHosts', () => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_validators.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_validators.tsx index 26e63803df0e7..330d5c5d20122 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_validators.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_validators.tsx @@ -88,14 +88,29 @@ export function validateKafkaHosts(value: string[]) { export function validateESHosts(value: string[]) { const res: Array<{ message: string; index?: number }> = []; const urlIndexes: { [key: string]: number[] } = {}; + const urlRequiredMessage = i18n.translate( + 'xpack.fleet.settings.outputForm.elasticUrlRequiredError', + { + defaultMessage: 'URL is required', + } + ); value.forEach((val, idx) => { try { if (!val) { - throw new Error('Host URL required'); - } - const urlParsed = new URL(val); - if (!['http:', 'https:'].includes(urlParsed.protocol)) { - throw new Error('Invalid protocol'); + res.push({ + message: urlRequiredMessage, + index: idx, + }); + } else { + const urlParsed = new URL(val); + if (!['http:', 'https:'].includes(urlParsed.protocol)) { + res.push({ + message: i18n.translate('xpack.fleet.settings.outputForm.invalidProtocolError', { + defaultMessage: 'Invalid protocol', + }), + index: idx, + }); + } } } catch (error) { res.push({ @@ -125,9 +140,7 @@ export function validateESHosts(value: string[]) { if (value.length === 0) { res.push({ - message: i18n.translate('xpack.fleet.settings.outputForm.elasticUrlRequiredError', { - defaultMessage: 'URL is required', - }), + message: urlRequiredMessage, }); } diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/use_output_form.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/use_output_form.tsx index 59b1189818225..a1d0fb484b44f 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/use_output_form.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/use_output_form.tsx @@ -874,7 +874,7 @@ export function useOutputForm(onSucess: () => void, output?: Output) { name: nameInput.value, type: outputType.RemoteElasticsearch, hosts: elasticsearchUrlInput.value, - is_default: false, + is_default: defaultOutputInput.value, is_default_monitoring: defaultMonitoringOutputInput.value, preset: presetInput.value, config_yaml: additionalYamlConfigInput.value, diff --git a/x-pack/plugins/fleet/public/services/index.ts b/x-pack/plugins/fleet/public/services/index.ts index 71f5fde90d93a..7b9d5093ed740 100644 --- a/x-pack/plugins/fleet/public/services/index.ts +++ b/x-pack/plugins/fleet/public/services/index.ts @@ -34,6 +34,7 @@ export { isValidNamespace, LicenseService, isAgentUpgradeable, + getNotUpgradeableMessage, doesPackageHaveIntegrations, validatePackagePolicy, validatePackagePolicyConfig, diff --git a/x-pack/plugins/fleet/server/routes/data_streams/handlers.ts b/x-pack/plugins/fleet/server/routes/data_streams/handlers.ts index bf8e8a22cdbdd..f9021f344c69b 100644 --- a/x-pack/plugins/fleet/server/routes/data_streams/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/data_streams/handlers.ts @@ -6,6 +6,7 @@ */ import { keyBy, keys, merge } from 'lodash'; import type { RequestHandler } from '@kbn/core/server'; +import pMap from 'p-map'; import type { DataStream } from '../../types'; import { KibanaSavedObjectType } from '../../../common/types'; @@ -120,7 +121,7 @@ export const getListHandler: RequestHandler = async (context, request, response) ); // Query additional information for each data stream - const dataStreamPromises = dataStreamNames.map(async (dataStreamName) => { + const queryDataStreamInfo = async (dataStreamName: string) => { const dataStream = dataStreams[dataStreamName]; const dataStreamResponse: DataStream = { @@ -197,13 +198,18 @@ export const getListHandler: RequestHandler = async (context, request, response) } return dataStreamResponse; - }); + }; // Return final data streams objects sorted by last activity, descending // After filtering out data streams that are missing dataset/namespace/type/package fields - body.data_streams = (await Promise.all(dataStreamPromises)) + body.data_streams = ( + await pMap(dataStreamNames, (dataStreamName) => queryDataStreamInfo(dataStreamName), { + concurrency: 50, + }) + ) .filter(({ dataset, namespace, type }) => dataset && namespace && type) .sort((a, b) => b.last_activity_ms - a.last_activity_ms); + return response.ok({ body, }); diff --git a/x-pack/plugins/fleet/server/routes/epm/file_handler.test.ts b/x-pack/plugins/fleet/server/routes/epm/file_handler.test.ts index 56d6d8c127bc2..1eb8387f69751 100644 --- a/x-pack/plugins/fleet/server/routes/epm/file_handler.test.ts +++ b/x-pack/plugins/fleet/server/routes/epm/file_handler.test.ts @@ -15,7 +15,7 @@ import { getBundledPackageByPkgKey } from '../../services/epm/packages/bundled_p import { getFile, getInstallation } from '../../services/epm/packages/get'; import type { FleetRequestHandlerContext } from '../..'; import { appContextService } from '../../services'; -import { unpackBufferEntries, getArchiveEntry } from '../../services/epm/archive'; +import { unpackBufferEntries } from '../../services/epm/archive'; import { getAsset } from '../../services/epm/archive/storage'; import { getFileHandler } from './file_handler'; @@ -29,7 +29,6 @@ jest.mock('../../services/epm/packages/get'); const mockedGetBundledPackageByPkgKey = jest.mocked(getBundledPackageByPkgKey); const mockedGetInstallation = jest.mocked(getInstallation); const mockedGetFile = jest.mocked(getFile); -const mockedGetArchiveEntry = jest.mocked(getArchiveEntry); const mockedUnpackBufferEntries = jest.mocked(unpackBufferEntries); const mockedGetAsset = jest.mocked(getAsset); @@ -61,7 +60,6 @@ describe('getFileHandler', () => { mockedUnpackBufferEntries.mockReset(); mockedGetFile.mockReset(); mockedGetInstallation.mockReset(); - mockedGetArchiveEntry.mockReset(); mockedGetAsset.mockReset(); }); @@ -207,7 +205,15 @@ describe('getFileHandler', () => { const context = mockContext(); mockedGetInstallation.mockResolvedValue({ version: '1.0.0' } as any); - mockedGetArchiveEntry.mockReturnValue(Buffer.from('test')); + mockedGetAsset.mockResolvedValue({ + asset_path: '/test/1.0.0/README.md', + data_utf8: 'test', + data_base64: '', + media_type: 'text/markdown; charset=utf-8', + package_name: 'test', + package_version: '1.0.0', + install_source: 'registry', + }); await getFileHandler(context, request, response); diff --git a/x-pack/plugins/fleet/server/routes/epm/file_handler.ts b/x-pack/plugins/fleet/server/routes/epm/file_handler.ts index 4b6b74628aa4e..0f22a31c1aa72 100644 --- a/x-pack/plugins/fleet/server/routes/epm/file_handler.ts +++ b/x-pack/plugins/fleet/server/routes/epm/file_handler.ts @@ -14,7 +14,6 @@ import type { ResponseHeaders, KnownHeaders, HttpResponseOptions } from '@kbn/co import type { GetFileRequestSchema, FleetRequestHandler } from '../../types'; import { getFile, getInstallation } from '../../services/epm/packages'; import { defaultFleetErrorHandler } from '../../errors'; -import { getArchiveEntry } from '../../services/epm/archive'; import { getAsset } from '../../services/epm/archive/storage'; import { getBundledPackageByPkgKey } from '../../services/epm/packages/bundled_packages'; import { pkgToPkgKey } from '../../services/epm/registry'; @@ -31,35 +30,23 @@ export const getFileHandler: FleetRequestHandler< const savedObjectsClient = (await context.fleet).internalSoClient; const installation = await getInstallation({ savedObjectsClient, pkgName }); - const useLocalFile = pkgVersion === installation?.version; + const isPackageInstalled = pkgVersion === installation?.version; const assetPath = `${pkgName}-${pkgVersion}/${filePath}`; - if (useLocalFile) { - const fileBuffer = getArchiveEntry(assetPath); - // only pull local installation if we don't have it cached - const storedAsset = !fileBuffer && (await getAsset({ savedObjectsClient, path: assetPath })); + if (isPackageInstalled) { + const storedAsset = await getAsset({ savedObjectsClient, path: assetPath }); - // error, if neither is available - if (!fileBuffer && !storedAsset) { + if (!storedAsset) { return response.custom({ body: `installed package file not found: ${filePath}`, statusCode: 404, }); } - // if storedAsset is not available, fileBuffer *must* be - // b/c we error if we don't have at least one, and storedAsset is the least likely - const { buffer, contentType } = storedAsset - ? { - contentType: storedAsset.media_type, - buffer: storedAsset.data_utf8 - ? Buffer.from(storedAsset.data_utf8, 'utf8') - : Buffer.from(storedAsset.data_base64, 'base64'), - } - : { - contentType: mime.contentType(path.extname(assetPath)), - buffer: fileBuffer, - }; + const contentType = storedAsset.media_type; + const buffer = storedAsset.data_utf8 + ? Buffer.from(storedAsset.data_utf8, 'utf8') + : Buffer.from(storedAsset.data_base64, 'base64'); if (!contentType) { return response.custom({ diff --git a/x-pack/plugins/fleet/server/services/app_context.ts b/x-pack/plugins/fleet/server/services/app_context.ts index 24b35b7b10201..9e40bcd64c8c8 100644 --- a/x-pack/plugins/fleet/server/services/app_context.ts +++ b/x-pack/plugins/fleet/server/services/app_context.ts @@ -16,6 +16,8 @@ import type { KibanaRequest, } from '@kbn/core/server'; +import { CoreKibanaRequest } from '@kbn/core/server'; + import type { PluginStart as DataPluginStart } from '@kbn/data-plugin/server'; import type { EncryptedSavedObjectsClient, @@ -25,7 +27,7 @@ import type { import type { SecurityPluginStart, SecurityPluginSetup } from '@kbn/security-plugin/server'; import type { CloudSetup } from '@kbn/cloud-plugin/server'; - +import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; import type { SavedObjectTaggingStart } from '@kbn/saved-objects-tagging-plugin/server'; import { SECURITY_EXTENSION_ID } from '@kbn/core-saved-objects-server'; @@ -172,6 +174,23 @@ class AppContextService { } return this.savedObjectsTagging; } + public getInternalUserSOClientForSpaceId(spaceId?: string) { + const request = CoreKibanaRequest.from({ + headers: {}, + path: '/', + route: { settings: {} }, + url: { href: '', hash: '' } as URL, + raw: { req: { url: '/' } } as any, + }); + if (this.httpSetup && spaceId && spaceId !== DEFAULT_SPACE_ID) { + this.httpSetup?.basePath.set(request, `/s/${spaceId}`); + } + + // soClient as kibana internal users, be careful on how you use it, security is not enabled + return appContextService.getSavedObjects().getScopedClient(request, { + excludedExtensions: [SECURITY_EXTENSION_ID], + }); + } public getInternalUserSOClient(request: KibanaRequest) { // soClient as kibana internal users, be careful on how you use it, security is not enabled diff --git a/x-pack/plugins/fleet/server/services/epm/archive/cache.ts b/x-pack/plugins/fleet/server/services/epm/archive/cache.ts index db0b0d709e683..15f38ccc8a68b 100644 --- a/x-pack/plugins/fleet/server/services/epm/archive/cache.ts +++ b/x-pack/plugins/fleet/server/services/epm/archive/cache.ts @@ -8,19 +8,10 @@ import type { ArchivePackage, RegistryPackage, PackageVerificationResult } from '../../../types'; import { appContextService } from '../..'; -import type { ArchiveEntry } from '.'; - type SharedKeyString = string; const sharedKey = ({ name, version }: SharedKey): SharedKeyString => `${name}-${version}`; -const archiveEntryCache: Map = new Map(); -export const getArchiveEntry = (key: string) => archiveEntryCache.get(key); -export const setArchiveEntry = (key: string, value: Buffer) => archiveEntryCache.set(key, value); -export const hasArchiveEntry = (key: string) => archiveEntryCache.has(key); -export const clearArchiveEntries = () => archiveEntryCache.clear(); -export const deleteArchiveEntry = (key: string) => archiveEntryCache.delete(key); - const verificationResultCache: Map = new Map(); export const getVerificationResult = (key: SharedKey) => verificationResultCache.get(sharedKey(key)); @@ -37,36 +28,12 @@ export interface SharedKey { version: string; } -const archiveFilelistCache: Map = new Map(); -export const getArchiveFilelist = (keyArgs: SharedKey) => - archiveFilelistCache.get(sharedKey(keyArgs)); - -export const setArchiveFilelist = (keyArgs: SharedKey, paths: string[]) => { - const logger = appContextService.getLogger(); - logger.debug(`Setting file list to the cache for ${keyArgs.name}-${keyArgs.version}`); - logger.trace(JSON.stringify(paths)); - return archiveFilelistCache.set(sharedKey(keyArgs), paths); -}; - -export const deleteArchiveFilelist = (keyArgs: SharedKey) => - archiveFilelistCache.delete(sharedKey(keyArgs)); - const packageInfoCache: Map = new Map(); export const getPackageInfo = (args: SharedKey) => { return packageInfoCache.get(sharedKey(args)); }; -export const getArchivePackage = (args: SharedKey) => { - const packageInfo = getPackageInfo(args); - const paths = getArchiveFilelist(args); - if (!paths || !packageInfo) return undefined; - return { - paths, - packageInfo, - }; -}; - /* * This cache should only be used to store "full" package info generated from the package archive. * NOT package info from the EPR API. This is because we parse extra fields from the archive @@ -85,11 +52,3 @@ export const setPackageInfo = ({ }; export const deletePackageInfo = (args: SharedKey) => packageInfoCache.delete(sharedKey(args)); - -export const clearPackageFileCache = (args: SharedKey) => { - const fileList = getArchiveFilelist(args) ?? []; - fileList.forEach((filePath) => { - deleteArchiveEntry(filePath); - }); - deleteArchiveFilelist(args); -}; diff --git a/x-pack/plugins/fleet/server/services/epm/archive/index.ts b/x-pack/plugins/fleet/server/services/epm/archive/index.ts index ec19fbba55a19..5943f8f838fcb 100644 --- a/x-pack/plugins/fleet/server/services/epm/archive/index.ts +++ b/x-pack/plugins/fleet/server/services/epm/archive/index.ts @@ -5,23 +5,14 @@ * 2.0. */ -import type { AssetParts } from '../../../../common/types'; +import type { AssetParts, AssetsMap } from '../../../../common/types'; import { PackageInvalidArchiveError, PackageUnsupportedMediaTypeError, PackageNotFoundError, } from '../../../errors'; -import { - getArchiveEntry, - setArchiveEntry, - deleteArchiveEntry, - getArchiveFilelist, - setArchiveFilelist, - deleteArchiveFilelist, - deletePackageInfo, - clearPackageFileCache, -} from './cache'; +import { deletePackageInfo } from './cache'; import type { SharedKey } from './cache'; import { getBufferExtractor } from './extract'; @@ -34,7 +25,7 @@ export interface ArchiveEntry { buffer?: Buffer; } -export async function unpackBufferToCache({ +export async function unpackBufferToAssetsMap({ name, version, contentType, @@ -44,22 +35,20 @@ export async function unpackBufferToCache({ version: string; contentType: string; archiveBuffer: Buffer; -}): Promise { +}): Promise<{ paths: string[]; assetsMap: AssetsMap }> { + const assetsMap = new Map(); + const paths: string[] = []; const entries = await unpackBufferEntries(archiveBuffer, contentType); - // Make sure any buffers from previous installations from registry or upload are deleted first - clearPackageFileCache({ name, version }); - const paths: string[] = []; entries.forEach((entry) => { const { path, buffer } = entry; if (buffer) { - setArchiveEntry(path, buffer); + assetsMap.set(path, buffer); paths.push(path); } }); - setArchiveFilelist({ name, version }, paths); - return paths; + return { assetsMap, paths }; } export async function unpackBufferEntries( @@ -94,16 +83,6 @@ export async function unpackBufferEntries( } export const deletePackageCache = ({ name, version }: SharedKey) => { - // get cached archive filelist - const paths = getArchiveFilelist({ name, version }); - - // delete cached archive filelist - deleteArchiveFilelist({ name, version }); - - // delete cached archive files - // this has been populated in unpackBufferToCache() - paths?.forEach(deleteArchiveEntry); - deletePackageInfo({ name, version }); }; @@ -151,8 +130,8 @@ export function getPathParts(path: string): AssetParts { } as AssetParts; } -export function getAsset(key: string) { - const buffer = getArchiveEntry(key); +export function getAssetFromAssetsMap(assetsMap: AssetsMap, key: string) { + const buffer = assetsMap.get(key); if (buffer === undefined) throw new PackageNotFoundError(`Cannot find asset ${key}`); return buffer; diff --git a/x-pack/plugins/fleet/server/services/epm/archive/storage.ts b/x-pack/plugins/fleet/server/services/epm/archive/storage.ts index 81d55c5fd3138..dd6321445df75 100644 --- a/x-pack/plugins/fleet/server/services/epm/archive/storage.ts +++ b/x-pack/plugins/fleet/server/services/epm/archive/storage.ts @@ -23,7 +23,7 @@ import { PackageInvalidArchiveError, PackageNotFoundError } from '../../../error import { appContextService } from '../../app_context'; -import { getArchiveEntry, setArchiveEntry, setArchiveFilelist, setPackageInfo } from '.'; +import { setPackageInfo } from '.'; import type { ArchiveEntry } from '.'; import { filterAssetPathForParseAndVerifyArchive, parseAndVerifyArchive } from './parse'; @@ -104,16 +104,17 @@ export async function removeArchiveEntries(opts: { ); } -export async function saveArchiveEntries(opts: { +export async function saveArchiveEntriesFromAssetsMap(opts: { savedObjectsClient: SavedObjectsClientContract; paths: string[]; + assetsMap: Map; packageInfo: InstallablePackage; installSource: InstallSource; }) { - const { savedObjectsClient, paths, packageInfo, installSource } = opts; + const { savedObjectsClient, paths, packageInfo, assetsMap, installSource } = opts; const bulkBody = await Promise.all( paths.map((path) => { - const buffer = getArchiveEntry(path); + const buffer = assetsMap.get(path); if (!buffer) throw new PackageNotFoundError(`Could not find ArchiveEntry at ${path}`); const { name, version } = packageInfo; return archiveEntryToBulkCreateObject({ path, buffer, name, version, installSource }); @@ -208,26 +209,26 @@ export const getEsPackage = async ( return undefined; } - const assetsMap: Record = {}; + const parseAndVerifyAssetsMap: Record = {}; + const assetsMap = new Map(); const entries: ArchiveEntry[] = assets.map(packageAssetToArchiveEntry); const paths: string[] = []; entries.forEach(({ path, buffer }) => { if (path && buffer) { - setArchiveEntry(path, buffer); + assetsMap.set(path, buffer); paths.push(path); } if (buffer && filterAssetPathForParseAndVerifyArchive(path)) { - assetsMap[path] = buffer; + parseAndVerifyAssetsMap[path] = buffer; } }); - // Add asset references to cache - setArchiveFilelist({ name: pkgName, version: pkgVersion }, paths); - const packageInfo = parseAndVerifyArchive(paths, assetsMap); + const packageInfo = parseAndVerifyArchive(paths, parseAndVerifyAssetsMap); setPackageInfo({ name: pkgName, version: pkgVersion, packageInfo }); return { packageInfo, paths, + assetsMap, }; }; diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/datastream_ilm/install.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/datastream_ilm/install.ts index c6be2dfedb1df..78db39b48cfd6 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/datastream_ilm/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/datastream_ilm/install.ts @@ -7,14 +7,13 @@ import type { ElasticsearchClient, Logger, SavedObjectsClientContract } from '@kbn/core/server'; -import { ElasticsearchAssetType } from '../../../../../common/types/models'; -import type { - EsAssetReference, - InstallablePackage, - RegistryDataStream, +import { + ElasticsearchAssetType, + type PackageInstallContext, } from '../../../../../common/types/models'; +import type { EsAssetReference, RegistryDataStream } from '../../../../../common/types/models'; import { updateEsAssetReferences } from '../../packages/install'; -import { getAsset } from '../transform/common'; +import { getAssetFromAssetsMap } from '../../archive'; import { getESAssetMetadata } from '../meta'; import { retryTransientEsErrors } from '../retry'; @@ -32,13 +31,13 @@ interface IlmPathDataset { } export const installIlmForDataStream = async ( - registryPackage: InstallablePackage, - paths: string[], + packageInstallContext: PackageInstallContext, esClient: ElasticsearchClient, savedObjectsClient: SavedObjectsClientContract, logger: Logger, esReferences: EsAssetReference[] ) => { + const { packageInfo: registryPackage, paths, assetsMap } = packageInstallContext; const previousInstalledIlmEsAssets = esReferences.filter( ({ type }) => type === ElasticsearchAssetType.dataStreamIlmPolicy ); @@ -100,7 +99,9 @@ export const installIlmForDataStream = async ( const ilmInstallations: IlmInstallation[] = ilmPathDatasets.map( (ilmPathDataset: IlmPathDataset) => { - const content = JSON.parse(getAsset(ilmPathDataset.path).toString('utf-8')); + const content = JSON.parse( + getAssetFromAssetsMap(assetsMap, ilmPathDataset.path).toString('utf-8') + ); content.policy._meta = getESAssetMetadata({ packageName: registryPackage.name }); return { diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ilm/install.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/ilm/install.ts index 61a75d28b7999..08feb1e95585a 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ilm/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/ilm/install.ts @@ -7,28 +7,31 @@ import type { ElasticsearchClient, Logger, SavedObjectsClientContract } from '@kbn/core/server'; -import type { EsAssetReference, InstallablePackage } from '../../../../types'; +import type { EsAssetReference } from '../../../../types'; import { ElasticsearchAssetType } from '../../../../types'; -import { getAsset, getPathParts } from '../../archive'; +import { getAssetFromAssetsMap, getPathParts } from '../../archive'; import { updateEsAssetReferences } from '../../packages/install'; import { getESAssetMetadata } from '../meta'; import { retryTransientEsErrors } from '../retry'; import { PackageInvalidArchiveError } from '../../../../errors'; +import type { PackageInstallContext } from '../../../../../common/types'; export async function installILMPolicy( - packageInfo: InstallablePackage, - paths: string[], + packageInstallContext: PackageInstallContext, esClient: ElasticsearchClient, savedObjectsClient: SavedObjectsClientContract, logger: Logger, esReferences: EsAssetReference[] ): Promise { - const ilmPaths = paths.filter((path) => isILMPolicy(path)); + const { packageInfo } = packageInstallContext; + const ilmPaths = packageInstallContext.paths.filter((path) => isILMPolicy(path)); if (!ilmPaths.length) return esReferences; const ilmPolicies = ilmPaths.map((path) => { - const body = JSON.parse(getAsset(path).toString('utf-8')); + const body = JSON.parse( + getAssetFromAssetsMap(packageInstallContext.assetsMap, path).toString('utf-8') + ); body.policy._meta = getESAssetMetadata({ packageName: packageInfo.name }); diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ingest_pipeline/install.test.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/ingest_pipeline/install.test.ts index 7ea61bde7a0e8..fb12d58878d1d 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ingest_pipeline/install.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/ingest_pipeline/install.test.ts @@ -7,19 +7,15 @@ import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; import { loggerMock } from '@kbn/logging-mocks'; -import { getArchiveEntry } from '../../archive/cache'; - import { prepareToInstallPipelines } from './install'; jest.mock('../../archive/cache'); -const mockedGetArchiveEntry = getArchiveEntry as jest.MockedFunction; - describe('Install pipeline tests', () => { describe('prepareToInstallPipelines', () => { it('should work with datastream without ingest pipeline define in the package', async () => { - const res = prepareToInstallPipelines( - { + const res = prepareToInstallPipelines({ + packageInfo: { version: '1.0.0', data_streams: [ { @@ -29,9 +25,10 @@ describe('Install pipeline tests', () => { path: '/datasettest', }, ], - } as any, - [] - ); + }, + paths: [], + assetsMap: new Map(), + } as any); expect(res.assetsToAdd).toEqual([{ id: 'logs-datasettest-1.0.0', type: 'ingest_pipeline' }]); const esClient = elasticsearchClientMock.createInternalClient(); @@ -50,8 +47,8 @@ describe('Install pipeline tests', () => { }); it('should work with datastream with ingest pipelines define in the package', async () => { - const res = prepareToInstallPipelines( - { + const res = prepareToInstallPipelines({ + packageInfo: { version: '1.0.0', data_streams: [ { @@ -62,12 +59,22 @@ describe('Install pipeline tests', () => { ingest_pipeline: 'default', }, ], - } as any, - [ + }, + paths: [ 'packagetest-1.0.0/data_stream/datasettest/elasticsearch/ingest_pipeline/default.yml', 'packagetest-1.0.0/data_stream/datasettest/elasticsearch/ingest_pipeline/standard.yml', - ] - ); + ], + assetsMap: new Map([ + [ + 'packagetest-1.0.0/data_stream/datasettest/elasticsearch/ingest_pipeline/default.yml', + Buffer.from('description: test'), + ], + [ + 'packagetest-1.0.0/data_stream/datasettest/elasticsearch/ingest_pipeline/standard.yml', + Buffer.from('description: test'), + ], + ]), + } as any); expect(res.assetsToAdd).toEqual([ { id: 'logs-datasettest-1.0.0', type: 'ingest_pipeline' }, { id: 'logs-datasettest-1.0.0-standard', type: 'ingest_pipeline' }, @@ -76,8 +83,6 @@ describe('Install pipeline tests', () => { const esClient = elasticsearchClientMock.createInternalClient(); const logger = loggerMock.create(); - mockedGetArchiveEntry.mockReturnValue(Buffer.from(`description: test`)); - await res.install(esClient, logger); expect(esClient.ingest.putPipeline).toBeCalledTimes(2); diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ingest_pipeline/install.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/ingest_pipeline/install.ts index e30bc5b32a771..a456734747324 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ingest_pipeline/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/ingest_pipeline/install.ts @@ -15,7 +15,7 @@ import type { InstallablePackage, PackageInfo, } from '../../../../types'; -import { getAsset, getPathParts } from '../../archive'; +import { getAssetFromAssetsMap, getPathParts } from '../../archive'; import type { ArchiveEntry } from '../../archive'; import { FLEET_FINAL_PIPELINE_CONTENT, @@ -23,6 +23,7 @@ import { FLEET_FINAL_PIPELINE_VERSION, } from '../../../../constants'; import { getPipelineNameForDatastream } from '../../../../../common/services'; +import type { PackageInstallContext } from '../../../../../common/types'; import { appendMetadataToIngestPipeline } from '../meta'; import { retryTransientEsErrors } from '../retry'; @@ -36,18 +37,18 @@ import { import type { PipelineInstall, RewriteSubstitution } from './types'; export const prepareToInstallPipelines = ( - installablePackage: InstallablePackage | PackageInfo, - paths: string[], + packageInstallContext: PackageInstallContext, onlyForDataStreams?: RegistryDataStream[] ): { assetsToAdd: EsAssetReference[]; install: (esClient: ElasticsearchClient, logger: Logger) => Promise; } => { + const { packageInfo, paths } = packageInstallContext; // unlike other ES assets, pipeline names are versioned so after a template is updated // it can be created pointing to the new template, without removing the old one and effecting data // so do not remove the currently installed pipelines here - const dataStreams = onlyForDataStreams || installablePackage.data_streams; - const { version: pkgVersion } = installablePackage; + const dataStreams = onlyForDataStreams || packageInfo.data_streams; + const { version: pkgVersion } = packageInfo; const pipelinePaths = paths.filter((path) => isPipeline(path)); const topLevelPipelinePaths = paths.filter((path) => isTopLevelPipeline(path)); @@ -108,7 +109,7 @@ export const prepareToInstallPipelines = ( esClient, logger, paths: pipelinePaths, - installablePackage, + packageInstallContext, }) ); @@ -123,7 +124,7 @@ export const prepareToInstallPipelines = ( esClient, logger, paths: topLevelPipelinePaths, - installablePackage, + packageInstallContext, }) ); } @@ -138,13 +139,13 @@ export async function installAllPipelines({ logger, paths, dataStream, - installablePackage, + packageInstallContext, }: { esClient: ElasticsearchClient; logger: Logger; paths: string[]; dataStream?: RegistryDataStream; - installablePackage: InstallablePackage | PackageInfo; + packageInstallContext: PackageInstallContext; }): Promise { const pipelinePaths = dataStream ? paths.filter((path) => isDataStreamPipeline(path, dataStream.path)) @@ -164,9 +165,9 @@ export async function installAllPipelines({ const nameForInstallation = getPipelineNameForInstallation({ pipelineName: name, dataStream, - packageVersion: installablePackage.version, + packageVersion: packageInstallContext.packageInfo.version, }); - const content = getAsset(path).toString('utf-8'); + const content = getAssetFromAssetsMap(packageInstallContext.assetsMap, path).toString('utf-8'); pipelinesInfos.push({ nameForInstallation, shouldInstallCustomPipelines: dataStream && isMainPipeline, @@ -191,7 +192,7 @@ export async function installAllPipelines({ if (!datastreamPipelineCreated && dataStream) { const nameForInstallation = getPipelineNameForDatastream({ dataStream, - packageVersion: installablePackage.version, + packageVersion: packageInstallContext.packageInfo.version, }); pipelinesToInstall.push({ @@ -204,7 +205,12 @@ export async function installAllPipelines({ } const installationPromises = pipelinesToInstall.map(async (pipeline) => { - return installPipeline({ esClient, pipeline, installablePackage, logger }); + return installPipeline({ + esClient, + pipeline, + packageInfo: packageInstallContext.packageInfo, + logger, + }); }); return Promise.all(installationPromises); @@ -214,18 +220,18 @@ async function installPipeline({ esClient, logger, pipeline, - installablePackage, + packageInfo, shouldAddCustomPipelineProcessor = true, }: { esClient: ElasticsearchClient; logger: Logger; pipeline: PipelineInstall; - installablePackage?: InstallablePackage | PackageInfo; + packageInfo?: InstallablePackage | PackageInfo; shouldAddCustomPipelineProcessor?: boolean; }): Promise { let pipelineToInstall = appendMetadataToIngestPipeline({ pipeline, - packageName: installablePackage?.name, + packageName: packageInfo?.name, }); if (shouldAddCustomPipelineProcessor) { diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ml_model/install.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/ml_model/install.ts index 630433e18ce39..d48a65dc593ef 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ml_model/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/ml_model/install.ts @@ -8,33 +8,35 @@ import type { ElasticsearchClient, Logger, SavedObjectsClientContract } from '@kbn/core/server'; import { errors } from '@elastic/elasticsearch'; -import { getPathParts } from '../../archive'; -import { ElasticsearchAssetType } from '../../../../../common/types/models'; -import type { EsAssetReference, InstallablePackage } from '../../../../../common/types/models'; +import { getAssetFromAssetsMap, getPathParts } from '../../archive'; +import { + ElasticsearchAssetType, + type PackageInstallContext, +} from '../../../../../common/types/models'; +import type { EsAssetReference } from '../../../../../common/types/models'; import { retryTransientEsErrors } from '../retry'; import { updateEsAssetReferences } from '../../packages/install'; -import { getAsset } from './common'; - interface MlModelInstallation { installationName: string; content: string; } export const installMlModel = async ( - installablePackage: InstallablePackage, - paths: string[], + packageInstallContext: PackageInstallContext, esClient: ElasticsearchClient, savedObjectsClient: SavedObjectsClientContract, logger: Logger, esReferences: EsAssetReference[] ) => { - const mlModelPath = paths.find((path) => isMlModel(path)); + const mlModelPath = packageInstallContext.paths.find((path) => isMlModel(path)); if (mlModelPath !== undefined) { - const content = getAsset(mlModelPath).toString('utf-8'); + const content = getAssetFromAssetsMap(packageInstallContext.assetsMap, mlModelPath).toString( + 'utf-8' + ); const pathParts = mlModelPath.split('/'); const modelId = pathParts[pathParts.length - 1].replace('.json', ''); @@ -46,7 +48,7 @@ export const installMlModel = async ( // get and save ml model refs before installing ml model esReferences = await updateEsAssetReferences( savedObjectsClient, - installablePackage.name, + packageInstallContext.packageInfo.name, esReferences, { assetsToAdd: [mlModelRef] } ); diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.test.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.test.ts index 321e832115cf0..61edf78ec497e 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.test.ts @@ -7,7 +7,7 @@ import { createAppContextStartContractMock } from '../../../../mocks'; import { appContextService } from '../../..'; import { loadFieldsFromYaml } from '../../fields/field'; -import type { ArchivePackage, RegistryDataStream } from '../../../../types'; +import type { PackageInstallContext, RegistryDataStream } from '../../../../../common/types'; import { prepareTemplate, prepareToInstallTemplates } from './install'; @@ -19,6 +19,9 @@ jest.mock('../../fields/field', () => ({ const mockedLoadFieldsFromYaml = loadFieldsFromYaml as jest.MockedFunction< typeof loadFieldsFromYaml >; +const packageInstallContext = { + packageInfo: { name: 'package', version: '0.0.1' }, +} as PackageInstallContext; describe('EPM index template install', () => { beforeEach(async () => { @@ -43,15 +46,12 @@ describe('EPM index template install', () => { path: 'path', ingest_pipeline: 'default', } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; + const templateIndexPatternDatasetIsPrefixUnset = 'metrics-package.dataset-*'; const templatePriorityDatasetIsPrefixUnset = 200; const { indexTemplate: { indexTemplate }, - } = prepareTemplate({ pkg, dataStream: dataStreamDatasetIsPrefixUnset }); + } = prepareTemplate({ packageInstallContext, dataStream: dataStreamDatasetIsPrefixUnset }); expect(indexTemplate.priority).toBe(templatePriorityDatasetIsPrefixUnset); expect(indexTemplate.index_patterns).toEqual([templateIndexPatternDatasetIsPrefixUnset]); }); @@ -67,15 +67,12 @@ describe('EPM index template install', () => { ingest_pipeline: 'default', dataset_is_prefix: false, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; + const templateIndexPatternDatasetIsPrefixFalse = 'metrics-package.dataset-*'; const templatePriorityDatasetIsPrefixFalse = 200; const { indexTemplate: { indexTemplate }, - } = prepareTemplate({ pkg, dataStream: dataStreamDatasetIsPrefixFalse }); + } = prepareTemplate({ packageInstallContext, dataStream: dataStreamDatasetIsPrefixFalse }); expect(indexTemplate.priority).toBe(templatePriorityDatasetIsPrefixFalse); expect(indexTemplate.index_patterns).toEqual([templateIndexPatternDatasetIsPrefixFalse]); @@ -92,15 +89,12 @@ describe('EPM index template install', () => { ingest_pipeline: 'default', dataset_is_prefix: true, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; + const templateIndexPatternDatasetIsPrefixTrue = 'metrics-package.dataset.*-*'; const templatePriorityDatasetIsPrefixTrue = 150; const { indexTemplate: { indexTemplate }, - } = prepareTemplate({ pkg, dataStream: dataStreamDatasetIsPrefixTrue }); + } = prepareTemplate({ packageInstallContext, dataStream: dataStreamDatasetIsPrefixTrue }); expect(indexTemplate.priority).toBe(templatePriorityDatasetIsPrefixTrue); expect(indexTemplate.index_patterns).toEqual([templateIndexPatternDatasetIsPrefixTrue]); @@ -120,13 +114,9 @@ describe('EPM index template install', () => { source_mode: 'synthetic', }, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; const { componentTemplates } = prepareTemplate({ - pkg, + packageInstallContext, dataStream: dataStreamDatasetIsPrefixTrue, }); @@ -154,13 +144,9 @@ describe('EPM index template install', () => { index_mode: 'time_series', }, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; const { componentTemplates } = prepareTemplate({ - pkg, + packageInstallContext, dataStream: dataStreamDatasetIsPrefixTrue, }); @@ -188,13 +174,9 @@ describe('EPM index template install', () => { index_mode: 'time_series', }, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; const { componentTemplates } = prepareTemplate({ - pkg, + packageInstallContext, dataStream: dataStreamDatasetIsPrefixTrue, experimentalDataStreamFeature: { data_stream: 'metrics-package.dataset', @@ -230,13 +212,9 @@ describe('EPM index template install', () => { source_mode: 'synthetic', }, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; const { componentTemplates } = prepareTemplate({ - pkg, + packageInstallContext, dataStream: dataStreamDatasetIsPrefixTrue, experimentalDataStreamFeature: { data_stream: 'metrics-package.dataset', @@ -272,13 +250,9 @@ describe('EPM index template install', () => { index_mode: 'time_series', }, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; const { indexTemplate } = prepareTemplate({ - pkg, + packageInstallContext, dataStream: dataStreamDatasetIsPrefixTrue, }); @@ -307,13 +281,8 @@ describe('EPM index template install', () => { }, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; - const { componentTemplates } = prepareTemplate({ - pkg, + packageInstallContext, dataStream, }); @@ -352,13 +321,8 @@ describe('EPM index template install', () => { }, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; - const { componentTemplates } = prepareTemplate({ - pkg, + packageInstallContext, dataStream, }); @@ -401,13 +365,8 @@ describe('EPM index template install', () => { }, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; - const { componentTemplates } = prepareTemplate({ - pkg, + packageInstallContext, dataStream, }); @@ -441,13 +400,8 @@ describe('EPM index template install', () => { }, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; - const { componentTemplates } = prepareTemplate({ - pkg, + packageInstallContext, dataStream, }); @@ -469,10 +423,12 @@ describe('EPM index template install', () => { const { assetsToAdd } = prepareToInstallTemplates( { - name: 'package', - version: '0.0.1', - data_streams: [dataStreamDatasetIsPrefixUnset], - } as ArchivePackage, + packageInfo: { + name: 'package', + version: '0.0.1', + data_streams: [dataStreamDatasetIsPrefixUnset], + }, + } as PackageInstallContext, [], [] ); diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.ts index 2e67c70874e4e..d6825668d1a44 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.ts @@ -23,33 +23,29 @@ import type { RegistryDataStream, IndexTemplateEntry, RegistryElasticsearch, - InstallablePackage, IndexTemplate, IndexTemplateMappings, TemplateMapEntry, TemplateMap, EsAssetReference, - PackageInfo, ExperimentalDataStreamFeature, } from '../../../../types'; import { loadFieldsFromYaml, processFields } from '../../fields/field'; -import { getAsset, getPathParts } from '../../archive'; +import { getAssetFromAssetsMap, getPathParts } from '../../archive'; import { FLEET_COMPONENT_TEMPLATES, PACKAGE_TEMPLATE_SUFFIX, USER_SETTINGS_TEMPLATE_SUFFIX, STACK_COMPONENT_TEMPLATES, } from '../../../../constants'; - import { getESAssetMetadata } from '../meta'; import { retryTransientEsErrors } from '../retry'; - import { applyDocOnlyValueToMapping, forEachMappings, } from '../../../experimental_datastream_features_helper'; - import { appContextService } from '../../../app_context'; +import type { PackageInstallContext } from '../../../../../common/types'; import { generateMappings, @@ -63,8 +59,7 @@ import { buildDefaultSettings } from './default_settings'; const FLEET_COMPONENT_TEMPLATE_NAMES = FLEET_COMPONENT_TEMPLATES.map((tmpl) => tmpl.name); export const prepareToInstallTemplates = ( - installablePackage: InstallablePackage | PackageInfo, - paths: string[], + packageInstallContext: PackageInstallContext, esReferences: EsAssetReference[], experimentalDataStreamFeatures: ExperimentalDataStreamFeature[] = [], onlyForDataStreams?: RegistryDataStream[] @@ -73,6 +68,7 @@ export const prepareToInstallTemplates = ( assetsToRemove: EsAssetReference[]; install: (esClient: ElasticsearchClient, logger: Logger) => Promise; } => { + const { packageInfo } = packageInstallContext; // remove package installation's references to index templates const assetsToRemove = esReferences.filter( ({ type }) => @@ -81,7 +77,7 @@ export const prepareToInstallTemplates = ( ); // build templates per data stream from yml files - const dataStreams = onlyForDataStreams || installablePackage.data_streams; + const dataStreams = onlyForDataStreams || packageInfo.data_streams; if (!dataStreams) return { assetsToAdd: [], assetsToRemove, install: () => Promise.resolve([]) }; const templates = dataStreams.map((dataStream) => { @@ -90,7 +86,7 @@ export const prepareToInstallTemplates = ( datastreamFeature.data_stream === getRegistryDataStreamAssetBaseName(dataStream) ); - return prepareTemplate({ pkg: installablePackage, dataStream, experimentalDataStreamFeature }); + return prepareTemplate({ packageInstallContext, dataStream, experimentalDataStreamFeature }); }); const assetsToAdd = getAllTemplateRefs(templates.map((template) => template.indexTemplate)); @@ -102,8 +98,8 @@ export const prepareToInstallTemplates = ( // install any pre-built index template assets, // atm, this is only the base package's global index templates // Install component templates first, as they are used by the index templates - await installPreBuiltComponentTemplates(paths, esClient, logger); - await installPreBuiltTemplates(paths, esClient, logger); + await installPreBuiltComponentTemplates(packageInstallContext, esClient, logger); + await installPreBuiltTemplates(packageInstallContext, esClient, logger); await Promise.all( templates.map((template) => @@ -122,15 +118,17 @@ export const prepareToInstallTemplates = ( }; const installPreBuiltTemplates = async ( - paths: string[], + packageInstallContext: PackageInstallContext, esClient: ElasticsearchClient, logger: Logger ) => { - const templatePaths = paths.filter((path) => isTemplate(path)); + const templatePaths = packageInstallContext.paths.filter((path) => isTemplate(path)); const templateInstallPromises = templatePaths.map(async (path) => { const { file } = getPathParts(path); const templateName = file.substr(0, file.lastIndexOf('.')); - const content = JSON.parse(getAsset(path).toString('utf8')); + const content = JSON.parse( + getAssetFromAssetsMap(packageInstallContext.assetsMap, path).toString('utf8') + ); const esClientParams = { name: templateName, body: content }; const esClientRequestOptions = { ignore: [404] }; @@ -159,15 +157,17 @@ const installPreBuiltTemplates = async ( }; const installPreBuiltComponentTemplates = async ( - paths: string[], + packageInstallContext: PackageInstallContext, esClient: ElasticsearchClient, logger: Logger ) => { - const templatePaths = paths.filter((path) => isComponentTemplate(path)); + const templatePaths = packageInstallContext.paths.filter((path) => isComponentTemplate(path)); const templateInstallPromises = templatePaths.map(async (path) => { const { file } = getPathParts(path); const templateName = file.substr(0, file.lastIndexOf('.')); - const content = JSON.parse(getAsset(path).toString('utf8')); + const content = JSON.parse( + getAssetFromAssetsMap(packageInstallContext.assetsMap, path).toString('utf8') + ); const esClientParams = { name: templateName, @@ -518,16 +518,16 @@ export async function ensureAliasHasWriteIndex(opts: { } export function prepareTemplate({ - pkg, + packageInstallContext, dataStream, experimentalDataStreamFeature, }: { - pkg: Pick; + packageInstallContext: PackageInstallContext; dataStream: RegistryDataStream; experimentalDataStreamFeature?: ExperimentalDataStreamFeature; }): { componentTemplates: TemplateMap; indexTemplate: IndexTemplateEntry } { - const { name: packageName, version: packageVersion } = pkg; - const fields = loadFieldsFromYaml(pkg, dataStream.path); + const { name: packageName, version: packageVersion } = packageInstallContext.packageInfo; + const fields = loadFieldsFromYaml(packageInstallContext, dataStream.path); const isIndexModeTimeSeries = dataStream.elasticsearch?.index_mode === 'time_series' || diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/common.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/common.ts index 46e85d7f9df62..b3ee4179d1256 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/common.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/common.ts @@ -5,8 +5,6 @@ * 2.0. */ -export { getAsset } from '../../archive'; - // Index alias that points to just one destination index from the latest package version export const TRANSFORM_DEST_IDX_ALIAS_LATEST_SFX = '.latest'; // Index alias that points to all of the destination indices from all the package versions diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/install.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/install.ts index 984a88d87e61f..2afe341485139 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/install.ts @@ -29,8 +29,11 @@ import { isFields, processFields } from '../../fields/field'; import { generateMappings } from '../template/template'; import { getESAssetMetadata } from '../meta'; import { updateEsAssetReferences } from '../../packages/install'; -import { getPathParts } from '../../archive'; -import { ElasticsearchAssetType } from '../../../../../common/types/models'; +import { getAssetFromAssetsMap, getPathParts } from '../../archive'; +import { + ElasticsearchAssetType, + type PackageInstallContext, +} from '../../../../../common/types/models'; import type { EsAssetReference, InstallablePackage, @@ -42,7 +45,6 @@ import { getInstallation } from '../../packages'; import { retryTransientEsErrors } from '../retry'; import { deleteTransforms } from './remove'; -import { getAsset } from './common'; import { getDestinationIndexAliases } from './transform_utils'; const DEFAULT_TRANSFORM_TEMPLATES_PRIORITY = 250; @@ -69,7 +71,7 @@ interface TransformInstallation extends TransformModuleBase { } const installLegacyTransformsAssets = async ( - installablePackage: InstallablePackage, + packageInstallContext: PackageInstallContext, installNameSuffix: string, transformPaths: string[], esClient: ElasticsearchClient, @@ -89,7 +91,11 @@ const installLegacyTransformsAssets = async ( if (transformPaths.length > 0) { const transformRefs = transformPaths.reduce((acc, path) => { acc.push({ - id: getLegacyTransformNameForInstallation(installablePackage, path, installNameSuffix), + id: getLegacyTransformNameForInstallation( + packageInstallContext.packageInfo, + path, + installNameSuffix + ), type: ElasticsearchAssetType.transform, }); @@ -99,7 +105,7 @@ const installLegacyTransformsAssets = async ( // get and save transform refs before installing transforms esReferences = await updateEsAssetReferences( savedObjectsClient, - installablePackage.name, + packageInstallContext.packageInfo.name, esReferences, { assetsToAdd: transformRefs, @@ -107,12 +113,14 @@ const installLegacyTransformsAssets = async ( ); const transforms: TransformInstallation[] = transformPaths.map((path: string) => { - const content = JSON.parse(getAsset(path).toString('utf-8')); - content._meta = getESAssetMetadata({ packageName: installablePackage.name }); + const content = JSON.parse( + getAssetFromAssetsMap(packageInstallContext.assetsMap, path).toString('utf-8') + ); + content._meta = getESAssetMetadata({ packageName: packageInstallContext.packageInfo.name }); return { installationName: getLegacyTransformNameForInstallation( - installablePackage, + packageInstallContext.packageInfo, path, installNameSuffix ), @@ -130,7 +138,7 @@ const installLegacyTransformsAssets = async ( if (previousInstalledTransformEsAssets.length > 0) { esReferences = await updateEsAssetReferences( savedObjectsClient, - installablePackage.name, + packageInstallContext.packageInfo.name, esReferences, { assetsToRemove: previousInstalledTransformEsAssets, @@ -142,13 +150,14 @@ const installLegacyTransformsAssets = async ( }; const processTransformAssetsPerModule = ( - installablePackage: InstallablePackage, + packageInstallContext: PackageInstallContext, installNameSuffix: string, transformPaths: string[], previousInstalledTransformEsAssets: EsAssetReference[] = [], force?: boolean, username?: string ) => { + const { assetsMap, packageInfo: installablePackage } = packageInstallContext; const transformsSpecifications = new Map(); const destinationIndexTemplates: DestinationIndexTemplateInstallation[] = []; const transforms: TransformInstallation[] = []; @@ -169,7 +178,7 @@ const processTransformAssetsPerModule = ( } const packageAssets = transformsSpecifications.get(transformModuleId); - const content = safeLoad(getAsset(path).toString('utf-8')); + const content = safeLoad(getAssetFromAssetsMap(assetsMap, path).toString('utf-8')); // Handling fields.yml and all other files within 'fields' folder if (fileName === TRANSFORM_SPECS_TYPES.FIELDS || isFields(path)) { @@ -399,7 +408,7 @@ const processTransformAssetsPerModule = ( }; const installTransformsAssets = async ( - installablePackage: InstallablePackage, + packageInstallContext: PackageInstallContext, installNameSuffix: string, transformPaths: string[], esClient: ElasticsearchClient, @@ -425,7 +434,7 @@ const installTransformsAssets = async ( transformsToRemove, transformsToRemoveWithDestIndex, } = processTransformAssetsPerModule( - installablePackage, + packageInstallContext, installNameSuffix, transformPaths, previousInstalledTransformEsAssets, @@ -441,8 +450,8 @@ const installTransformsAssets = async ( ? await generateTransformSecondaryAuthHeaders({ authorizationHeader, logger, - pkgName: installablePackage.name, - pkgVersion: installablePackage.version, + pkgName: packageInstallContext.packageInfo.name, + pkgVersion: packageInstallContext.packageInfo.version, username, }) : // No need to generate api key/secondary auth if all transforms are run as kibana_system user @@ -469,7 +478,7 @@ const installTransformsAssets = async ( // get and save refs associated with the transforms before installing esReferences = await updateEsAssetReferences( savedObjectsClient, - installablePackage.name, + packageInstallContext.packageInfo.name, esReferences, { assetsToAdd: [ @@ -504,7 +513,7 @@ const installTransformsAssets = async ( mappings: customMappings, templateName: destinationIndexTemplate.installationName, registryElasticsearch, - packageName: installablePackage.name, + packageName: packageInstallContext.packageInfo.name, defaultSettings: { // Adding destination pipeline here because else these templates will be overridden // by index setting @@ -579,7 +588,7 @@ const installTransformsAssets = async ( // get and save refs associated with the transforms before installing esReferences = await updateEsAssetReferences( savedObjectsClient, - installablePackage.name, + packageInstallContext.packageInfo.name, esReferences, { assetsToRemove: installedTransforms, @@ -593,8 +602,7 @@ const installTransformsAssets = async ( }; interface InstallTransformsParams { - installablePackage: InstallablePackage; - paths: string[]; + packageInstallContext: PackageInstallContext; esClient: ElasticsearchClient; savedObjectsClient: SavedObjectsClientContract; logger: Logger; @@ -611,8 +619,7 @@ interface InstallTransformsParams { authorizationHeader?: HTTPAuthorizationHeader | null; } export const installTransforms = async ({ - installablePackage, - paths, + packageInstallContext, esClient, savedObjectsClient, logger, @@ -620,11 +627,12 @@ export const installTransforms = async ({ esReferences, authorizationHeader, }: InstallTransformsParams) => { + const { paths, packageInfo } = packageInstallContext; const transformPaths = paths.filter((path) => isTransform(path)); const installation = await getInstallation({ savedObjectsClient, - pkgName: installablePackage.name, + pkgName: packageInfo.name, }); esReferences = esReferences ?? installation?.installed_es ?? []; let previousInstalledTransformEsAssets: EsAssetReference[] = []; @@ -641,12 +649,12 @@ export const installTransforms = async ({ } } - const installNameSuffix = `${installablePackage.version}`; + const installNameSuffix = `${packageInfo.version}`; // If package contains legacy transform specifications (i.e. with json instead of yml) if (transformPaths.some((p) => p.endsWith('.json')) || transformPaths.length === 0) { return await installLegacyTransformsAssets( - installablePackage, + packageInstallContext, installNameSuffix, transformPaths, esClient, @@ -659,7 +667,7 @@ export const installTransforms = async ({ // If package contains yml transform specifications return await installTransformsAssets( - installablePackage, + packageInstallContext, installNameSuffix, transformPaths, esClient, diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/legacy_transforms.test.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/legacy_transforms.test.ts index c652bee50d815..72474d3081f39 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/legacy_transforms.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/legacy_transforms.test.ts @@ -12,12 +12,6 @@ jest.mock('../../packages/get', () => { return { getInstallation: jest.fn(), getInstallationObject: jest.fn() }; }); -jest.mock('./common', () => { - return { - getAsset: jest.fn(), - }; -}); - import { errors } from '@elastic/elasticsearch'; import type { SavedObject, SavedObjectsClientContract } from '@kbn/core/server'; import { loggerMock } from '@kbn/logging-mocks'; @@ -26,15 +20,15 @@ import { savedObjectsClientMock } from '@kbn/core/server/mocks'; import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; import { getInstallation, getInstallationObject } from '../../packages'; -import type { Installation, RegistryPackage } from '../../../../types'; +import type { Installation } from '../../../../types'; import { ElasticsearchAssetType } from '../../../../types'; import { appContextService } from '../../../app_context'; import { getESAssetMetadata } from '../meta'; +import type { PackageInstallContext } from '../../../../../common/types'; import { PACKAGES_SAVED_OBJECT_TYPE } from '../../../../constants'; -import { getAsset } from './common'; import { installTransforms } from './install'; describe('test transform install with legacy schema', () => { @@ -92,10 +86,6 @@ describe('test transform install with legacy schema', () => { }, ], } as unknown as Installation; - (getAsset as jest.MockedFunction) - .mockReturnValueOnce(Buffer.from('{"content": "data"}', 'utf8')) - .mockReturnValueOnce(Buffer.from('{"content": "data"}', 'utf8')); - (getInstallation as jest.MockedFunction) .mockReturnValueOnce(Promise.resolve(previousInstallation)) .mockReturnValueOnce(Promise.resolve(currentInstallation)); @@ -123,45 +113,61 @@ describe('test transform install with legacy schema', () => { }); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - data_streams: [ - { - type: 'metrics', - dataset: 'endpoint.metadata', - title: 'Endpoint Metadata', - release: 'experimental', - package: 'endpoint', - ingest_pipeline: 'default', - elasticsearch: { - 'index_template.mappings': { - dynamic: false, + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + data_streams: [ + { + type: 'metrics', + dataset: 'endpoint.metadata', + title: 'Endpoint Metadata', + release: 'experimental', + package: 'endpoint', + ingest_pipeline: 'default', + elasticsearch: { + 'index_template.mappings': { + dynamic: false, + }, }, + path: 'metadata', }, - path: 'metadata', - }, - { - type: 'metrics', - dataset: 'endpoint.metadata_current', - title: 'Endpoint Metadata Current', - release: 'experimental', - package: 'endpoint', - ingest_pipeline: 'default', - elasticsearch: { - 'index_template.mappings': { - dynamic: false, + { + type: 'metrics', + dataset: 'endpoint.metadata_current', + title: 'Endpoint Metadata Current', + release: 'experimental', + package: 'endpoint', + ingest_pipeline: 'default', + elasticsearch: { + 'index_template.mappings': { + dynamic: false, + }, }, + path: 'metadata_current', }, - path: 'metadata_current', - }, + ], + }, + paths: [ + 'endpoint-0.16.0-dev.0/data_stream/policy/elasticsearch/ingest_pipeline/default.json', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata/default.json', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json', ], - } as unknown as RegistryPackage, - paths: [ - 'endpoint-0.16.0-dev.0/data_stream/policy/elasticsearch/ingest_pipeline/default.json', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata/default.json', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json', - ], + assetsMap: new Map([ + [ + 'endpoint-0.16.0-dev.0/data_stream/policy/elasticsearch/ingest_pipeline/default.json', + Buffer.from('{"content": "data"}'), + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata/default.json', + Buffer.from('{"content": "data"}'), + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json', + Buffer.from('{"content": "data"}'), + ], + ]), + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), @@ -288,9 +294,6 @@ describe('test transform install with legacy schema', () => { }, ], } as unknown as Installation; - (getAsset as jest.MockedFunction).mockReturnValueOnce( - Buffer.from('{"content": "data"}', 'utf8') - ); (getInstallation as jest.MockedFunction) .mockReturnValueOnce(Promise.resolve(previousInstallation)) .mockReturnValueOnce(Promise.resolve(currentInstallation)); @@ -304,27 +307,35 @@ describe('test transform install with legacy schema', () => { ); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - data_streams: [ - { - type: 'metrics', - dataset: 'endpoint.metadata_current', - title: 'Endpoint Metadata', - release: 'experimental', - package: 'endpoint', - ingest_pipeline: 'default', - elasticsearch: { - 'index_template.mappings': { - dynamic: false, + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + data_streams: [ + { + type: 'metrics', + dataset: 'endpoint.metadata_current', + title: 'Endpoint Metadata', + release: 'experimental', + package: 'endpoint', + ingest_pipeline: 'default', + elasticsearch: { + 'index_template.mappings': { + dynamic: false, + }, }, + path: 'metadata_current', }, - path: 'metadata_current', - }, - ], - } as unknown as RegistryPackage, - paths: ['endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json'], + ], + }, + paths: ['endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json'], + assetsMap: new Map([ + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json', + Buffer.from('{"content": "data"}'), + ], + ]), + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), @@ -406,41 +417,43 @@ describe('test transform install with legacy schema', () => { }); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - data_streams: [ - { - type: 'metrics', - dataset: 'endpoint.metadata', - title: 'Endpoint Metadata', - release: 'experimental', - package: 'endpoint', - ingest_pipeline: 'default', - elasticsearch: { - 'index_template.mappings': { - dynamic: false, + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + data_streams: [ + { + type: 'metrics', + dataset: 'endpoint.metadata', + title: 'Endpoint Metadata', + release: 'experimental', + package: 'endpoint', + ingest_pipeline: 'default', + elasticsearch: { + 'index_template.mappings': { + dynamic: false, + }, }, + path: 'metadata', }, - path: 'metadata', - }, - { - type: 'metrics', - dataset: 'endpoint.metadata_current', - title: 'Endpoint Metadata Current', - release: 'experimental', - package: 'endpoint', - ingest_pipeline: 'default', - elasticsearch: { - 'index_template.mappings': { - dynamic: false, + { + type: 'metrics', + dataset: 'endpoint.metadata_current', + title: 'Endpoint Metadata Current', + release: 'experimental', + package: 'endpoint', + ingest_pipeline: 'default', + elasticsearch: { + 'index_template.mappings': { + dynamic: false, + }, }, + path: 'metadata_current', }, - path: 'metadata_current', - }, - ], - } as unknown as RegistryPackage, - paths: [], + ], + }, + paths: [], + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), @@ -495,9 +508,6 @@ describe('test transform install with legacy schema', () => { }, ], } as unknown as Installation; - (getAsset as jest.MockedFunction).mockReturnValueOnce( - Buffer.from('{"content": "data"}', 'utf8') - ); (getInstallation as jest.MockedFunction) .mockReturnValueOnce(Promise.resolve(previousInstallation)) .mockReturnValueOnce(Promise.resolve(currentInstallation)); @@ -522,27 +532,35 @@ describe('test transform install with legacy schema', () => { ); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - data_streams: [ - { - type: 'metrics', - dataset: 'endpoint.metadata_current', - title: 'Endpoint Metadata', - release: 'experimental', - package: 'endpoint', - ingest_pipeline: 'default', - elasticsearch: { - 'index_template.mappings': { - dynamic: false, + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + data_streams: [ + { + type: 'metrics', + dataset: 'endpoint.metadata_current', + title: 'Endpoint Metadata', + release: 'experimental', + package: 'endpoint', + ingest_pipeline: 'default', + elasticsearch: { + 'index_template.mappings': { + dynamic: false, + }, }, + path: 'metadata_current', }, - path: 'metadata_current', - }, - ], - } as unknown as RegistryPackage, - paths: ['endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json'], + ], + }, + paths: ['endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json'], + assetsMap: new Map([ + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json', + Buffer.from('{"content": "data"}'), + ], + ]), + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transforms.test.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transforms.test.ts index 6ab6f20669baf..80efd5a08e446 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transforms.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transforms.test.ts @@ -14,7 +14,7 @@ import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-m import { HTTPAuthorizationHeader } from '../../../../../common/http_authorization_header'; import { getInstallation, getInstallationObject } from '../../packages'; -import type { Installation, RegistryPackage } from '../../../../types'; +import type { Installation } from '../../../../types'; import { ElasticsearchAssetType } from '../../../../types'; import { appContextService } from '../../../app_context'; @@ -23,20 +23,14 @@ import { PACKAGES_SAVED_OBJECT_TYPE } from '../../../../constants'; import { getESAssetMetadata } from '../meta'; import { createAppContextStartContractMock } from '../../../../mocks'; +import type { PackageInstallContext } from '../../../../../common/types'; import { installTransforms } from './install'; -import { getAsset } from './common'; jest.mock('../../packages/get', () => { return { getInstallation: jest.fn(), getInstallationObject: jest.fn() }; }); -jest.mock('./common', () => { - return { - getAsset: jest.fn(), - }; -}); - const meta = getESAssetMetadata({ packageName: 'endpoint' }); describe('test transform install', () => { @@ -236,13 +230,6 @@ _meta: }, ], } as unknown as Installation; - (getAsset as jest.MockedFunction) - .mockReturnValueOnce(Buffer.from(sourceData.BEATS_FIELDS, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.AGENT_FIELDS, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.FIELDS, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.MANIFEST, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.TRANSFORM, 'utf8')); - (getInstallation as jest.MockedFunction) .mockReturnValueOnce(Promise.resolve(previousInstallation)) .mockReturnValueOnce(Promise.resolve(currentInstallation)); @@ -271,17 +258,41 @@ _meta: }); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - } as unknown as RegistryPackage, - paths: [ - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/beats.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/agent.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', - ], + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + }, + paths: [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/beats.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/agent.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + ], + assetsMap: new Map([ + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/beats.yml', + sourceData.BEATS_FIELDS, + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/agent.yml', + sourceData.AGENT_FIELDS, + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', + sourceData.FIELDS, + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + sourceData.MANIFEST, + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + sourceData.TRANSFORM, + ], + ]), + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), @@ -530,10 +541,6 @@ _meta: }, ], } as unknown as Installation; - (getAsset as jest.MockedFunction) - .mockReturnValueOnce(Buffer.from(sourceData.FIELDS, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.MANIFEST, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.TRANSFORM, 'utf8')); (getInstallation as jest.MockedFunction) .mockReturnValueOnce(Promise.resolve(previousInstallation)) @@ -563,15 +570,31 @@ _meta: }); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - } as unknown as RegistryPackage, - paths: [ - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', - ], + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + }, + paths: [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + ], + assetsMap: new Map([ + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', + Buffer.from(sourceData.FIELDS), + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + Buffer.from(sourceData.MANIFEST), + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + Buffer.from(sourceData.TRANSFORM), + ], + ]), + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), @@ -810,10 +833,6 @@ _meta: }, ], } as unknown as Installation; - (getAsset as jest.MockedFunction) - .mockReturnValueOnce(Buffer.from(sourceData.FIELDS, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.TRANSFORM, 'utf8')); - (getInstallation as jest.MockedFunction) .mockReturnValueOnce(Promise.resolve(previousInstallation)) .mockReturnValueOnce(Promise.resolve(currentInstallation)); @@ -842,14 +861,26 @@ _meta: }); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - } as unknown as RegistryPackage, - paths: [ - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', - ], + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + }, + paths: [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + ], + assetsMap: new Map([ + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', + Buffer.from(sourceData.FIELDS), + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + Buffer.from(sourceData.TRANSFORM), + ], + ]), + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), @@ -1052,9 +1083,6 @@ _meta: }, ], } as unknown as Installation; - (getAsset as jest.MockedFunction) - .mockReturnValueOnce(Buffer.from(sourceData.MANIFEST, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.TRANSFORM, 'utf8')); (getInstallation as jest.MockedFunction) .mockReturnValueOnce(Promise.resolve(previousInstallation)) @@ -1069,14 +1097,26 @@ _meta: ); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - } as unknown as RegistryPackage, - paths: [ - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', - ], + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + }, + paths: [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + ], + assetsMap: new Map([ + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + sourceData.MANIFEST, + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + sourceData.TRANSFORM, + ], + ]), + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), @@ -1134,9 +1174,6 @@ _meta: }, ], } as unknown as Installation; - (getAsset as jest.MockedFunction) - .mockReturnValueOnce(Buffer.from(sourceData.MANIFEST, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.TRANSFORM, 'utf8')); (getInstallation as jest.MockedFunction) .mockReturnValueOnce(Promise.resolve(previousInstallation)) @@ -1162,14 +1199,26 @@ _meta: ); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - } as unknown as RegistryPackage, - paths: [ - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', - ], + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + }, + paths: [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + ], + assetsMap: new Map([ + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + sourceData.MANIFEST, + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + sourceData.TRANSFORM, + ], + ]), + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), @@ -1229,11 +1278,6 @@ _meta: ], } as unknown as Installation; - (getAsset as jest.MockedFunction) - .mockReturnValueOnce(Buffer.from(sourceData.FIELDS, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.MANIFEST, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.TRANSFORM, 'utf8')); - (getInstallation as jest.MockedFunction) .mockReturnValueOnce(Promise.resolve(previousInstallation)) .mockReturnValueOnce(Promise.resolve(currentInstallation)); @@ -1247,15 +1291,31 @@ _meta: ); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - } as unknown as RegistryPackage, - paths: [ - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', - ], + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + }, + paths: [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + ], + assetsMap: new Map([ + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', + sourceData.FIELDS, + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + sourceData.MANIFEST, + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + sourceData.TRANSFORM, + ], + ]), + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), diff --git a/x-pack/plugins/fleet/server/services/epm/fields/field.ts b/x-pack/plugins/fleet/server/services/epm/fields/field.ts index 495c0ddcaaf8a..859752d5dead1 100644 --- a/x-pack/plugins/fleet/server/services/epm/fields/field.ts +++ b/x-pack/plugins/fleet/server/services/epm/fields/field.ts @@ -7,8 +7,8 @@ import { safeLoad } from 'js-yaml'; -import type { PackageInfo } from '../../../types'; -import { getAssetsData } from '../packages/assets'; +import type { PackageInstallContext } from '../../../../common/types'; +import { getAssetsDataFromAssetsMap } from '../packages/assets'; // This should become a copy of https://github.com/elastic/beats/blob/d9a4c9c240a9820fab15002592e5bb6db318543b/libbeat/mapping/field.go#L39 export interface Field { @@ -296,11 +296,16 @@ export const isFields = (path: string) => { */ export const loadFieldsFromYaml = ( - pkg: Pick, + packageInstallContext: PackageInstallContext, datasetName?: string ): Field[] => { // Fetch all field definition files - const fieldDefinitionFiles = getAssetsData(pkg, isFields, datasetName); + const fieldDefinitionFiles = getAssetsDataFromAssetsMap( + packageInstallContext.packageInfo, + packageInstallContext.assetsMap, + isFields, + datasetName + ); return fieldDefinitionFiles.reduce((acc, file) => { // Make sure it is defined as it is optional. Should never happen. if (file.buffer) { diff --git a/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts b/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts index 27be17ef2a170..47c4da20b9d05 100644 --- a/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts @@ -22,7 +22,7 @@ import { partition } from 'lodash'; import type { IAssignmentService, ITagsClient } from '@kbn/saved-objects-tagging-plugin/server'; import { PACKAGES_SAVED_OBJECT_TYPE } from '../../../../../common'; -import { getAsset, getPathParts } from '../../archive'; +import { getAssetFromAssetsMap, getPathParts } from '../../archive'; import { KibanaAssetType, KibanaSavedObjectType } from '../../../../types'; import type { AssetType, @@ -32,6 +32,7 @@ import type { PackageSpecTags, } from '../../../../types'; import { savedObjectTypes } from '../../packages'; +import type { PackageInstallContext } from '../../../../../common/types'; import { indexPatternTypes, getIndexPatternSavedObjects, @@ -88,13 +89,6 @@ const AssetFilters: Record ArchiveAsse [KibanaAssetType.indexPattern]: removeReservedIndexPatterns, }; -export async function getKibanaAsset(key: string): Promise { - const buffer = getAsset(key); - - // cache values are buffers. convert to string / JSON - return JSON.parse(buffer.toString('utf8')); -} - export function createSavedObjectKibanaAsset(asset: ArchiveAsset): SavedObjectToBe { // convert that to an object const so: Partial = { @@ -177,6 +171,7 @@ export async function installKibanaAssetsAndReferences({ logger, pkgName, pkgTitle, + packageInstallContext, paths, installedPkg, spaceId, @@ -189,12 +184,13 @@ export async function installKibanaAssetsAndReferences({ logger: Logger; pkgName: string; pkgTitle: string; + packageInstallContext: PackageInstallContext; paths: string[]; installedPkg?: SavedObject; spaceId: string; assetTags?: PackageSpecTags[]; }) { - const kibanaAssets = await getKibanaAssets(paths); + const kibanaAssets = await getKibanaAssets(packageInstallContext); if (installedPkg) await deleteKibanaSavedObjectsAssets({ savedObjectsClient, installedPkg }); // save new kibana refs before installing the assets const installedKibanaAssetsRefs = await saveKibanaAssetsRefs( @@ -241,7 +237,7 @@ export const deleteKibanaInstalledRefs = async ( }); }; export async function getKibanaAssets( - paths: string[] + packageInstallContext: PackageInstallContext ): Promise> { const kibanaAssetTypes = Object.values(KibanaAssetType); const isKibanaAssetType = (path: string) => { @@ -250,7 +246,7 @@ export async function getKibanaAssets( return parts.service === 'kibana' && (kibanaAssetTypes as string[]).includes(parts.type); }; - const filteredPaths = paths + const filteredPaths = packageInstallContext.paths .filter(isKibanaAssetType) .map<[string, AssetParts]>((path) => [path, getPathParts(path)]); @@ -258,7 +254,16 @@ export async function getKibanaAssets( for (const assetType of kibanaAssetTypes) { const matching = filteredPaths.filter(([path, parts]) => parts.type === assetType); - assetArrays.push(Promise.all(matching.map(([path]) => path).map(getKibanaAsset))); + assetArrays.push( + Promise.all( + matching.map(([path]) => { + const buffer = getAssetFromAssetsMap(packageInstallContext.assetsMap, path); + + // cache values are buffers. convert to string / JSON + return JSON.parse(buffer.toString('utf8')); + }) + ) + ); } const resolvedAssets = await Promise.all(assetArrays); diff --git a/x-pack/plugins/fleet/server/services/epm/package_service.test.ts b/x-pack/plugins/fleet/server/services/epm/package_service.test.ts index 9da46439a53c7..8bd2ace1d760c 100644 --- a/x-pack/plugins/fleet/server/services/epm/package_service.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/package_service.test.ts @@ -34,6 +34,9 @@ import * as epmPackagesInstall from './packages/install'; import * as epmRegistry from './registry'; import * as epmTransformsInstall from './elasticsearch/transform/install'; import * as epmArchiveParse from './archive/parse'; +import { getEsPackage } from './archive/storage'; + +jest.mock('./archive/storage'); const mockGetAuthzFromRequest = getAuthzFromRequest as jest.Mock; const testKeys = [ @@ -141,8 +144,9 @@ function getTest( spy: jest.spyOn(epmTransformsInstall, 'installTransforms'), spyArgs: [ { - installablePackage: pkg, - paths, + packageInstallContext: expect.objectContaining({ + paths, + }), esClient: mocks.esClient, savedObjectsClient: mocks.soClient, logger: mocks.logger, @@ -257,6 +261,12 @@ describe('PackageService', () => { testKey ); spy.mockResolvedValue(spyResponse); + if (testKey === 'reinstallEsAssets') { + jest + .mocked(epmPackagesGet.getInstallation) + .mockResolvedValue({ name: 'package name' } as any); + jest.mocked(getEsPackage).mockResolvedValue({ name: 'package name' } as any); + } await expect(method(...args)).resolves.toEqual(expectedReturnValue); expect(spy).toHaveBeenCalledWith(...spyArgs); @@ -277,6 +287,12 @@ describe('PackageService', () => { testKey ); spy.mockResolvedValue(spyResponse); + if (testKey === 'reinstallEsAssets') { + jest + .mocked(epmPackagesGet.getInstallation) + .mockResolvedValue({ name: 'package name' } as any); + jest.mocked(getEsPackage).mockResolvedValue({ name: 'package name' } as any); + } await expect(method(...args)).resolves.toEqual(expectedReturnValue); expect(spy).toHaveBeenCalledWith(...spyArgs); diff --git a/x-pack/plugins/fleet/server/services/epm/package_service.ts b/x-pack/plugins/fleet/server/services/epm/package_service.ts index a535af9636d1a..b7174fa7883e7 100644 --- a/x-pack/plugins/fleet/server/services/epm/package_service.ts +++ b/x-pack/plugins/fleet/server/services/epm/package_service.ts @@ -31,7 +31,7 @@ import type { } from '../../types'; import type { FleetAuthzRouteConfig } from '../security/types'; import { checkSuperuser, doesNotHaveRequiredFleetAuthz, getAuthzFromRequest } from '../security'; -import { FleetError, FleetUnauthorizedError } from '../../errors'; +import { FleetError, FleetUnauthorizedError, PackageNotFoundError } from '../../errors'; import { INSTALL_PACKAGES_AUTHZ, READ_PACKAGE_INFO_AUTHZ } from '../../routes/epm'; import type { InstallResult } from '../../../common'; @@ -43,6 +43,7 @@ import { fetchFindLatestPackageOrThrow, getPackage } from './registry'; import { installTransforms, isTransform } from './elasticsearch/transform/install'; import { ensureInstalledPackage, getInstallation, getPackages, installPackage } from './packages'; import { generatePackageInfoFromArchiveBuffer } from './archive'; +import { getEsPackage } from './archive/storage'; export type InstalledAssetType = EsAssetReference; @@ -265,9 +266,31 @@ class PackageClientImpl implements PackageClient { async #reinstallTransforms(packageInfo: InstallablePackage, paths: string[]) { const authorizationHeader = this.getAuthorizationHeader(); + const installation = await this.getInstallation(packageInfo.name); + + if (!installation) { + throw new PackageNotFoundError(`Installation not found for package: ${packageInfo.name}`); + } + + const esPackage = await getEsPackage( + packageInfo.name, + packageInfo.version, + installation.package_assets ?? [], + this.internalSoClient + ); + + if (!esPackage) { + throw new PackageNotFoundError(`ES package not found for package: ${packageInfo.name}`); + } + + const { assetsMap } = esPackage; + const { installedTransforms } = await installTransforms({ - installablePackage: packageInfo, - paths, + packageInstallContext: { + assetsMap, + packageInfo, + paths, + }, esClient: this.internalEsClient, savedObjectsClient: this.internalSoClient, logger: this.logger, diff --git a/x-pack/plugins/fleet/server/services/epm/packages/_install_package.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/_install_package.test.ts index 4402db72b86a9..3b06d9b2b3cd8 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/_install_package.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/_install_package.test.ts @@ -22,7 +22,7 @@ import { PACKAGES_SAVED_OBJECT_TYPE } from '../../../../common'; import { appContextService } from '../../app_context'; import { createAppContextStartContractMock } from '../../../mocks'; -import { saveArchiveEntries } from '../archive/storage'; +import { saveArchiveEntriesFromAssetsMap } from '../archive/storage'; import { installILMPolicy } from '../elasticsearch/ilm/install'; import { installIlmForDataStream } from '../elasticsearch/datastream_ilm/install'; @@ -78,7 +78,7 @@ describe('_installPackage', () => { esReferences: [], installedIlms: [], }); - jest.mocked(saveArchiveEntries).mockResolvedValue({ + jest.mocked(saveArchiveEntriesFromAssetsMap).mockResolvedValue({ saved_objects: [], }); jest.mocked(restartInstallation).mockReset(); @@ -103,18 +103,21 @@ describe('_installPackage', () => { savedObjectsImporter: jest.fn(), esClient, logger: loggerMock.create(), - paths: [], - packageInfo: { - title: 'title', - name: 'xyz', - version: '4.5.6', - description: 'test', - type: 'integration', - categories: ['cloud', 'custom'], - format_version: 'string', - release: 'experimental', - conditions: { kibana: { version: 'x.y.z' } }, - owner: { github: 'elastic/fleet' }, + packageInstallContext: { + assetsMap: new Map(), + paths: [], + packageInfo: { + title: 'title', + name: 'xyz', + version: '4.5.6', + description: 'test', + type: 'integration', + categories: ['cloud', 'custom'], + format_version: 'string', + release: 'experimental', + conditions: { kibana: { version: 'x.y.z' } }, + owner: { github: 'elastic/fleet' }, + }, }, installType: 'install', installSource: 'registry', @@ -160,18 +163,21 @@ describe('_installPackage', () => { savedObjectsImporter: jest.fn(), esClient, logger: loggerMock.create(), - paths: [], - packageInfo: { - title: 'title', - name: 'xyz', - version: '4.5.6', - description: 'test', - type: 'integration', - categories: ['cloud', 'custom'], - format_version: 'string', - release: 'experimental', - conditions: { kibana: { version: 'x.y.z' } }, - owner: { github: 'elastic/fleet' }, + packageInstallContext: { + assetsMap: new Map(), + paths: [], + packageInfo: { + title: 'title', + name: 'xyz', + version: '4.5.6', + description: 'test', + type: 'integration', + categories: ['cloud', 'custom'], + format_version: 'string', + release: 'experimental', + conditions: { kibana: { version: 'x.y.z' } }, + owner: { github: 'elastic/fleet' }, + }, }, installType: 'install', installSource: 'registry', @@ -219,18 +225,21 @@ describe('_installPackage', () => { savedObjectsImporter: jest.fn(), esClient, logger: loggerMock.create(), - paths: [], - packageInfo: { - title: 'title', - name: 'xyz', - version: '4.5.6', - description: 'test', - type: 'integration', - categories: ['cloud', 'custom'], - format_version: 'string', - release: 'experimental', - conditions: { kibana: { version: 'x.y.z' } }, - owner: { github: 'elastic/fleet' }, + packageInstallContext: { + packageInfo: { + title: 'title', + name: 'xyz', + version: '4.5.6', + description: 'test', + type: 'integration', + categories: ['cloud', 'custom'], + format_version: 'string', + release: 'experimental', + conditions: { kibana: { version: 'x.y.z' } }, + owner: { github: 'elastic/fleet' }, + } as any, + assetsMap: new Map(), + paths: [], }, installType: 'install', installSource: 'registry', @@ -288,12 +297,15 @@ describe('_installPackage', () => { savedObjectsImporter: jest.fn(), esClient, logger: loggerMock.create(), - paths: [], - packageInfo: { - name: mockInstalledPackageSo.attributes.name, - version: mockInstalledPackageSo.attributes.version, - title: mockInstalledPackageSo.attributes.name, - } as any, + packageInstallContext: { + paths: [], + assetsMap: new Map(), + packageInfo: { + name: mockInstalledPackageSo.attributes.name, + version: mockInstalledPackageSo.attributes.version, + title: mockInstalledPackageSo.attributes.name, + } as any, + }, installedPkg: { ...mockInstalledPackageSo, attributes: { @@ -319,12 +331,15 @@ describe('_installPackage', () => { savedObjectsImporter: jest.fn(), esClient, logger: loggerMock.create(), - paths: [], - packageInfo: { - name: mockInstalledPackageSo.attributes.name, - version: mockInstalledPackageSo.attributes.version, - title: mockInstalledPackageSo.attributes.name, - } as any, + packageInstallContext: { + paths: [], + assetsMap: new Map(), + packageInfo: { + name: mockInstalledPackageSo.attributes.name, + version: mockInstalledPackageSo.attributes.version, + title: mockInstalledPackageSo.attributes.name, + } as any, + }, installedPkg: { ...mockInstalledPackageSo, attributes: { @@ -345,12 +360,15 @@ describe('_installPackage', () => { savedObjectsImporter: jest.fn(), esClient, logger: loggerMock.create(), - paths: [], - packageInfo: { - name: mockInstalledPackageSo.attributes.name, - version: mockInstalledPackageSo.attributes.version, - title: mockInstalledPackageSo.attributes.name, - } as any, + packageInstallContext: { + paths: [], + assetsMap: new Map(), + packageInfo: { + name: mockInstalledPackageSo.attributes.name, + version: mockInstalledPackageSo.attributes.version, + title: mockInstalledPackageSo.attributes.name, + } as any, + }, installedPkg: { ...mockInstalledPackageSo, attributes: { diff --git a/x-pack/plugins/fleet/server/services/epm/packages/_install_package.ts b/x-pack/plugins/fleet/server/services/epm/packages/_install_package.ts index 8f45e8eee6b13..fdcf51db71867 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/_install_package.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/_install_package.ts @@ -17,7 +17,7 @@ import { SavedObjectsErrorHelpers } from '@kbn/core/server'; import type { IAssignmentService, ITagsClient } from '@kbn/saved-objects-tagging-plugin/server'; import type { HTTPAuthorizationHeader } from '../../../../common/http_authorization_header'; - +import type { PackageInstallContext } from '../../../../common/types'; import { getNormalizedDataStreams } from '../../../../common/services'; import { @@ -31,7 +31,6 @@ import type { AssetReference, Installation, InstallType, - InstallablePackage, InstallSource, PackageAssetReference, PackageVerificationResult, @@ -45,7 +44,7 @@ import { updateCurrentWriteIndices } from '../elasticsearch/template/template'; import { installTransforms } from '../elasticsearch/transform/install'; import { installMlModel } from '../elasticsearch/ml_model'; import { installIlmForDataStream } from '../elasticsearch/datastream_ilm/install'; -import { saveArchiveEntries } from '../archive/storage'; +import { saveArchiveEntriesFromAssetsMap } from '../archive/storage'; import { ConcurrentInstallOperationError } from '../../../errors'; import { appContextService, packagePolicyService } from '../..'; @@ -70,8 +69,7 @@ export async function _installPackage({ esClient, logger, installedPkg, - paths, - packageInfo, + packageInstallContext, installType, installSource, spaceId, @@ -88,8 +86,7 @@ export async function _installPackage({ esClient: ElasticsearchClient; logger: Logger; installedPkg?: SavedObject; - paths: string[]; - packageInfo: InstallablePackage; + packageInstallContext: PackageInstallContext; installType: InstallType; installSource: InstallSource; spaceId: string; @@ -99,7 +96,9 @@ export async function _installPackage({ ignoreMappingUpdateErrors?: boolean; skipDataStreamRollover?: boolean; }): Promise { + const { packageInfo, paths } = packageInstallContext; const { name: pkgName, version: pkgVersion, title: pkgTitle } = packageInfo; + try { // if some installation already exists if (installedPkg) { @@ -164,6 +163,7 @@ export async function _installPackage({ savedObjectTagClient, pkgName, pkgTitle, + packageInstallContext, paths, installedPkg, logger, @@ -187,13 +187,12 @@ export async function _installPackage({ appContextService.getConfig()?.internal?.disableILMPolicies ?? false; if (!isILMPoliciesDisabled) { esReferences = await withPackageSpan('Install ILM policies', () => - installILMPolicy(packageInfo, paths, esClient, savedObjectsClient, logger, esReferences) + installILMPolicy(packageInstallContext, esClient, savedObjectsClient, logger, esReferences) ); logger.debug(`Package install - Installing Data Stream ILM policies`); ({ esReferences } = await withPackageSpan('Install Data Stream ILM policies', () => installIlmForDataStream( - packageInfo, - paths, + packageInstallContext, esClient, savedObjectsClient, logger, @@ -205,7 +204,7 @@ export async function _installPackage({ // installs ml models logger.debug(`Package install - installing ML models`); esReferences = await withPackageSpan('Install ML models', () => - installMlModel(packageInfo, paths, esClient, savedObjectsClient, logger, esReferences) + installMlModel(packageInstallContext, esClient, savedObjectsClient, logger, esReferences) ); let indexTemplates: IndexTemplateEntry[] = []; @@ -217,8 +216,7 @@ export async function _installPackage({ const { installedTemplates, esReferences: templateEsReferences } = await installIndexTemplatesAndPipelines({ installedPkg: installedPkg ? installedPkg.attributes : undefined, - packageInfo, - paths, + packageInstallContext, esClient, savedObjectsClient, logger, @@ -249,8 +247,7 @@ export async function _installPackage({ const { installedTemplates, esReferences: templateEsReferences } = await installIndexTemplatesAndPipelines({ installedPkg: installedPkg ? installedPkg.attributes : undefined, - packageInfo, - paths, + packageInstallContext, esClient, savedObjectsClient, logger, @@ -280,8 +277,7 @@ export async function _installPackage({ logger.debug(`Package install - Installing transforms`); ({ esReferences } = await withPackageSpan('Install transforms', () => installTransforms({ - installablePackage: packageInfo, - paths, + packageInstallContext, esClient, savedObjectsClient, logger, @@ -331,9 +327,10 @@ export async function _installPackage({ const installedKibanaAssetsRefs = await kibanaAssetPromise; logger.debug(`Package install - Updating archive entries`); const packageAssetResults = await withPackageSpan('Update archive entries', () => - saveArchiveEntries({ + saveArchiveEntriesFromAssetsMap({ savedObjectsClient, - paths, + assetsMap: packageInstallContext.assetsMap, + paths: packageInstallContext.paths, packageInfo, installSource, }) diff --git a/x-pack/plugins/fleet/server/services/epm/packages/assets.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/assets.test.ts index 1ed525a71b14f..fdddadddd46ec 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/assets.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/assets.test.ts @@ -7,19 +7,9 @@ import type { PackageInfo } from '../../../types'; -import { getArchiveFilelist } from '../archive/cache'; +import { getAssetsFromAssetsMap } from './assets'; -import { getAssets } from './assets'; - -jest.mock('../archive/cache', () => { - return { - getArchiveFilelist: jest.fn(), - }; -}); - -const mockedGetArchiveFilelist = getArchiveFilelist as jest.Mock; - -test('testGetAssets integration pkg', () => { +test('test getAssetsFromAssetsMap integration pkg', () => { const tests = [ { package: { @@ -60,27 +50,41 @@ test('testGetAssets integration pkg', () => { }, ]; - mockedGetArchiveFilelist.mockImplementation(() => [ - 'coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-plaintext.json', - 'coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-json.json', + const assetsMap = new Map([ + [ + 'coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-plaintext.json', + Buffer.from('{}'), + ], + [ + 'coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-json.json', + Buffer.from('{}'), + ], ]); + for (const value of tests) { // as needed to pretend it is an InstallablePackage - const assets = getAssets(value.package as PackageInfo, value.filter, value.dataset); + const assets = getAssetsFromAssetsMap( + value.package as PackageInfo, + assetsMap, + value.filter, + value.dataset + ); expect(assets).toStrictEqual(value.expected); } }); test('testGetAssets input pkg', () => { - mockedGetArchiveFilelist.mockImplementation(() => [ - 'input_package_upgrade-1.0.0/agent/input/input.yml.hbs', - 'input_package_upgrade-1.0.0/changelog.yml', - 'input_package_upgrade-1.0.0/docs/README.md', - 'input_package_upgrade-1.0.0/fields/input.yml', - 'input_package_upgrade-1.0.0/img/sample-logo.svg', - 'input_package_upgrade-1.0.0/img/sample-screenshot.png', - 'input_package_upgrade-1.0.0/manifest.yml', - ]); + const assetsMap = new Map( + [ + 'input_package_upgrade-1.0.0/agent/input/input.yml.hbs', + 'input_package_upgrade-1.0.0/changelog.yml', + 'input_package_upgrade-1.0.0/docs/README.md', + 'input_package_upgrade-1.0.0/fields/input.yml', + 'input_package_upgrade-1.0.0/img/sample-logo.svg', + 'input_package_upgrade-1.0.0/img/sample-screenshot.png', + 'input_package_upgrade-1.0.0/manifest.yml', + ].map((path) => [path, Buffer.from('{}')]) + ); const tests = [ { @@ -102,7 +106,12 @@ test('testGetAssets input pkg', () => { for (const value of tests) { // as needed to pretend it is an InstallablePackage - const assets = getAssets(value.package as PackageInfo, value.filter, value.dataset); + const assets = getAssetsFromAssetsMap( + value.package as PackageInfo, + assetsMap, + value.filter, + value.dataset + ); expect(assets).toStrictEqual(value.expected); } }); diff --git a/x-pack/plugins/fleet/server/services/epm/packages/assets.ts b/x-pack/plugins/fleet/server/services/epm/packages/assets.ts index 89bd9b25af75a..a82b5c0d103b2 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/assets.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/assets.ts @@ -5,8 +5,8 @@ * 2.0. */ -import type { PackageInfo } from '../../../types'; -import { getArchiveFilelist, getAsset } from '../archive'; +import type { AssetsMap, PackageInfo } from '../../../types'; +import { getAssetFromAssetsMap } from '../archive'; import type { ArchiveEntry } from '../archive'; const maybeFilterByDataset = @@ -21,18 +21,13 @@ const maybeFilterByDataset = return comparePaths.some((comparePath) => path.includes(comparePath)); }; -// paths from RegistryPackage are routes to the assets on EPR -// e.g. `/package/nginx/1.2.0/data_stream/access/fields/fields.yml` -// paths for ArchiveEntry are routes to the assets in the archive -// e.g. `nginx-1.2.0/data_stream/access/fields/fields.yml` -// RegistryPackage paths have a `/package/` prefix compared to ArchiveEntry paths -// and different package and version structure -export function getAssets( +export function getAssetsFromAssetsMap( packageInfo: Pick, + assetsMap: AssetsMap, filter = (path: string): boolean => true, datasetName?: string ): string[] { - const paths = getArchiveFilelist(packageInfo); + const paths = [...assetsMap.keys()]; if (!paths || paths.length === 0) return []; @@ -46,15 +41,15 @@ export function getAssets( return assets.filter(filter); } -export function getAssetsData( +export function getAssetsDataFromAssetsMap( packageInfo: Pick, + assetsMap: AssetsMap, filter = (path: string): boolean => true, datasetName?: string -): ArchiveEntry[] { - // Gather all asset data - const assets = getAssets(packageInfo, filter, datasetName); +) { + const assets = getAssetsFromAssetsMap(packageInfo, assetsMap, filter, datasetName); const entries: ArchiveEntry[] = assets.map((path) => { - const buffer = getAsset(path); + const buffer = getAssetFromAssetsMap(assetsMap, path); return { path, buffer }; }); diff --git a/x-pack/plugins/fleet/server/services/epm/packages/custom_integrations/assets/cache.ts b/x-pack/plugins/fleet/server/services/epm/packages/custom_integrations/assets/cache.ts deleted file mode 100644 index e44f6e2b522d7..0000000000000 --- a/x-pack/plugins/fleet/server/services/epm/packages/custom_integrations/assets/cache.ts +++ /dev/null @@ -1,24 +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 { setArchiveEntry, setArchiveFilelist } from '../../../archive'; - -interface Assets { - path: string; - content: Buffer; -} -export const cacheAssets = (assets: Assets[], name: string, version: string) => { - const paths = assets.map((asset) => asset.path); - - setArchiveFilelist({ name, version }, paths); - - assets.forEach((asset) => { - setArchiveEntry(asset.path, asset.content); - }); - - return paths; -}; diff --git a/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts index b261ccd65b5f9..66e220c328b5f 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts @@ -425,11 +425,53 @@ test: invalid manifest page: 1, }); - soClient.get.mockResolvedValue({ - id: 'elasticsearch', - attributes: {}, - references: [], - type: PACKAGES_SAVED_OBJECT_TYPE, + soClient.get.mockImplementation((type) => { + if (type === 'epm-packages-assets') { + return Promise.resolve({ + attributes: { + data_utf8: ` +name: elasticsearch +version: 0.0.1 +title: Elastic +description: Elasticsearch description`, + }, + } as any); + } else { + return Promise.resolve({ + id: 'elasticsearch', + attributes: { + name: 'elasticsearch', + version: '0.0.1', + install_source: 'upload', + package_assets: [], + data_utf8: ` + name: elasticsearch + version: 0.0.1 + title: Elastic + description: Elasticsearch description`, + }, + }); + } + }); + + soClient.bulkGet.mockResolvedValue({ + saved_objects: [ + { + id: 'test', + references: [], + type: 'epm-package-assets', + attributes: { + asset_path: 'elasticsearch-0.0.1/manifest.yml', + data_utf8: ` +name: elasticsearch +version: 0.0.1 +title: Elastic +description: Elasticsearch description +format_version: 0.0.1 +owner: elastic`, + }, + }, + ], }); await getPackages({ savedObjectsClient: soClient }); @@ -783,6 +825,7 @@ test: invalid manifest } as RegistryPackage); MockRegistry.getPackage.mockResolvedValue({ paths: [], + assetsMap: new Map(), packageInfo: { name: 'my-package', version: '1.0.0', diff --git a/x-pack/plugins/fleet/server/services/epm/packages/get.ts b/x-pack/plugins/fleet/server/services/epm/packages/get.ts index a3ed5f62d7f1e..614fc8d636816 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/get.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/get.ts @@ -33,6 +33,7 @@ import type { PackageList, InstalledPackage, PackageSpecManifest, + AssetsMap, } from '../../../../common/types'; import { PACKAGES_SAVED_OBJECT_TYPE } from '../../../constants'; import type { @@ -53,7 +54,6 @@ import { appContextService } from '../..'; import * as Registry from '../registry'; import type { PackageAsset } from '../archive/storage'; import { getEsPackage } from '../archive/storage'; -import { getArchivePackage } from '../archive'; import { normalizeKuery } from '../../saved_object'; import { auditLoggingService } from '../../audit_logging'; @@ -289,7 +289,7 @@ export async function getPackageSavedObjects( return result; } -export async function getInstalledPackageSavedObjects( +async function getInstalledPackageSavedObjects( savedObjectsClient: SavedObjectsClientContract, options: Omit ) { @@ -544,16 +544,6 @@ export async function getPackageFromSource(options: { // If the package is installed if (installedPkg && installedPkg.version === pkgVersion) { const { install_source: pkgInstallSource } = installedPkg; - // check cache - res = getArchivePackage({ - name: pkgName, - version: pkgVersion, - }); - - if (res) { - logger.debug(`retrieved installed package ${pkgName}-${pkgVersion} from cache`); - } - if (!res && installedPkg.package_assets) { res = await getEsPackage( pkgName, @@ -582,20 +572,14 @@ export async function getPackageFromSource(options: { } } } else { - res = getArchivePackage({ name: pkgName, version: pkgVersion }); - - if (res) { - logger.debug(`retrieved package ${pkgName}-${pkgVersion} from cache`); - } else { - try { - res = await Registry.getPackage(pkgName, pkgVersion, { ignoreUnverified }); - logger.debug(`retrieved package ${pkgName}-${pkgVersion} from registry`); - } catch (err) { - if (err instanceof RegistryResponseError && err.status === 404) { - res = await Registry.getBundledArchive(pkgName, pkgVersion); - } else { - throw err; - } + try { + res = await Registry.getPackage(pkgName, pkgVersion, { ignoreUnverified }); + logger.debug(`retrieved package ${pkgName}-${pkgVersion} from registry`); + } catch (err) { + if (err instanceof RegistryResponseError && err.status === 404) { + res = await Registry.getBundledArchive(pkgName, pkgVersion); + } else { + throw err; } } } @@ -634,7 +618,7 @@ export async function getInstallationObject(options: { return installation; } -export async function getInstallationObjects(options: { +async function getInstallationObjects(options: { savedObjectsClient: SavedObjectsClientContract; pkgNames: string[]; }) { @@ -665,6 +649,37 @@ export async function getInstallation(options: { return savedObject?.attributes; } +/** + * Return an installed package with his related assets + */ +export async function getInstalledPackageWithAssets(options: { + savedObjectsClient: SavedObjectsClientContract; + pkgName: string; + logger?: Logger; +}) { + const installation = await getInstallation(options); + if (!installation) { + return; + } + const esPackage = await getEsPackage( + installation.name, + installation.version, + installation.package_assets ?? [], + options.savedObjectsClient + ); + + if (!esPackage) { + return; + } + + return { + installation, + assetsMap: esPackage.assetsMap, + packageInfo: esPackage.packageInfo, + paths: esPackage.paths, + }; +} + export async function getInstallationsByName(options: { savedObjectsClient: SavedObjectsClientContract; pkgNames: string[]; @@ -682,3 +697,33 @@ function sortByName(a: { name: string }, b: { name: string }) { return 0; } } + +/** + * Return assets for an installed package from ES or from the registry otherwise + */ +export async function getPackageAssetsMap({ + savedObjectsClient, + packageInfo, + logger, +}: { + savedObjectsClient: SavedObjectsClientContract; + packageInfo: PackageInfo; + logger: Logger; +}) { + const installedPackageWithAssets = await getInstalledPackageWithAssets({ + savedObjectsClient, + pkgName: packageInfo.name, + logger, + }); + + let assetsMap: AssetsMap | undefined; + if (installedPackageWithAssets?.installation.version !== packageInfo.version) { + // Try to get from registry + const pkg = await Registry.getPackage(packageInfo.name, packageInfo.version); + assetsMap = pkg.assetsMap; + } else { + assetsMap = installedPackageWithAssets.assetsMap; + } + + return assetsMap; +} diff --git a/x-pack/plugins/fleet/server/services/epm/packages/get_template_inputs.ts b/x-pack/plugins/fleet/server/services/epm/packages/get_template_inputs.ts index 04c65535ad0ad..e81e280c4b943 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/get_template_inputs.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/get_template_inputs.ts @@ -11,7 +11,7 @@ import { safeDump } from 'js-yaml'; import { packageToPackagePolicy } from '../../../../common/services/package_to_package_policy'; import { getInputsWithStreamIds, _compilePackagePolicyInputs } from '../../package_policy'; - +import { appContextService } from '../../app_context'; import type { PackageInfo, NewPackagePolicy, @@ -22,6 +22,7 @@ import type { import { _sortYamlKeys } from '../../../../common/services/full_agent_policy_to_yaml'; import { getPackageInfo } from '.'; +import { getPackageAssetsMap } from './get'; type Format = 'yml' | 'json'; @@ -89,11 +90,16 @@ export async function getTemplateInputs( } const emptyPackagePolicy = packageToPackagePolicy(packageInfo, ''); const inputsWithStreamIds = getInputsWithStreamIds(emptyPackagePolicy, undefined, true); - + const assetsMap = await getPackageAssetsMap({ + logger: appContextService.getLogger(), + packageInfo, + savedObjectsClient: soClient, + }); const compiledInputs = await _compilePackagePolicyInputs( packageInfo, emptyPackagePolicy.vars || {}, - inputsWithStreamIds + inputsWithStreamIds, + assetsMap ); const packagePolicyWithInputs: NewPackagePolicy = { ...emptyPackagePolicy, diff --git a/x-pack/plugins/fleet/server/services/epm/packages/install.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/install.test.ts index bfb99d0f17980..fc85609c4703c 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/install.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/install.test.ts @@ -28,6 +28,11 @@ import * as obj from '.'; jest.mock('../../app_context', () => { const logger = { error: jest.fn(), debug: jest.fn(), warn: jest.fn(), info: jest.fn() }; + const mockedSavedObjectTagging = { + createInternalAssignmentService: jest.fn(), + createTagClient: jest.fn(), + }; + return { appContextService: { getLogger: jest.fn(() => { @@ -38,13 +43,12 @@ jest.mock('../../app_context', () => { createImporter: jest.fn(), })), getConfig: jest.fn(() => ({})), - getSavedObjectsTagging: jest.fn(() => ({ - createInternalAssignmentService: jest.fn(), - createTagClient: jest.fn(), - })), + getSavedObjectsTagging: jest.fn(() => mockedSavedObjectTagging), + getInternalUserSOClientForSpaceId: jest.fn(), }, }; }); + jest.mock('.'); jest.mock('../registry', () => { return { @@ -73,7 +77,12 @@ jest.mock('../archive', () => { generatePackageInfoFromArchiveBuffer: jest.fn(() => Promise.resolve({ packageInfo: { name: 'apache', version: '1.3.0' } }) ), - unpackBufferToCache: jest.fn(), + unpackBufferToAssetsMap: jest.fn(() => + Promise.resolve({ + assetsMap: new Map(), + paths: [], + }) + ), setPackageInfo: jest.fn(), deleteVerificationResult: jest.fn(), }; @@ -145,6 +154,7 @@ describe('install', () => { mockGetBundledPackageByPkgKey.mockReset(); (install._installPackage as jest.Mock).mockClear(); + jest.mocked(appContextService.getInternalUserSOClientForSpaceId).mockReset(); }); describe('registry', () => { @@ -348,6 +358,38 @@ describe('install', () => { expect(response.status).toEqual('installed'); }); + + it('should use a scopped to package space soClient for tagging', async () => { + const mockedTaggingSo = savedObjectsClientMock.create(); + jest + .mocked(appContextService.getInternalUserSOClientForSpaceId) + .mockReturnValue(mockedTaggingSo); + jest + .spyOn(obj, 'getInstallationObject') + .mockImplementationOnce(() => Promise.resolve({ attributes: { version: '1.2.0' } } as any)); + jest.spyOn(licenseService, 'hasAtLeast').mockReturnValue(true); + await installPackage({ + spaceId: 'test', + installSource: 'registry', + pkgkey: 'apache-1.3.0', + savedObjectsClient: savedObjectsClientMock.create(), + esClient: {} as ElasticsearchClient, + }); + + expect(appContextService.getInternalUserSOClientForSpaceId).toBeCalledWith('test'); + expect(appContextService.getSavedObjectsTagging().createTagClient).toBeCalledWith( + expect.objectContaining({ + client: mockedTaggingSo, + }) + ); + expect( + appContextService.getSavedObjectsTagging().createInternalAssignmentService + ).toBeCalledWith( + expect.objectContaining({ + client: mockedTaggingSo, + }) + ); + }); }); describe('upload', () => { @@ -516,7 +558,9 @@ describe('handleInstallPackageFailure', () => { expect(install._installPackage).toBeCalledTimes(1); expect(install._installPackage).toBeCalledWith( expect.objectContaining({ - packageInfo: expect.objectContaining({ name: pkgName, version: '1.0.0' }), + packageInstallContext: expect.objectContaining({ + packageInfo: expect.objectContaining({ name: pkgName, version: '1.0.0' }), + }), }) ); }); @@ -560,7 +604,9 @@ describe('handleInstallPackageFailure', () => { expect(install._installPackage).toBeCalledTimes(1); expect(install._installPackage).toBeCalledWith( expect.objectContaining({ - packageInfo: expect.objectContaining({ name: pkgName, version: '1.0.0' }), + packageInstallContext: expect.objectContaining({ + packageInfo: expect.objectContaining({ name: pkgName, version: '1.0.0' }), + }), }) ); }); diff --git a/x-pack/plugins/fleet/server/services/epm/packages/install.ts b/x-pack/plugins/fleet/server/services/epm/packages/install.ts index 33f1b3a6ab73e..8dc9672f01ffc 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/install.ts @@ -16,25 +16,16 @@ import type { Logger, } from '@kbn/core/server'; import { SavedObjectsErrorHelpers } from '@kbn/core/server'; - import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common/constants'; - import pRetry from 'p-retry'; - import { uniqBy } from 'lodash'; - import type { LicenseType } from '@kbn/licensing-plugin/server'; -import type { PackageDataStreamTypes } from '../../../../common/types'; - +import type { PackageDataStreamTypes, PackageInstallContext } from '../../../../common/types'; import type { HTTPAuthorizationHeader } from '../../../../common/http_authorization_header'; - import { isPackagePrerelease, getNormalizedDataStreams } from '../../../../common/services'; - import { FLEET_INSTALL_FORMAT_VERSION } from '../../../constants/fleet_es_assets'; - import { generateESIndexPatterns } from '../elasticsearch/template/template'; - import type { ArchivePackage, BulkInstallPackageInfo, @@ -62,7 +53,6 @@ import { PackagePolicyValidationError, ConcurrentInstallOperationError, FleetUnauthorizedError, - PackageInvalidArchiveError, PackageNotFoundError, } from '../../../errors'; import { PACKAGES_SAVED_OBJECT_TYPE, MAX_TIME_COMPLETE_INSTALL } from '../../../constants'; @@ -72,29 +62,22 @@ import * as Registry from '../registry'; import { setPackageInfo, generatePackageInfoFromArchiveBuffer, - unpackBufferToCache, deleteVerificationResult, - getArchiveFilelist, + unpackBufferToAssetsMap, } from '../archive'; import { toAssetReference } from '../kibana/assets/install'; import type { ArchiveAsset } from '../kibana/assets/install'; - import type { PackageUpdateEvent } from '../../upgrade_sender'; import { sendTelemetryEvents, UpdateEventType } from '../../upgrade_sender'; - import { prepareToInstallPipelines } from '../elasticsearch/ingest_pipeline'; - import { prepareToInstallTemplates } from '../elasticsearch/template/install'; - import { auditLoggingService } from '../../audit_logging'; - import { getFilteredInstallPackages } from '../filtered_packages'; import { formatVerificationResultForSO } from './package_verification'; - import { getInstallation, getInstallationObject } from '.'; import { removeInstallation } from './remove'; -import { getPackageSavedObjects } from './get'; +import { getInstalledPackageWithAssets, getPackageSavedObjects } from './get'; import { _installPackage } from './_install_package'; import { removeOldAssets } from './cleanup'; import { getBundledPackageByPkgKey } from './bundled_packages'; @@ -102,7 +85,6 @@ import { withPackageSpan } from './utils'; import { convertStringToTitle, generateDescription } from './custom_integrations/utils'; import { INITIAL_VERSION } from './custom_integrations/constants'; import { createAssets } from './custom_integrations'; -import { cacheAssets } from './custom_integrations/assets/cache'; import { generateDatastreamEntries } from './custom_integrations/assets/dataset/utils'; import { checkForNamingCollision } from './custom_integrations/validation/check_naming_collision'; import { checkDatasetsNameFormat } from './custom_integrations/validation/check_dataset_name_format'; @@ -417,12 +399,19 @@ async function installPackageFromRegistry({ } // get latest package version and requested version in parallel for performance - const [latestPackage, { paths, packageInfo, verificationResult }] = await Promise.all([ - latestPkg ? Promise.resolve(latestPkg) : queryLatest(), - Registry.getPackage(pkgName, pkgVersion, { - ignoreUnverified: force && !neverIgnoreVerificationError, - }), - ]); + const [latestPackage, { paths, packageInfo, assetsMap, verificationResult }] = + await Promise.all([ + latestPkg ? Promise.resolve(latestPkg) : queryLatest(), + Registry.getPackage(pkgName, pkgVersion, { + ignoreUnverified: force && !neverIgnoreVerificationError, + }), + ]); + + const packageInstallContext: PackageInstallContext = { + packageInfo, + assetsMap, + paths, + }; // let the user install if using the force flag or needing to reinstall or install a previous version due to failed update const installOutOfDateVersionOk = @@ -453,7 +442,7 @@ async function installPackageFromRegistry({ esClient, spaceId, force, - packageInfo, + packageInstallContext, paths, verificationResult, authorizationHeader, @@ -489,7 +478,7 @@ async function installPackageCommon(options: { esClient: ElasticsearchClient; spaceId: string; force?: boolean; - packageInfo: ArchivePackage; + packageInstallContext: PackageInstallContext; paths: string[]; verificationResult?: PackageVerificationResult; telemetryEvent?: PackageUpdateEvent; @@ -497,6 +486,8 @@ async function installPackageCommon(options: { ignoreMappingUpdateErrors?: boolean; skipDataStreamRollover?: boolean; }): Promise { + const packageInfo = options.packageInstallContext.packageInfo; + const { pkgName, pkgVersion, @@ -507,12 +498,11 @@ async function installPackageCommon(options: { force, esClient, spaceId, - packageInfo, - paths, verificationResult, authorizationHeader, ignoreMappingUpdateErrors, skipDataStreamRollover, + packageInstallContext, } = options; let { telemetryEvent } = options; const logger = appContextService.getLogger(); @@ -578,13 +568,16 @@ async function installPackageCommon(options: { .getSavedObjects() .createImporter(savedObjectsClient, { importSizeLimit: 15_000 }); + // Saved object client need to be scopped with the package space for saved object tagging + const savedObjectClientWithSpace = appContextService.getInternalUserSOClientForSpaceId(spaceId); + const savedObjectTagAssignmentService = appContextService .getSavedObjectsTagging() - .createInternalAssignmentService({ client: savedObjectsClient }); + .createInternalAssignmentService({ client: savedObjectClientWithSpace }); const savedObjectTagClient = appContextService .getSavedObjectsTagging() - .createTagClient({ client: savedObjectsClient }); + .createTagClient({ client: savedObjectClientWithSpace }); // try installing the package, if there was an error, call error handler and rethrow // @ts-expect-error status is string instead of InstallResult.status 'installed' | 'already_installed' @@ -596,8 +589,7 @@ async function installPackageCommon(options: { esClient, logger, installedPkg, - paths, - packageInfo, + packageInstallContext, installType, spaceId, verificationResult, @@ -688,20 +680,28 @@ async function installPackageByUpload({ // as we do not verify uploaded packages, we must invalidate the verification cache deleteVerificationResult(packageInfo); - const paths = await unpackBufferToCache({ + + setPackageInfo({ name: packageInfo.name, version: pkgVersion, - archiveBuffer, - contentType, + packageInfo, }); - setPackageInfo({ + const { assetsMap, paths } = await unpackBufferToAssetsMap({ name: packageInfo.name, version: pkgVersion, - packageInfo, + archiveBuffer, + contentType, }); + const packageInstallContext: PackageInstallContext = { + packageInfo: { ...packageInfo, version: pkgVersion }, + assetsMap, + paths, + }; + return await installPackageCommon({ + packageInstallContext, pkgName, pkgVersion, installSource, @@ -711,7 +711,6 @@ async function installPackageByUpload({ esClient, spaceId, force: true, // upload has implicit force - packageInfo, paths, authorizationHeader, ignoreMappingUpdateErrors, @@ -872,9 +871,20 @@ export async function installCustomPackage( datasets, }); - const paths = cacheAssets(assets, pkgName, INITIAL_VERSION); + const assetsMap = assets.reduce((acc, asset) => { + acc.set(asset.path, asset.content); + return acc; + }, new Map()); + const paths = [...Object.keys(assetsMap)]; + + const packageInstallContext: PackageInstallContext = { + assetsMap, + paths, + packageInfo, + }; return await installPackageCommon({ + packageInstallContext, pkgName, pkgVersion: INITIAL_VERSION, installSource: 'custom', @@ -883,7 +893,6 @@ export async function installCustomPackage( esClient, spaceId, force, - packageInfo, paths, authorizationHeader, }); @@ -1216,8 +1225,7 @@ export async function ensurePackagesCompletedInstall( export async function installIndexTemplatesAndPipelines({ installedPkg, - paths, - packageInfo, + packageInstallContext, esReferences, savedObjectsClient, esClient, @@ -1225,8 +1233,7 @@ export async function installIndexTemplatesAndPipelines({ onlyForDataStreams, }: { installedPkg?: Installation; - paths: string[]; - packageInfo: PackageInfo | InstallablePackage; + packageInstallContext: PackageInstallContext; esReferences: EsAssetReference[]; savedObjectsClient: SavedObjectsClientContract; esClient: ElasticsearchClient; @@ -1244,10 +1251,12 @@ export async function installIndexTemplatesAndPipelines({ */ const experimentalDataStreamFeatures = installedPkg?.experimental_data_stream_features ?? []; - const preparedIngestPipelines = prepareToInstallPipelines(packageInfo, paths, onlyForDataStreams); + const preparedIngestPipelines = prepareToInstallPipelines( + packageInstallContext, + onlyForDataStreams + ); const preparedIndexTemplates = prepareToInstallTemplates( - packageInfo, - paths, + packageInstallContext, esReferences, experimentalDataStreamFeatures, onlyForDataStreams @@ -1265,13 +1274,13 @@ export async function installIndexTemplatesAndPipelines({ // so we need to use optimistic concurrency control newEsReferences = await optimisticallyAddEsAssetReferences( savedObjectsClient, - packageInfo.name, + packageInstallContext.packageInfo.name, [...preparedIngestPipelines.assetsToAdd, ...preparedIndexTemplates.assetsToAdd] ); } else { newEsReferences = await updateEsAssetReferences( savedObjectsClient, - packageInfo.name, + packageInstallContext.packageInfo.name, esReferences, { assetsToRemove: preparedIndexTemplates.assetsToRemove, @@ -1312,9 +1321,6 @@ export async function installAssetsForInputPackagePolicy(opts: { if (pkgInfo.type !== 'input') return; - const paths = await getArchiveFilelist(pkgInfo); - if (!paths) throw new PackageInvalidArchiveError(`No paths found for ${pkgInfo.name}`); - const datasetName = packagePolicy.inputs[0].streams[0].vars?.[DATASET_VAR_NAME]?.value; const [dataStream] = getNormalizedDataStreams(pkgInfo, datasetName); const existingDataStreams = await dataStreamService.getMatchingDataStreams(esClient, { @@ -1370,20 +1376,39 @@ export async function installAssetsForInputPackagePolicy(opts: { } } - const installedPkg = await getInstallation({ + const installedPkgWithAssets = await getInstalledPackageWithAssets({ savedObjectsClient: soClient, pkgName: pkgInfo.name, logger, }); - if (!installedPkg) + let packageInstallContext: PackageInstallContext | undefined; + if (!installedPkgWithAssets) { throw new PackageNotFoundError( `Error while creating index templates: unable to find installed package ${pkgInfo.name}` ); + } + if (installedPkgWithAssets.installation.version !== pkgInfo.version) { + const pkg = await Registry.getPackage(pkgInfo.name, pkgInfo.version, { + ignoreUnverified: force, + }); + + packageInstallContext = { + assetsMap: pkg.assetsMap, + packageInfo: pkg.packageInfo, + paths: pkg.paths, + }; + } else { + packageInstallContext = { + assetsMap: installedPkgWithAssets.assetsMap, + packageInfo: installedPkgWithAssets.packageInfo, + paths: installedPkgWithAssets.paths, + }; + } + await installIndexTemplatesAndPipelines({ - installedPkg, - paths, - packageInfo: pkgInfo, - esReferences: installedPkg.installed_es || [], + installedPkg: installedPkgWithAssets.installation, + packageInstallContext, + esReferences: installedPkgWithAssets.installation.installed_es || [], savedObjectsClient: soClient, esClient, logger, diff --git a/x-pack/plugins/fleet/server/services/epm/registry/index.ts b/x-pack/plugins/fleet/server/services/epm/registry/index.ts index de513062f5873..97402447be716 100644 --- a/x-pack/plugins/fleet/server/services/epm/registry/index.ts +++ b/x-pack/plugins/fleet/server/services/epm/registry/index.ts @@ -26,16 +26,16 @@ import type { PackageVerificationResult, ArchivePackage, BundledPackage, + AssetsMap, } from '../../../types'; import { - getArchiveFilelist, getPathParts, - unpackBufferToCache, setVerificationResult, - getVerificationResult, getPackageInfo, setPackageInfo, generatePackageInfoFromArchiveBuffer, + unpackBufferToAssetsMap, + getVerificationResult, } from '../archive'; import { streamToBuffer, streamToString } from '../streams'; import { appContextService } from '../..'; @@ -319,16 +319,15 @@ export async function getPackage( ): Promise<{ paths: string[]; packageInfo: ArchivePackage; + assetsMap: AssetsMap; verificationResult?: PackageVerificationResult; }> { const verifyPackage = appContextService.getExperimentalFeatures().packageVerification; - let paths = getArchiveFilelist({ name, version }); - let packageInfo = getPackageInfo({ name, version }); - let verificationResult = verifyPackage ? getVerificationResult({ name, version }) : undefined; + let packageInfo: ArchivePackage | undefined = getPackageInfo({ name, version }); + let verificationResult: PackageVerificationResult | undefined = verifyPackage + ? getVerificationResult({ name, version }) + : undefined; - if (paths && packageInfo) { - return { paths, packageInfo, verificationResult }; - } const { archiveBuffer, archivePath, @@ -346,22 +345,19 @@ export async function getPackage( verificationResult = latestVerificationResult; setVerificationResult({ name, version }, latestVerificationResult); } - if (!paths || paths.length === 0) { - paths = await withPackageSpan('Unpack archive', () => - unpackBufferToCache({ - name, - version, - archiveBuffer, - contentType: ensureContentType(archivePath), - }) - ); - } + + const { assetsMap, paths } = await unpackBufferToAssetsMap({ + name, + version, + archiveBuffer, + contentType: ensureContentType(archivePath), + }); if (!packageInfo) { packageInfo = await getPackageInfoFromArchiveOrCache(name, version, archiveBuffer, archivePath); } - return { paths, packageInfo, verificationResult }; + return { paths, packageInfo, assetsMap, verificationResult }; } function ensureContentType(archivePath: string) { diff --git a/x-pack/plugins/fleet/server/services/package_policies/experimental_datastream_features.test.ts b/x-pack/plugins/fleet/server/services/package_policies/experimental_datastream_features.test.ts index 4fb8073ccbf00..fd914e5ce1f80 100644 --- a/x-pack/plugins/fleet/server/services/package_policies/experimental_datastream_features.test.ts +++ b/x-pack/plugins/fleet/server/services/package_policies/experimental_datastream_features.test.ts @@ -12,7 +12,7 @@ import { securityMock } from '@kbn/security-plugin/server/mocks'; import type { NewPackagePolicy, PackagePolicy } from '../../types'; import { appContextService } from '../app_context'; import { updateCurrentWriteIndices } from '../epm/elasticsearch/template/template'; -import { getInstallation } from '../epm/packages'; +import { getInstalledPackageWithAssets } from '../epm/packages/get'; import { handleExperimentalDatastreamFeatureOptIn } from './experimental_datastream_features'; @@ -34,6 +34,35 @@ jest.mock('../epm/packages', () => { }; }); +function mockGetInstalledPackageWithAssets(installation: any) { + jest.mocked(getInstalledPackageWithAssets).mockResolvedValue({ + packageInfo: { + name: 'test', + data_streams: [ + { + dataset: 'test', + type: 'metrics', + }, + ], + }, + installation, + } as any); +} + +jest.mock('../epm/packages/get', () => ({ + getInstalledPackageWithAssets: jest.fn().mockResolvedValue({ + packageInfo: { + name: 'test', + data_streams: [ + { + dataset: 'test', + type: 'metrics', + }, + ], + }, + }), +})); + jest.mock('../app_context'); const mockedAppContextService = appContextService as jest.Mocked; mockedAppContextService.getSecuritySetup.mockImplementation(() => ({ @@ -41,9 +70,6 @@ mockedAppContextService.getSecuritySetup.mockImplementation(() => ({ })); jest.mock('../epm/elasticsearch/template/template'); - -const mockGetInstallation = getInstallation as jest.Mock; - jest.mock('../epm/elasticsearch/template/install', () => { return { prepareTemplate: jest.fn().mockReturnValue({ @@ -214,7 +240,7 @@ describe('experimental_datastream_features', () => { describe('when package policy does not exist (create)', () => { beforeEach(() => { - mockGetInstallation.mockResolvedValueOnce({ + mockGetInstalledPackageWithAssets({ experimental_data_stream_features: [ { data_stream: 'metrics-test.test', @@ -376,7 +402,7 @@ describe('experimental_datastream_features', () => { isDocValueOnlyOther: false, }); - mockGetInstallation.mockResolvedValueOnce({ + mockGetInstalledPackageWithAssets({ experimental_data_stream_features: [ { data_stream: 'metrics-test.test', @@ -404,7 +430,7 @@ describe('experimental_datastream_features', () => { isDocValueOnlyOther: false, }); - mockGetInstallation.mockResolvedValueOnce({ + mockGetInstalledPackageWithAssets({ experimental_data_stream_features: [ { data_stream: 'metrics-test.test', @@ -426,7 +452,7 @@ describe('experimental_datastream_features', () => { describe('when opt in status is changed', () => { beforeEach(() => { - mockGetInstallation.mockResolvedValueOnce({ + mockGetInstalledPackageWithAssets({ experimental_data_stream_features: [ { data_stream: 'metrics-test.test', diff --git a/x-pack/plugins/fleet/server/services/package_policies/experimental_datastream_features.ts b/x-pack/plugins/fleet/server/services/package_policies/experimental_datastream_features.ts index b700618f44762..edf31991634b9 100644 --- a/x-pack/plugins/fleet/server/services/package_policies/experimental_datastream_features.ts +++ b/x-pack/plugins/fleet/server/services/package_policies/experimental_datastream_features.ts @@ -13,6 +13,7 @@ import { merge } from 'lodash'; import { getRegistryDataStreamAssetBaseName } from '../../../common/services'; import type { ExperimentalIndexingFeature } from '../../../common/types'; +import { PackageNotFoundError } from '../../errors'; import type { NewPackagePolicy, PackagePolicy, @@ -22,8 +23,9 @@ import type { import { appContextService } from '../app_context'; import { prepareTemplate } from '../epm/elasticsearch/template/install'; import { updateCurrentWriteIndices } from '../epm/elasticsearch/template/template'; -import { getInstallation, getPackageInfo } from '../epm/packages'; +import { getInstalledPackageWithAssets } from '../epm/packages/get'; import { updateDatastreamExperimentalFeatures } from '../epm/packages/update'; + import { applyDocOnlyValueToMapping, forEachMappings, @@ -38,7 +40,10 @@ export async function handleExperimentalDatastreamFeatureOptIn({ esClient: ElasticsearchClient; packagePolicy: PackagePolicy | NewPackagePolicy; }) { - if (!packagePolicy.package?.experimental_data_stream_features) { + if ( + !packagePolicy.package?.experimental_data_stream_features || + (packagePolicy.package?.experimental_data_stream_features?.length ?? 0) === 0 + ) { return; } @@ -49,16 +54,16 @@ export async function handleExperimentalDatastreamFeatureOptIn({ const templateMappings: { [key: string]: any } = {}; if (packagePolicy.package) { - installation = await getInstallation({ + const installedPackageWithAssets = await getInstalledPackageWithAssets({ savedObjectsClient: soClient, pkgName: packagePolicy.package.name, }); - const packageInfo = await getPackageInfo({ - savedObjectsClient: soClient, - pkgName: packagePolicy.package.name, - pkgVersion: packagePolicy.package.version, - }); + if (!installedPackageWithAssets) { + throw new PackageNotFoundError(`package not found with assets ${packagePolicy.package.name}`); + } + installation = installedPackageWithAssets.installation; + const { packageInfo, paths, assetsMap } = installedPackageWithAssets; // prepare template from package spec to find original index:false values const templates = packageInfo.data_streams?.map((dataStream: any) => { @@ -67,7 +72,15 @@ export async function handleExperimentalDatastreamFeatureOptIn({ (datastreamFeature) => datastreamFeature.data_stream === getRegistryDataStreamAssetBaseName(dataStream) ); - return prepareTemplate({ pkg: packageInfo, dataStream, experimentalDataStreamFeature }); + return prepareTemplate({ + packageInstallContext: { + assetsMap, + packageInfo, + paths, + }, + dataStream, + experimentalDataStreamFeature, + }); }); templates?.forEach((template) => { diff --git a/x-pack/plugins/fleet/server/services/package_policy.test.ts b/x-pack/plugins/fleet/server/services/package_policy.test.ts index 204b3b10e066b..ada094ec9a7d0 100644 --- a/x-pack/plugins/fleet/server/services/package_policy.test.ts +++ b/x-pack/plugins/fleet/server/services/package_policy.test.ts @@ -72,63 +72,56 @@ const mockedSendTelemetryEvents = sendTelemetryEvents as jest.MockedFunction< typeof sendTelemetryEvents >; -async function mockedGetAssetsData(_a: any, _b: any, dataset: string) { - if (dataset === 'dataset1') { - return [ - { - buffer: Buffer.from(` -type: log -metricset: ["dataset1"] -paths: -{{#each paths}} -- {{this}} -{{/each}} -{{#if hosts}} -hosts: -{{#each hosts}} -- {{this}} -{{/each}} -{{/if}} -`), - }, - ]; - } - if (dataset === 'dataset1_level1') { - return [ - { - buffer: Buffer.from(` -type: log -metricset: ["dataset1.level1"] -`), - }, - ]; - } - - return [ - { - buffer: Buffer.from(` -hosts: -{{#each hosts}} -- {{this}} -{{/each}} -`), - }, - ]; -} +const ASSETS_MAP_FIXTURES = new Map([ + [ + '/test-1.0.0/data_stream/dataset1/agent/stream/some_template_path.yml', + Buffer.from(` + type: log + metricset: ["dataset1"] + paths: + {{#each paths}} + - {{this}} + {{/each}} + {{#if hosts}} + hosts: + {{#each hosts}} + - {{this}} + {{/each}} + {{/if}} + `), + ], + [ + '/test-1.0.0/data_stream/dataset1_level1/agent/stream/some_template_path.yml', + Buffer.from(` + type: log + metricset: ["dataset1.level1"] + `), + ], + [ + '/test-1.0.0/agent/input/some_template_path.yml', + Buffer.from(` + hosts: + {{#each hosts}} + - {{this}} + {{/each}} + `), + ], +]); async function mockedGetInstallation(params: any) { let pkg; if (params.pkgName === 'apache') pkg = { version: '1.3.2' }; if (params.pkgName === 'aws') pkg = { version: '0.3.3' }; if (params.pkgName === 'endpoint') pkg = { version: '1.0.0' }; + if (params.pkgName === 'test') pkg = { version: '0.0.1' }; return Promise.resolve(pkg); } async function mockedGetPackageInfo(params: any) { let pkg; if (params.pkgName === 'apache') pkg = { version: '1.3.2' }; - if (params.pkgName === 'aws') pkg = { version: '0.3.3' }; - if (params.pkgName === 'endpoint') pkg = { version: '1.0.0' }; + if (params.pkgName === 'aws') pkg = { name: 'aws', version: '0.3.3' }; + if (params.pkgName === 'endpoint') pkg = { name: 'endpoint', version: params.pkgVersion }; if (params.pkgName === 'test') { pkg = { version: '1.0.2', @@ -162,12 +155,6 @@ async function mockedGetPackageInfo(params: any) { return Promise.resolve(pkg); } -jest.mock('./epm/packages/assets', () => { - return { - getAssetsData: mockedGetAssetsData, - }; -}); - jest.mock('./epm/packages', () => { return { getPackageInfo: jest.fn().mockImplementation(mockedGetPackageInfo), @@ -181,7 +168,13 @@ jest.mock('../../common/services/package_to_package_policy', () => ({ packageToPackagePolicy: jest.fn(), })); -jest.mock('./epm/registry'); +jest.mock('./epm/registry', () => ({ + getPackage: jest.fn().mockResolvedValue({ assetsMap: [] }), +})); + +jest.mock('./epm/packages/get', () => ({ + getPackageAssetsMap: jest.fn().mockResolvedValue(new Map()), +})); jest.mock('./agent_policy'); const mockAgentPolicyService = agentPolicyService as jest.Mocked; @@ -488,6 +481,8 @@ describe('Package policy service', () => { it('should work with config variables from the stream', async () => { const inputs = await _compilePackagePolicyInputs( { + name: 'test', + version: '1.0.0', data_streams: [ { type: 'logs', @@ -520,7 +515,8 @@ describe('Package policy service', () => { }, ], }, - ] + ], + ASSETS_MAP_FIXTURES ); expect(inputs).toEqual([ @@ -551,6 +547,8 @@ describe('Package policy service', () => { it('should work with a two level dataset name', async () => { const inputs = await _compilePackagePolicyInputs( { + name: 'test', + version: '1.0.0', data_streams: [ { type: 'logs', @@ -578,7 +576,8 @@ describe('Package policy service', () => { }, ], }, - ] + ], + ASSETS_MAP_FIXTURES ); expect(inputs).toEqual([ @@ -603,6 +602,8 @@ describe('Package policy service', () => { it('should work with config variables at the input level', async () => { const inputs = await _compilePackagePolicyInputs( { + name: 'test', + version: '1.0.0', data_streams: [ { dataset: 'package.dataset1', @@ -635,7 +636,8 @@ describe('Package policy service', () => { }, ], }, - ] + ], + ASSETS_MAP_FIXTURES ); expect(inputs).toEqual([ @@ -666,6 +668,8 @@ describe('Package policy service', () => { it('should work with config variables at the package level', async () => { const inputs = await _compilePackagePolicyInputs( { + name: 'test', + version: '1.0.0', data_streams: [ { dataset: 'package.dataset1', @@ -702,7 +706,8 @@ describe('Package policy service', () => { }, ], }, - ] + ], + ASSETS_MAP_FIXTURES ); expect(inputs).toEqual([ @@ -734,6 +739,8 @@ describe('Package policy service', () => { it('should work with an input with a template and no streams', async () => { const inputs = await _compilePackagePolicyInputs( { + name: 'test', + version: '1.0.0', data_streams: [], policy_templates: [ { @@ -753,7 +760,8 @@ describe('Package policy service', () => { }, streams: [], }, - ] + ], + ASSETS_MAP_FIXTURES ); expect(inputs).toEqual([ @@ -776,6 +784,8 @@ describe('Package policy service', () => { it('should work with an input with a template and streams', async () => { const inputs = await _compilePackagePolicyInputs( { + name: 'test', + version: '1.0.0', data_streams: [ { dataset: 'package.dataset1', @@ -828,7 +838,8 @@ describe('Package policy service', () => { }, streams: [], }, - ] + ], + ASSETS_MAP_FIXTURES ); expect(inputs).toEqual([ @@ -881,6 +892,8 @@ describe('Package policy service', () => { it('should work with a package without input', async () => { const inputs = await _compilePackagePolicyInputs( { + name: 'test', + version: '1.0.0', policy_templates: [ { inputs: undefined, @@ -888,7 +901,8 @@ describe('Package policy service', () => { ], } as unknown as PackageInfo, {}, - [] + [], + ASSETS_MAP_FIXTURES ); expect(inputs).toEqual([]); @@ -897,6 +911,8 @@ describe('Package policy service', () => { it('should work with a package with a empty inputs array', async () => { const inputs = await _compilePackagePolicyInputs( { + name: 'test', + version: '1.0.0', policy_templates: [ { inputs: [], @@ -904,7 +920,8 @@ describe('Package policy service', () => { ], } as unknown as PackageInfo, {}, - [] + [], + ASSETS_MAP_FIXTURES ); expect(inputs).toEqual([]); diff --git a/x-pack/plugins/fleet/server/services/package_policy.ts b/x-pack/plugins/fleet/server/services/package_policy.ts index d3d49a7f001fc..3f43aaa2d71f2 100644 --- a/x-pack/plugins/fleet/server/services/package_policy.ts +++ b/x-pack/plugins/fleet/server/services/package_policy.ts @@ -68,6 +68,7 @@ import type { ExperimentalDataStreamFeature, DeletePackagePoliciesResponse, PolicySecretReference, + AssetsMap, } from '../../common/types'; import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '../constants'; import { @@ -104,7 +105,7 @@ import { storedPackagePolicyToAgentInputs } from './agent_policies'; import { agentPolicyService } from './agent_policy'; import { getDataOutputForAgentPolicy } from './agent_policies'; import { getPackageInfo, getInstallation, ensureInstalledPackage } from './epm/packages'; -import { getAssetsData } from './epm/packages/assets'; +import { getAssetsDataFromAssetsMap } from './epm/packages/assets'; import { compileTemplate } from './epm/agent/agent'; import { escapeSearchQueryPhrase, normalizeKuery } from './saved_object'; import { appContextService } from '.'; @@ -122,6 +123,7 @@ import { deleteSecretsIfNotReferenced as deleteSecrets, isSecretStorageEnabled, } from './secrets'; +import { getPackageAssetsMap } from './epm/packages/get'; export type InputsOverride = Partial & { vars?: Array; @@ -129,6 +131,38 @@ export type InputsOverride = Partial & { const SAVED_OBJECT_TYPE = PACKAGE_POLICY_SAVED_OBJECT_TYPE; +async function getPkgInfoAssetsMap({ + savedObjectsClient, + packageInfos, + logger, +}: { + savedObjectsClient: SavedObjectsClientContract; + packageInfos: PackageInfo[]; + logger: Logger; +}) { + const packageInfosandAssetsMap = new Map< + string, + { assetsMap: AssetsMap; pkgInfo: PackageInfo } + >(); + await pMap( + packageInfos, + async (pkgInfo) => { + const assetsMap = await getPackageAssetsMap({ + logger, + packageInfo: pkgInfo, + savedObjectsClient, + }); + packageInfosandAssetsMap.set(`${pkgInfo.name}-${pkgInfo.version}`, { + assetsMap, + pkgInfo, + }); + }, + { concurrency: 5 } + ); + + return packageInfosandAssetsMap; +} + export const DATA_STREAM_ALLOWED_INDEX_PRIVILEGES = new Set([ 'auto_configure', 'create_doc', @@ -261,7 +295,17 @@ class PackagePolicyClientImpl implements PackagePolicyClient { inputs = enrichedPackagePolicy.inputs as PackagePolicyInput[]; } - inputs = await _compilePackagePolicyInputs(pkgInfo, enrichedPackagePolicy.vars || {}, inputs); + const assetsMap = await getPackageAssetsMap({ + logger, + packageInfo: pkgInfo, + savedObjectsClient: soClient, + }); + inputs = await _compilePackagePolicyInputs( + pkgInfo, + enrichedPackagePolicy.vars || {}, + inputs, + assetsMap + ); elasticsearchPrivileges = pkgInfo.elasticsearch?.privileges; @@ -366,6 +410,12 @@ class PackagePolicyClientImpl implements PackagePolicyClient { return p; }); + const packageInfosandAssetsMap = await getPkgInfoAssetsMap({ + logger, + packageInfos: [...packageInfos.values()], + savedObjectsClient: soClient, + }); + await pMap(packagePoliciesWithIds, async (packagePolicy) => { try { const packagePolicyId = packagePolicy.id ?? uuidv4(); @@ -377,12 +427,24 @@ class PackagePolicyClientImpl implements PackagePolicyClient { let elasticsearch: PackagePolicy['elasticsearch']; if (packagePolicy.package) { - const pkgInfo = packageInfos.get( + const packageInfoAndAsset = packageInfosandAssetsMap.get( `${packagePolicy.package.name}-${packagePolicy.package.version}` ); + if (!packageInfoAndAsset) { + throw new FleetError( + `Package info and assets not found: ${packagePolicy.package.name}-${packagePolicy.package.version}` + ); + } + + const { pkgInfo, assetsMap } = packageInfoAndAsset; inputs = pkgInfo - ? await _compilePackagePolicyInputs(pkgInfo, packagePolicy.vars || {}, inputs) + ? await _compilePackagePolicyInputs( + pkgInfo, + packagePolicy.vars || {}, + inputs, + assetsMap + ) : inputs; elasticsearch = pkgInfo?.elasticsearch; @@ -475,9 +537,18 @@ class PackagePolicyClientImpl implements PackagePolicyClient { const pkgInfo = packageInfos.get( `${packagePolicy.package.name}-${packagePolicy.package.version}` ); - + if (!pkgInfo) { + throw new FleetError( + `Package info and assets not found: ${packagePolicy.package.name}-${packagePolicy.package.version}` + ); + } + const assetsMap = await getPackageAssetsMap({ + logger: appContextService.getLogger(), + packageInfo: pkgInfo, + savedObjectsClient: soClient, + }); inputs = pkgInfo - ? await _compilePackagePolicyInputs(pkgInfo, packagePolicy.vars || {}, inputs) + ? await _compilePackagePolicyInputs(pkgInfo, packagePolicy.vars || {}, inputs, assetsMap) : inputs; elasticsearch = pkgInfo?.elasticsearch; @@ -770,8 +841,17 @@ class PackagePolicyClientImpl implements PackagePolicyClient { secretsToDelete = secretsRes.secretsToDelete; inputs = restOfPackagePolicy.inputs as PackagePolicyInput[]; } - - inputs = await _compilePackagePolicyInputs(pkgInfo, restOfPackagePolicy.vars || {}, inputs); + const assetsMap = await getPackageAssetsMap({ + logger, + packageInfo: pkgInfo, + savedObjectsClient: soClient, + }); + inputs = await _compilePackagePolicyInputs( + pkgInfo, + restOfPackagePolicy.vars || {}, + inputs, + assetsMap + ); elasticsearchPrivileges = pkgInfo.elasticsearch?.privileges; } @@ -891,6 +971,12 @@ class PackagePolicyClientImpl implements PackagePolicyClient { const packageInfos = await getPackageInfoForPackagePolicies(packagePolicyUpdates, soClient); const allSecretsToDelete: PolicySecretReference[] = []; + const packageInfosandAssetsMap = await getPkgInfoAssetsMap({ + logger: appContextService.getLogger(), + packageInfos: [...packageInfos.values()], + savedObjectsClient: soClient, + }); + const policiesToUpdate: Array> = []; const failedPolicies: Array<{ packagePolicy: NewPackagePolicyWithId; @@ -921,10 +1007,11 @@ class PackagePolicyClientImpl implements PackagePolicyClient { inputs = enforceFrozenInputs(oldPackagePolicy.inputs, inputs, options?.force); let elasticsearchPrivileges: NonNullable['privileges']; if (packagePolicy.package?.name) { - const pkgInfo = packageInfos.get( + const pkgInfoAndAsset = packageInfosandAssetsMap.get( `${packagePolicy.package.name}-${packagePolicy.package.version}` ); - if (pkgInfo) { + if (pkgInfoAndAsset) { + const { pkgInfo, assetsMap } = pkgInfoAndAsset; validatePackagePolicyOrThrow(packagePolicy, pkgInfo); if (await isSecretStorageEnabled(esClient, soClient)) { const secretsRes = await extractAndUpdateSecrets({ @@ -939,7 +1026,12 @@ class PackagePolicyClientImpl implements PackagePolicyClient { allSecretsToDelete.push(...secretsRes.secretsToDelete); inputs = restOfPackagePolicy.inputs as PackagePolicyInput[]; } - inputs = await _compilePackagePolicyInputs(pkgInfo, packagePolicy.vars || {}, inputs); + inputs = await _compilePackagePolicyInputs( + pkgInfo, + packagePolicy.vars || {}, + inputs, + assetsMap + ); elasticsearchPrivileges = pkgInfo.elasticsearch?.privileges; } } @@ -1382,10 +1474,16 @@ class PackagePolicyClientImpl implements PackagePolicyClient { packageInfo, packageToPackagePolicyInputs(packageInfo) as InputsOverride[] ); + const assetsMap = await getPackageAssetsMap({ + logger: appContextService.getLogger(), + packageInfo, + savedObjectsClient: soClient, + }); updatePackagePolicy.inputs = await _compilePackagePolicyInputs( packageInfo, updatePackagePolicy.vars || {}, - updatePackagePolicy.inputs as PackagePolicyInput[] + updatePackagePolicy.inputs as PackagePolicyInput[], + assetsMap ); updatePackagePolicy.elasticsearch = packageInfo.elasticsearch; @@ -1422,6 +1520,11 @@ class PackagePolicyClientImpl implements PackagePolicyClient { ({ packagePolicy, packageInfo, experimentalDataStreamFeatures } = await this.getUpgradePackagePolicyInfo(soClient, id, packagePolicy, pkgVersion)); + const assetsMap = await getPackageAssetsMap({ + logger: appContextService.getLogger(), + packageInfo, + savedObjectsClient: soClient, + }); // Ensure the experimental features from the Installation saved object come through on the package policy // during an upgrade dry run @@ -1429,7 +1532,7 @@ class PackagePolicyClientImpl implements PackagePolicyClient { packagePolicy.package.experimental_data_stream_features = experimentalDataStreamFeatures; } - return this.calculateDiff(soClient, packagePolicy, packageInfo); + return this.calculateDiff(soClient, packagePolicy, packageInfo, assetsMap); } catch (error) { return { hasErrors: true, @@ -1441,7 +1544,8 @@ class PackagePolicyClientImpl implements PackagePolicyClient { private async calculateDiff( soClient: SavedObjectsClientContract, packagePolicy: PackagePolicy, - packageInfo: PackageInfo + packageInfo: PackageInfo, + assetsMap: AssetsMap ): Promise { const updatedPackagePolicy = updatePackageInputs( { @@ -1461,7 +1565,8 @@ class PackagePolicyClientImpl implements PackagePolicyClient { updatedPackagePolicy.inputs = await _compilePackagePolicyInputs( packageInfo, updatedPackagePolicy.vars || {}, - updatedPackagePolicy.inputs as PackagePolicyInput[] + updatedPackagePolicy.inputs as PackagePolicyInput[], + assetsMap ); updatedPackagePolicy.elasticsearch = packageInfo.elasticsearch; @@ -1899,11 +2004,12 @@ export function getInputsWithStreamIds( export async function _compilePackagePolicyInputs( pkgInfo: PackageInfo, vars: PackagePolicy['vars'], - inputs: PackagePolicyInput[] + inputs: PackagePolicyInput[], + assetsMap: AssetsMap ): Promise { const inputsPromises = inputs.map(async (input) => { - const compiledInput = await _compilePackagePolicyInput(pkgInfo, vars, input); - const compiledStreams = await _compilePackageStreams(pkgInfo, vars, input); + const compiledInput = await _compilePackagePolicyInput(pkgInfo, vars, input, assetsMap); + const compiledStreams = await _compilePackageStreams(pkgInfo, vars, input, assetsMap); return { ...input, compiled_input: compiledInput, @@ -1917,7 +2023,8 @@ export async function _compilePackagePolicyInputs( async function _compilePackagePolicyInput( pkgInfo: PackageInfo, vars: PackagePolicy['vars'], - input: PackagePolicyInput + input: PackagePolicyInput, + assetsMap: AssetsMap ) { const packagePolicyTemplate = input.policy_template ? pkgInfo.policy_templates?.find( @@ -1945,7 +2052,7 @@ async function _compilePackagePolicyInput( return undefined; } - const [pkgInputTemplate] = await getAssetsData(pkgInfo, (path: string) => + const [pkgInputTemplate] = await getAssetsDataFromAssetsMap(pkgInfo, assetsMap, (path: string) => path.endsWith(`/agent/input/${packageInput.template_path!}`) ); @@ -1965,10 +2072,11 @@ async function _compilePackagePolicyInput( async function _compilePackageStreams( pkgInfo: PackageInfo, vars: PackagePolicy['vars'], - input: PackagePolicyInput + input: PackagePolicyInput, + assetsMap: AssetsMap ) { const streamsPromises = input.streams.map((stream) => - _compilePackageStream(pkgInfo, vars, input, stream) + _compilePackageStream(pkgInfo, vars, input, stream, assetsMap) ); return await Promise.all(streamsPromises); @@ -2026,7 +2134,8 @@ async function _compilePackageStream( pkgInfo: PackageInfo, vars: PackagePolicy['vars'], input: PackagePolicyInput, - streamIn: PackagePolicyInputStream + streamIn: PackagePolicyInputStream, + assetsMap: AssetsMap ) { let stream = streamIn; @@ -2068,8 +2177,9 @@ async function _compilePackageStream( const datasetPath = packageDataStream.path; - const [pkgStreamTemplate] = await getAssetsData( + const [pkgStreamTemplate] = await getAssetsDataFromAssetsMap( pkgInfo, + assetsMap, (path: string) => path.endsWith(streamFromPkg.template_path), datasetPath ); diff --git a/x-pack/plugins/fleet/server/types/index.tsx b/x-pack/plugins/fleet/server/types/index.tsx index d56c92eb7aa8b..bec381d311937 100644 --- a/x-pack/plugins/fleet/server/types/index.tsx +++ b/x-pack/plugins/fleet/server/types/index.tsx @@ -96,6 +96,7 @@ export type { InstallationInfo, ActionStatusOptions, PackageSpecTags, + AssetsMap, } from '../../common/types'; export { ElasticsearchAssetType, KibanaAssetType, KibanaSavedObjectType } from '../../common/types'; export { dataTypes } from '../../common/constants'; diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/counter_rate.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/counter_rate.tsx index a35669c01ca33..93ab93de22f66 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/counter_rate.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/counter_rate.tsx @@ -6,6 +6,7 @@ */ import { i18n } from '@kbn/i18n'; +import { COUNTER_RATE_ID, COUNTER_RATE_NAME } from '@kbn/lens-formula-docs'; import { FormattedIndexPatternColumn, ReferenceBasedIndexPatternColumn } from '../column_types'; import { FormBasedLayer } from '../../../types'; import { @@ -35,18 +36,16 @@ const ofName = buildLabelFunction((name?: string) => { export type CounterRateIndexPatternColumn = FormattedIndexPatternColumn & ReferenceBasedIndexPatternColumn & { - operationType: 'counter_rate'; + operationType: typeof COUNTER_RATE_ID; }; export const counterRateOperation: OperationDefinition< CounterRateIndexPatternColumn, 'fullReference' > = { - type: 'counter_rate', + type: COUNTER_RATE_ID, priority: 1, - displayName: i18n.translate('xpack.lens.indexPattern.counterRate', { - defaultMessage: 'Counter rate', - }), + displayName: COUNTER_RATE_NAME, input: 'fullReference', selectionStyle: 'field', requiredReferences: [ @@ -134,24 +133,6 @@ export const counterRateOperation: OperationDefinition< }, timeScalingMode: 'mandatory', filterable: true, - documentation: { - section: 'calculation', - signature: i18n.translate('xpack.lens.indexPattern.counterRate.signature', { - defaultMessage: 'metric: number', - }), - description: i18n.translate('xpack.lens.indexPattern.counterRate.documentation.markdown', { - defaultMessage: ` -Calculates the rate of an ever increasing counter. This function will only yield helpful results on counter metric fields which contain a measurement of some kind monotonically growing over time. -If the value does get smaller, it will interpret this as a counter reset. To get most precise results, \`counter_rate\` should be calculated on the \`max\` of a field. - -This calculation will be done separately for separate series defined by filters or top values dimensions. -It uses the current interval when used in Formula. - -Example: Visualize the rate of bytes received over time by a memcached server: -\`counter_rate(max(memcached.stats.read.bytes))\` - `, - }), - }, quickFunctionDocumentation: i18n.translate( 'xpack.lens.indexPattern.counterRate.documentation.quick', { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/cumulative_sum.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/cumulative_sum.tsx index 916ecd6f965e6..d7c13d43ba163 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/cumulative_sum.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/cumulative_sum.tsx @@ -6,6 +6,7 @@ */ import { i18n } from '@kbn/i18n'; +import { CUMULATIVE_SUM_ID, CUMULATIVE_SUM_NAME } from '@kbn/lens-formula-docs'; import { FormattedIndexPatternColumn, ReferenceBasedIndexPatternColumn } from '../column_types'; import { FormBasedLayer } from '../../../types'; import { @@ -35,18 +36,16 @@ const ofName = buildLabelFunction((name?: string) => { export type CumulativeSumIndexPatternColumn = FormattedIndexPatternColumn & ReferenceBasedIndexPatternColumn & { - operationType: 'cumulative_sum'; + operationType: typeof CUMULATIVE_SUM_ID; }; export const cumulativeSumOperation: OperationDefinition< CumulativeSumIndexPatternColumn, 'fullReference' > = { - type: 'cumulative_sum', + type: CUMULATIVE_SUM_ID, priority: 1, - displayName: i18n.translate('xpack.lens.indexPattern.cumulativeSum', { - defaultMessage: 'Cumulative sum', - }), + displayName: CUMULATIVE_SUM_NAME, input: 'fullReference', selectionStyle: 'field', requiredReferences: [ @@ -127,22 +126,6 @@ export const cumulativeSumOperation: OperationDefinition< return checkForDateHistogram(layer, opName)?.join(', '); }, filterable: true, - documentation: { - section: 'calculation', - signature: i18n.translate('xpack.lens.indexPattern.cumulative_sum.signature', { - defaultMessage: 'metric: number', - }), - description: i18n.translate('xpack.lens.indexPattern.cumulativeSum.documentation.markdown', { - defaultMessage: ` -Calculates the cumulative sum of a metric over time, adding all previous values of a series to each value. To use this function, you need to configure a date histogram dimension as well. - -This calculation will be done separately for separate series defined by filters or top values dimensions. - -Example: Visualize the received bytes accumulated over time: -\`cumulative_sum(sum(bytes))\` - `, - }), - }, quickFunctionDocumentation: i18n.translate( 'xpack.lens.indexPattern.cumulativeSum.documentation.quick', { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/differences.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/differences.tsx index 9f592be860d77..59943a23ece5e 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/differences.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/differences.tsx @@ -6,6 +6,7 @@ */ import { i18n } from '@kbn/i18n'; +import { DIFFERENCES_ID, DIFFERENCES_NAME } from '@kbn/lens-formula-docs'; import { FormattedIndexPatternColumn, ReferenceBasedIndexPatternColumn } from '../column_types'; import { FormBasedLayer } from '../../../types'; import { @@ -19,8 +20,6 @@ import { import { OperationDefinition } from '..'; import { getFormatFromPreviousColumn, getFilter } from '../helpers'; -const OPERATION_NAME = 'differences'; - const ofName = buildLabelFunction((name?: string) => { return i18n.translate('xpack.lens.indexPattern.derivativeOf', { defaultMessage: 'Differences of {name}', @@ -36,18 +35,16 @@ const ofName = buildLabelFunction((name?: string) => { export type DerivativeIndexPatternColumn = FormattedIndexPatternColumn & ReferenceBasedIndexPatternColumn & { - operationType: typeof OPERATION_NAME; + operationType: typeof DIFFERENCES_ID; }; export const derivativeOperation: OperationDefinition< DerivativeIndexPatternColumn, 'fullReference' > = { - type: OPERATION_NAME, + type: DIFFERENCES_ID, priority: 1, - displayName: i18n.translate('xpack.lens.indexPattern.derivative', { - defaultMessage: 'Differences', - }), + displayName: DIFFERENCES_NAME, input: 'fullReference', selectionStyle: 'full', requiredReferences: [ @@ -78,7 +75,7 @@ export const derivativeOperation: OperationDefinition< return { label: ofName(ref?.label, previousColumn?.timeScale, previousColumn?.timeShift), dataType: 'number', - operationType: OPERATION_NAME, + operationType: DIFFERENCES_ID, isBucketed: false, scale: 'ratio', references: referenceIds, @@ -114,23 +111,6 @@ export const derivativeOperation: OperationDefinition< }, timeScalingMode: 'optional', filterable: true, - documentation: { - section: 'calculation', - signature: i18n.translate('xpack.lens.indexPattern.differences.signature', { - defaultMessage: 'metric: number', - }), - description: i18n.translate('xpack.lens.indexPattern.differences.documentation.markdown', { - defaultMessage: ` -Calculates the difference to the last value of a metric over time. To use this function, you need to configure a date histogram dimension as well. -Differences requires the data to be sequential. If your data is empty when using differences, try increasing the date histogram interval. - -This calculation will be done separately for separate series defined by filters or top values dimensions. - -Example: Visualize the change in bytes received over time: -\`differences(sum(bytes))\` - `, - }), - }, quickFunctionDocumentation: i18n.translate( 'xpack.lens.indexPattern.differences.documentation.quick', { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/moving_average.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/moving_average.tsx index 2594cc558f026..a2689e7d2209c 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/moving_average.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/moving_average.tsx @@ -9,6 +9,11 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import React, { useState } from 'react'; import { EuiFieldNumber, EuiFormRow } from '@elastic/eui'; +import { + MOVING_AVERAGE_NAME, + MOVING_AVERAGE_ID, + MOVING_AVERAGE_WINDOW_DEFAULT_VALUE, +} from '@kbn/lens-formula-docs'; import { useDebounceWithOptions } from '../../../../../shared_components'; import { FormattedIndexPatternColumn, ReferenceBasedIndexPatternColumn } from '../column_types'; import { FormBasedLayer } from '../../../types'; @@ -37,11 +42,9 @@ const ofName = buildLabelFunction((name?: string) => { }); }); -const WINDOW_DEFAULT_VALUE = 5; - export type MovingAverageIndexPatternColumn = FormattedIndexPatternColumn & ReferenceBasedIndexPatternColumn & { - operationType: 'moving_average'; + operationType: typeof MOVING_AVERAGE_ID; params: { window: number; }; @@ -51,11 +54,9 @@ export const movingAverageOperation: OperationDefinition< MovingAverageIndexPatternColumn, 'fullReference' > = { - type: 'moving_average', + type: MOVING_AVERAGE_ID, priority: 1, - displayName: i18n.translate('xpack.lens.indexPattern.movingAverage', { - defaultMessage: 'Moving average', - }), + displayName: MOVING_AVERAGE_NAME, input: 'fullReference', selectionStyle: 'full', requiredReferences: [ @@ -65,7 +66,12 @@ export const movingAverageOperation: OperationDefinition< }, ], operationParams: [ - { name: 'window', type: 'number', required: false, defaultValue: WINDOW_DEFAULT_VALUE }, + { + name: 'window', + type: 'number', + required: false, + defaultValue: MOVING_AVERAGE_WINDOW_DEFAULT_VALUE, + }, ], getPossibleOperation: (indexPattern) => { if (hasDateField(indexPattern)) { @@ -86,7 +92,7 @@ export const movingAverageOperation: OperationDefinition< }, buildColumn: ({ referenceIds, previousColumn, layer }, columnParams) => { const metric = layer.columns[referenceIds[0]]; - const window = columnParams?.window ?? WINDOW_DEFAULT_VALUE; + const window = columnParams?.window ?? MOVING_AVERAGE_WINDOW_DEFAULT_VALUE; return { label: ofName(metric?.label, previousColumn?.timeScale, previousColumn?.timeShift), @@ -135,28 +141,6 @@ export const movingAverageOperation: OperationDefinition< }, timeScalingMode: 'optional', filterable: true, - documentation: { - section: 'calculation', - signature: i18n.translate('xpack.lens.indexPattern.moving_average.signature', { - defaultMessage: 'metric: number, [window]: number', - }), - description: i18n.translate('xpack.lens.indexPattern.movingAverage.documentation.markdown', { - defaultMessage: ` -Calculates the moving average of a metric over time, averaging the last n-th values to calculate the current value. To use this function, you need to configure a date histogram dimension as well. -The default window value is {defaultValue}. - -This calculation will be done separately for separate series defined by filters or top values dimensions. - -Takes a named parameter \`window\` which specifies how many last values to include in the average calculation for the current value. - -Example: Smooth a line of measurements: -\`moving_average(sum(bytes), window=5)\` - `, - values: { - defaultValue: WINDOW_DEFAULT_VALUE, - }, - }), - }, quickFunctionDocumentation: i18n.translate( 'xpack.lens.indexPattern.movingAverage.documentation.quick', { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/overall_metric.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/overall_metric.tsx index f2314dbdc3d58..68c7f18483d12 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/overall_metric.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/overall_metric.tsx @@ -6,6 +6,20 @@ */ import { i18n } from '@kbn/i18n'; +import { + AVG_ID, + MAX_ID, + MIN_ID, + OVERALL_AVERAGE_ID, + OVERALL_AVERAGE_NAME, + OVERALL_MAX_ID, + OVERALL_MAX_NAME, + OVERALL_MIN_ID, + OVERALL_MIN_NAME, + OVERALL_SUM_ID, + OVERALL_SUM_NAME, + SUM_ID, +} from '@kbn/lens-formula-docs'; import type { FormattedIndexPatternColumn, ReferenceBasedIndexPatternColumn, @@ -19,22 +33,22 @@ type OverallMetricIndexPatternColumn = FormattedIndexPatternCo operationType: T; }; -export type OverallSumIndexPatternColumn = OverallMetricIndexPatternColumn<'overall_sum'>; -export type OverallMinIndexPatternColumn = OverallMetricIndexPatternColumn<'overall_min'>; -export type OverallMaxIndexPatternColumn = OverallMetricIndexPatternColumn<'overall_max'>; -export type OverallAverageIndexPatternColumn = OverallMetricIndexPatternColumn<'overall_average'>; +export type OverallSumIndexPatternColumn = OverallMetricIndexPatternColumn; +export type OverallMinIndexPatternColumn = OverallMetricIndexPatternColumn; +export type OverallMaxIndexPatternColumn = OverallMetricIndexPatternColumn; +export type OverallAverageIndexPatternColumn = OverallMetricIndexPatternColumn< + typeof OVERALL_AVERAGE_ID +>; function buildOverallMetricOperation>({ type, displayName, ofName, - description, metric, }: { type: T['operationType']; displayName: string; ofName: (name?: string) => string; - description: string; metric: string; }): OperationDefinition { return { @@ -90,21 +104,12 @@ function buildOverallMetricOperation({ - type: 'overall_sum', - displayName: i18n.translate('xpack.lens.indexPattern.overallSum', { - defaultMessage: 'Overall sum', - }), + type: OVERALL_SUM_ID, + displayName: OVERALL_SUM_NAME, ofName: (name?: string) => { return i18n.translate('xpack.lens.indexPattern.overallSumOf', { defaultMessage: 'Overall sum of {name}', @@ -117,25 +122,12 @@ export const overallSumOperation = buildOverallMetricOperation({ - type: 'overall_min', - displayName: i18n.translate('xpack.lens.indexPattern.overallMin', { - defaultMessage: 'Overall min', - }), + type: OVERALL_MIN_ID, + displayName: OVERALL_MIN_NAME, ofName: (name?: string) => { return i18n.translate('xpack.lens.indexPattern.overallMinOf', { defaultMessage: 'Overall min of {name}', @@ -148,25 +140,12 @@ export const overallMinOperation = buildOverallMetricOperation({ - type: 'overall_max', - displayName: i18n.translate('xpack.lens.indexPattern.overallMax', { - defaultMessage: 'Overall max', - }), + type: OVERALL_MAX_ID, + displayName: OVERALL_MAX_NAME, ofName: (name?: string) => { return i18n.translate('xpack.lens.indexPattern.overallMaxOf', { defaultMessage: 'Overall max of {name}', @@ -179,26 +158,13 @@ export const overallMaxOperation = buildOverallMetricOperation({ - type: 'overall_average', - displayName: i18n.translate('xpack.lens.indexPattern.overallMax', { - defaultMessage: 'Overall max', - }), + type: OVERALL_AVERAGE_ID, + displayName: OVERALL_AVERAGE_NAME, ofName: (name?: string) => { return i18n.translate('xpack.lens.indexPattern.overallAverageOf', { defaultMessage: 'Overall average of {name}', @@ -211,16 +177,5 @@ export const overallAverageOperation = }, }); }, - metric: 'average', - description: i18n.translate('xpack.lens.indexPattern.overall_average.documentation.markdown', { - defaultMessage: ` -Calculates the average of a metric for all data points of a series in the current chart. A series is defined by a dimension using a date histogram or interval function. -Other dimensions breaking down the data like top values or filter are treated as separate series. - -If no date histograms or interval functions are used in the current chart, \`overall_average\` is calculating the average over all dimensions no matter the used function - -Example: Divergence from the mean: -\`sum(bytes) - overall_average(sum(bytes))\` - `, - }), + metric: AVG_ID, }); diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/time_scale.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/time_scale.tsx index 5915941938737..3ccb3e0808129 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/time_scale.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/time_scale.tsx @@ -6,6 +6,7 @@ */ import { i18n } from '@kbn/i18n'; +import { NORMALIZE_BY_UNIT_ID, NORMALIZE_BY_UNIT_NAME } from '@kbn/lens-formula-docs'; import type { FormattedIndexPatternColumn, ReferenceBasedIndexPatternColumn, @@ -15,19 +16,9 @@ import type { OperationDefinition } from '..'; import { combineErrorMessages, getFormatFromPreviousColumn } from '../helpers'; import { FormBasedLayer } from '../../../types'; -type OverallMetricIndexPatternColumn = FormattedIndexPatternColumn & - ReferenceBasedIndexPatternColumn & { - operationType: T; - }; - -export type OverallSumIndexPatternColumn = OverallMetricIndexPatternColumn<'overall_sum'>; -export type OverallMinIndexPatternColumn = OverallMetricIndexPatternColumn<'overall_min'>; -export type OverallMaxIndexPatternColumn = OverallMetricIndexPatternColumn<'overall_max'>; -export type OverallAverageIndexPatternColumn = OverallMetricIndexPatternColumn<'overall_average'>; - export type TimeScaleIndexPatternColumn = FormattedIndexPatternColumn & ReferenceBasedIndexPatternColumn & { - operationType: 'normalize_by_unit'; + operationType: typeof NORMALIZE_BY_UNIT_ID; params: { unit?: string; }; @@ -35,11 +26,9 @@ export type TimeScaleIndexPatternColumn = FormattedIndexPatternColumn & export const timeScaleOperation: OperationDefinition = { - type: 'normalize_by_unit', + type: NORMALIZE_BY_UNIT_ID, priority: 1, - displayName: i18n.translate('xpack.lens.indexPattern.timeScale', { - defaultMessage: 'Normalize by unit', - }), + displayName: NORMALIZE_BY_UNIT_NAME, input: 'fullReference', selectionStyle: 'hidden', requiredReferences: [ @@ -57,7 +46,7 @@ export const timeScaleOperation: OperationDefinition { - return 'normalize_by_unit'; + return NORMALIZE_BY_UNIT_ID; }, toExpression: (layer, columnId) => { const currentColumn = layer.columns[columnId] as unknown as TimeScaleIndexPatternColumn; @@ -85,9 +74,9 @@ export const timeScaleOperation: OperationDefinition { return { - label: 'Normalize by unit', + label: NORMALIZE_BY_UNIT_NAME, dataType: 'number', - operationType: 'normalize_by_unit', + operationType: NORMALIZE_BY_UNIT_ID, isBucketed: false, scale: 'ratio', references: referenceIds, @@ -102,13 +91,7 @@ export const timeScaleOperation: OperationDefinition { return combineErrorMessages([ - getErrorsForDateReference( - layer, - columnId, - i18n.translate('xpack.lens.indexPattern.timeScale', { - defaultMessage: 'Normalize by unit', - }) - ), + getErrorsForDateReference(layer, columnId, NORMALIZE_BY_UNIT_NAME), !(layer.columns[columnId] as TimeScaleIndexPatternColumn).params.unit ? [ i18n.translate('xpack.lens.indexPattern.timeScale.missingUnit', { @@ -129,21 +112,4 @@ export const timeScaleOperation: OperationDefinition = { - type: OPERATION_TYPE, - displayName: i18n.translate('xpack.lens.indexPattern.cardinality', { - defaultMessage: 'Unique count', - }), + type: CARDINALITY_ID, + displayName: CARDINALITY_NAME, allowAsReference: true, input: 'field', getPossibleOperationForField: ({ @@ -123,7 +121,7 @@ export const cardinalityOperation: OperationDefinition< return { label: ofName(field.displayName, previousColumn?.timeShift, previousColumn?.reducedTimeRange), dataType: 'number', - operationType: OPERATION_TYPE, + operationType: CARDINALITY_ID, scale: SCALE, sourceField: field.name, isBucketed: IS_BUCKETED, @@ -205,23 +203,6 @@ export const cardinalityOperation: OperationDefinition< sourceField: field.name, }; }, - documentation: { - section: 'elasticsearch', - signature: i18n.translate('xpack.lens.indexPattern.cardinality.signature', { - defaultMessage: 'field: string', - }), - description: i18n.translate('xpack.lens.indexPattern.cardinality.documentation.markdown', { - defaultMessage: ` -Calculates the number of unique values of a specified field. Works for number, string, date and boolean values. - -Example: Calculate the number of different products: -\`unique_count(product.name)\` - -Example: Calculate the number of different products from the "clothes" group: -\`unique_count(product.name, kql='product.group=clothes')\` - `, - }), - }, quickFunctionDocumentation: i18n.translate( 'xpack.lens.indexPattern.cardinality.documentation.quick', { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/count.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/count.tsx index 142e38a144dbb..94b1b36193aed 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/count.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/count.tsx @@ -11,6 +11,7 @@ import { euiThemeVars } from '@kbn/ui-theme'; import { EuiSwitch, EuiText } from '@elastic/eui'; import { AggFunctionsMapping } from '@kbn/data-plugin/public'; import { buildExpressionFunction } from '@kbn/expressions-plugin/public'; +import { COUNT_ID, COUNT_NAME } from '@kbn/lens-formula-docs'; import { TimeScaleUnit } from '../../../../../common/expressions'; import { OperationDefinition, ParamEditorProps } from '.'; import { FieldBasedIndexPatternColumn, ValueFormatConfig } from './column_types'; @@ -72,7 +73,7 @@ function ofName( } export type CountIndexPatternColumn = FieldBasedIndexPatternColumn & { - operationType: 'count'; + operationType: typeof COUNT_ID; params?: { emptyAsNull?: boolean; format?: ValueFormatConfig; @@ -83,10 +84,8 @@ const SCALE = 'ratio'; const IS_BUCKETED = false; export const countOperation: OperationDefinition = { - type: 'count', - displayName: i18n.translate('xpack.lens.indexPattern.count', { - defaultMessage: 'Count', - }), + type: COUNT_ID, + displayName: COUNT_NAME, input: 'field', getErrorMessage: (layer, columnId, indexPattern) => combineErrorMessages([ @@ -130,7 +129,7 @@ export const countOperation: OperationDefinition('count', previousColumn) + previousColumn && isColumnOfType(COUNT_ID, previousColumn) ? previousColumn.params?.emptyAsNull : !columnParams?.usedInMath, }, @@ -232,25 +231,6 @@ export const countOperation: OperationDefinition { - const fnDescription = getFunctionDescriptionAndExamples(key, operationDefinitionMap); + const fnDescription = getFunctionDescriptionAndExamples(key); return { label: key, description: ( @@ -47,15 +51,12 @@ function createNewSection( }; } -function getFunctionDescriptionAndExamples( - label: string, - operationDefinitionMap: Record -) { +function getFunctionDescriptionAndExamples(label: string) { if (tinymathFunctions[label]) { const [description, examples] = tinymathFunctions[label].help.split(`\`\`\``); return `${description.replace(/\n/g, '\n\n')}${examples ? `\`\`\`${examples}\`\`\`` : ''}`; } - return operationDefinitionMap[label].documentation?.description; + return documentationMap[label].documentation?.description; } export function getDocumentationSections({ @@ -79,120 +80,14 @@ export function getDocumentationSections({ }); helpGroups.push({ - label: i18n.translate('xpack.lens.formulaFrequentlyUsedHeading', { - defaultMessage: 'Common formulas', - }), - description: i18n.translate('xpack.lens.formulaCommonFormulaDocumentation', { - defaultMessage: `The most common formulas are dividing two values to produce a percent. To display accurately, set "value format" to "percent".`, - }), - - items: [ - { - label: i18n.translate('xpack.lens.formulaDocumentation.filterRatio', { - defaultMessage: 'Filter ratio', - }), - description: ( - - ), - }, - { - label: i18n.translate('xpack.lens.formulaDocumentation.weekOverWeek', { - defaultMessage: 'Week over week', - }), - description: ( - - ), - }, - { - label: i18n.translate('xpack.lens.formulaDocumentation.percentOfTotal', { - defaultMessage: 'Percent of total', - }), - description: ( - - ), - }, - { - label: i18n.translate('xpack.lens.formulaDocumentation.recentChange', { - defaultMessage: 'Recent change', - }), - description: ( - - ), - }, - ], + label: formulasSections.common.label, + description: formulasSections.common.description, + items: formulasSections.common.items.map( + ({ label, description }: { label: string; description: string }) => ({ + label, + description: , + }) + ), }); const { @@ -203,7 +98,7 @@ max(system.network.in.bytes, reducedTimeRange="30m") constants: constantsOperations, } = groupBy(getPossibleFunctions(indexPattern), (key) => { if (key in operationDefinitionMap) { - return operationDefinitionMap[key].documentation?.section; + return documentationMap[key].documentation?.section; } if (key in tinymathFunctions) { return tinymathFunctions[key].section; @@ -213,14 +108,8 @@ max(system.network.in.bytes, reducedTimeRange="30m") // Es aggs helpGroups.push( createNewSection( - i18n.translate('xpack.lens.formulaDocumentation.elasticsearchSection', { - defaultMessage: 'Elasticsearch', - }), - i18n.translate('xpack.lens.formulaDocumentation.elasticsearchSectionDescription', { - defaultMessage: - 'These functions will be executed on the raw documents for each row of the resulting table, aggregating all documents matching the break down dimensions into a single value.', - }), - + formulasSections.elasticsearch.label, + formulasSections.elasticsearch.description, esFunctions, operationDefinitionMap ) @@ -229,14 +118,8 @@ max(system.network.in.bytes, reducedTimeRange="30m") // Calculations aggs helpGroups.push( createNewSection( - i18n.translate('xpack.lens.formulaDocumentation.columnCalculationSection', { - defaultMessage: 'Column calculations', - }), - i18n.translate('xpack.lens.formulaDocumentation.columnCalculationSectionDescription', { - defaultMessage: - 'These functions are executed for each row, but are provided with the whole column as context. This is also known as a window function.', - }), - + formulasSections.calculations.label, + formulasSections.calculations.description, calculationFunctions, operationDefinitionMap ) @@ -244,14 +127,8 @@ max(system.network.in.bytes, reducedTimeRange="30m") helpGroups.push( createNewSection( - i18n.translate('xpack.lens.formulaDocumentation.mathSection', { - defaultMessage: 'Math', - }), - i18n.translate('xpack.lens.formulaDocumentation.mathSectionDescription', { - defaultMessage: - 'These functions will be executed for reach row of the resulting table using single values from the same row calculated using other functions.', - }), - + formulasSections.math.label, + formulasSections.math.description, mathOperations, operationDefinitionMap ) @@ -259,13 +136,8 @@ max(system.network.in.bytes, reducedTimeRange="30m") helpGroups.push( createNewSection( - i18n.translate('xpack.lens.formulaDocumentation.comparisonSection', { - defaultMessage: 'Comparison', - }), - i18n.translate('xpack.lens.formulaDocumentation.comparisonSectionDescription', { - defaultMessage: 'These functions are used to perform value comparison.', - }), - + formulasSections.comparison.label, + formulasSections.comparison.description, comparisonOperations, operationDefinitionMap ) @@ -273,13 +145,8 @@ max(system.network.in.bytes, reducedTimeRange="30m") helpGroups.push( createNewSection( - i18n.translate('xpack.lens.formulaDocumentation.constantsSection', { - defaultMessage: 'Kibana context', - }), - i18n.translate('xpack.lens.formulaDocumentation.constantsSectionDescription', { - defaultMessage: - 'These functions are used to retrieve Kibana context variables, which are the date histogram `interval`, the current `now` and the selected `time_range` and help you to compute date math operations.', - }), + formulasSections.context.label, + formulasSections.context.description, constantsOperations, operationDefinitionMap ) @@ -287,46 +154,7 @@ max(system.network.in.bytes, reducedTimeRange="30m") const sections = { groups: helpGroups, - initialSection: ( - - ), + initialSection: , }; return sections; @@ -369,7 +197,9 @@ export function getFunctionSignatureLabel( } } const extraComma = extraArgs.length ? ', ' : ''; - return `${name}(${def.documentation?.signature}${extraComma}${extraArgs.join(', ')})`; + return `${name}(${documentationMap[name].documentation?.signature}${extraComma}${extraArgs.join( + ', ' + )})`; } return ''; } @@ -396,7 +226,7 @@ export function getHelpTextContent( operationDefinitionMap: ParamEditorProps['operationDefinitionMap'] ): { description: string; examples: string[] } { const definition = operationDefinitionMap[type]; - const description = definition.documentation?.description ?? ''; + const description = documentationMap[type].documentation?.description ?? ''; // as for the time being just add examples text. // Later will enrich with more information taken from the operation definitions. diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/math_completion.test.ts b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/math_completion.test.ts index 419208ec48d80..270aa5f2c1bb7 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/math_completion.test.ts +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/math_completion.test.ts @@ -9,10 +9,10 @@ import { parse } from '@kbn/tinymath'; import { monaco } from '@kbn/monaco'; import { unifiedSearchPluginMock } from '@kbn/unified-search-plugin/public/mocks'; import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; +import { tinymathFunctions } from '@kbn/lens-formula-docs'; import { createMockedIndexPattern } from '../../../../mocks'; import { GenericOperationDefinition } from '../..'; import type { OperationMetadata, IndexPatternField } from '../../../../../../types'; -import { tinymathFunctions } from '../util'; import { getSignatureHelp, getHover, @@ -48,11 +48,6 @@ const operationDefinitionMap: Record = { getPossibleOperationForField: jest.fn((field: IndexPatternField) => field.type === 'number' ? numericOperation() : undefined ), - documentation: { - section: 'elasticsearch', - signature: 'field: string', - description: 'description', - }, }), count: createOperationDefinitionMock('count', { getPossibleOperationForField: (field: IndexPatternField) => @@ -93,7 +88,7 @@ const operationDefinitionMap: Record = { ), }; -describe('math completion', () => { +describe('[Lens formula] math completion', () => { describe('signature help', () => { function unwrapSignatures(signatureResult: monaco.languages.SignatureHelpResult) { return signatureResult.value.signatures[0]; @@ -106,15 +101,21 @@ describe('math completion', () => { it('should return a signature for a field-based ES function', () => { expect(unwrapSignatures(getSignatureHelp('sum()', 4, operationDefinitionMap))).toEqual({ label: 'sum(field: string)', - documentation: { value: 'description' }, + documentation: { + value: ` +Returns the sum of a field. This function only works for number fields.`, + }, parameters: [{ label: 'field' }], }); }); it('should return a signature for count', () => { expect(unwrapSignatures(getSignatureHelp('count()', 6, operationDefinitionMap))).toEqual({ - label: 'count(undefined)', - documentation: { value: '' }, + label: 'count([field: string])', + documentation: { + value: ` +The total number of documents. When you provide a field, the total number of field values is counted. When you use the Count function for fields that have multiple values in a single document, all values are counted.`, + }, parameters: [], }); }); @@ -126,7 +127,11 @@ describe('math completion', () => { ) ).toEqual({ label: expect.stringContaining('moving_average('), - documentation: { value: '' }, + documentation: { + value: ` +Calculates the moving average of a metric over time, averaging the last n-th values to calculate the current value. To use this function, you need to configure a date histogram dimension as well. +The default window value is 5.`, + }, parameters: [ { label: 'function' }, { @@ -145,7 +150,10 @@ describe('math completion', () => { ).toEqual({ label: expect.stringContaining('count('), parameters: [], - documentation: { value: '' }, + documentation: { + value: ` +The total number of documents. When you provide a field, the total number of field values is counted. When you use the Count function for fields that have multiple values in a single document, all values are counted.`, + }, }); }); diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/math_completion.ts b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/math_completion.ts index 2213391235847..eac9f66c77107 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/math_completion.ts +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/math_completion.ts @@ -22,12 +22,13 @@ import type { } from '@kbn/unified-search-plugin/public'; import type { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import { parseTimeShift } from '@kbn/data-plugin/common'; +import { tinymathFunctions } from '@kbn/lens-formula-docs'; import moment from 'moment'; import { nonNullable } from '../../../../../../utils'; import { DateRange } from '../../../../../../../common/types'; import type { IndexPattern } from '../../../../../../types'; import { memoizedGetAvailableOperationsByMetadata } from '../../../operations'; -import { tinymathFunctions, groupArgsByType, unquotedStringRegex } from '../util'; +import { groupArgsByType, unquotedStringRegex } from '../util'; import type { GenericOperationDefinition } from '../..'; import { getFunctionSignatureLabel, getHelpTextContent } from './formula_help'; import { hasFunctionFieldArgument } from '../validation'; diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/formula.test.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/formula.test.tsx index ea77bc3e429ab..382fd2fa6a9ca 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/formula.test.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/formula.test.tsx @@ -5,6 +5,7 @@ * 2.0. */ +import { tinymathFunctions } from '@kbn/lens-formula-docs'; import { createMockedIndexPattern } from '../../../mocks'; import { formulaOperation, @@ -15,7 +16,6 @@ import type { FormulaIndexPatternColumn } from './formula'; import { insertOrReplaceFormulaColumn } from './parse'; import type { FormBasedLayer } from '../../../types'; import { IndexPattern } from '../../../../../types'; -import { tinymathFunctions } from './util'; import { TermsIndexPatternColumn } from '../terms'; import { MovingAverageIndexPatternColumn } from '../calculations'; import { StaticValueIndexPatternColumn } from '../static_value'; @@ -82,7 +82,7 @@ const operationDefinitionMap: Record = { }), }; -describe('formula', () => { +describe('[Lens] formula', () => { let layer: FormBasedLayer; beforeEach(() => { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/util.ts b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/util.ts index 6dcc727ec0e70..87cdde46843e2 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/util.ts +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/util.ts @@ -6,7 +6,6 @@ */ import { groupBy, isObject } from 'lodash'; -import { i18n } from '@kbn/i18n'; import type { TinymathAST, TinymathFunction, @@ -14,6 +13,7 @@ import type { TinymathVariable, } from '@kbn/tinymath'; import type { Query } from '@kbn/es-query'; +import { tinymathFunctions } from '@kbn/lens-formula-docs'; import { nonNullable } from '../../../../../utils'; import type { OperationDefinition, @@ -108,635 +108,6 @@ export function getOperationParams( }, {}); } -export function getTypeI18n(type: string) { - if (type === 'number') { - return i18n.translate('xpack.lens.formula.number', { defaultMessage: 'number' }); - } - if (type === 'string') { - return i18n.translate('xpack.lens.formula.string', { defaultMessage: 'string' }); - } - if (type === 'boolean') { - return i18n.translate('xpack.lens.formula.boolean', { defaultMessage: 'boolean' }); - } - return ''; -} - -export const tinymathFunctions: Record< - string, - { - section: 'math' | 'comparison'; - positionalArguments: Array<{ - name: string; - optional?: boolean; - defaultValue?: string | number; - type?: string; - alternativeWhenMissing?: string; - }>; - // Help is in Markdown format - help: string; - // When omitted defaults to "number". - // Used for comparison functions return type - outputType?: string; - } -> = { - add: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.addFunction.markdown', { - defaultMessage: ` -Adds up two numbers. -Also works with \`+\` symbol. - -Example: Calculate the sum of two fields - -\`sum(price) + sum(tax)\` - -Example: Offset count by a static value - -\`add(count(), 5)\` - `, - }), - }, - subtract: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.subtractFunction.markdown', { - defaultMessage: ` -Subtracts the first number from the second number. -Also works with \`-\` symbol. - -Example: Calculate the range of a field -\`subtract(max(bytes), min(bytes))\` - `, - }), - }, - multiply: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.multiplyFunction.markdown', { - defaultMessage: ` -Multiplies two numbers. -Also works with \`*\` symbol. - -Example: Calculate price after current tax rate -\`sum(bytes) * last_value(tax_rate)\` - -Example: Calculate price after constant tax rate -\`multiply(sum(price), 1.2)\` - `, - }), - }, - divide: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.divideFunction.markdown', { - defaultMessage: ` -Divides the first number by the second number. -Also works with \`/\` symbol - -Example: Calculate profit margin -\`sum(profit) / sum(revenue)\` - -Example: \`divide(sum(bytes), 2)\` - `, - }), - }, - abs: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.absFunction.markdown', { - defaultMessage: ` -Calculates absolute value. A negative value is multiplied by -1, a positive value stays the same. - -Example: Calculate average distance to sea level \`abs(average(altitude))\` - `, - }), - }, - cbrt: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.cbrtFunction.markdown', { - defaultMessage: ` -Cube root of value. - -Example: Calculate side length from volume -\`cbrt(last_value(volume))\` - `, - }), - }, - ceil: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.ceilFunction.markdown', { - defaultMessage: ` -Ceiling of value, rounds up. - -Example: Round up price to the next dollar -\`ceil(sum(price))\` - `, - }), - }, - clamp: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.min', { defaultMessage: 'min' }), - type: getTypeI18n('number'), - alternativeWhenMissing: 'pick_max', - }, - { - name: i18n.translate('xpack.lens.formula.max', { defaultMessage: 'max' }), - type: getTypeI18n('number'), - alternativeWhenMissing: 'pick_min', - }, - ], - help: i18n.translate('xpack.lens.formula.clampFunction.markdown', { - defaultMessage: ` -Limits the value from a minimum to maximum. - -Example: Make sure to catch outliers -\`\`\` -clamp( - average(bytes), - percentile(bytes, percentile=5), - percentile(bytes, percentile=95) -) -\`\`\` -`, - }), - }, - cube: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.cubeFunction.markdown', { - defaultMessage: ` -Calculates the cube of a number. - -Example: Calculate volume from side length -\`cube(last_value(length))\` - `, - }), - }, - exp: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.expFunction.markdown', { - defaultMessage: ` -Raises *e* to the nth power. - -Example: Calculate the natural exponential function - -\`exp(last_value(duration))\` - `, - }), - }, - fix: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.fixFunction.markdown', { - defaultMessage: ` -For positive values, takes the floor. For negative values, takes the ceiling. - -Example: Rounding towards zero -\`fix(sum(profit))\` - `, - }), - }, - floor: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.floorFunction.markdown', { - defaultMessage: ` -Round down to nearest integer value - -Example: Round down a price -\`floor(sum(price))\` - `, - }), - }, - log: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.base', { defaultMessage: 'base' }), - optional: true, - defaultValue: 'e', - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.logFunction.markdown', { - defaultMessage: ` -Logarithm with optional base. The natural base *e* is used as default. - -Example: Calculate number of bits required to store values -\`\`\` -log(sum(bytes)) -log(sum(bytes), 2) -\`\`\` - `, - }), - }, - mod: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.base', { defaultMessage: 'base' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.modFunction.markdown', { - defaultMessage: ` -Remainder after dividing the function by a number - -Example: Calculate last three digits of a value -\`mod(sum(price), 1000)\` - `, - }), - }, - pow: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.base', { defaultMessage: 'base' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.powFunction.markdown', { - defaultMessage: ` -Raises the value to a certain power. The second argument is required - -Example: Calculate volume based on side length -\`pow(last_value(length), 3)\` - `, - }), - }, - round: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.decimals', { defaultMessage: 'decimals' }), - optional: true, - defaultValue: 0, - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.roundFunction.markdown', { - defaultMessage: ` -Rounds to a specific number of decimal places, default of 0 - -Examples: Round to the cent -\`\`\` -round(sum(bytes)) -round(sum(bytes), 2) -\`\`\` - `, - }), - }, - sqrt: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.sqrtFunction.markdown', { - defaultMessage: ` -Square root of a positive value only - -Example: Calculate side length based on area -\`sqrt(last_value(area))\` - `, - }), - }, - square: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.squareFunction.markdown', { - defaultMessage: ` -Raise the value to the 2nd power - -Example: Calculate area based on side length -\`square(last_value(length))\` - `, - }), - }, - pick_max: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.maxFunction.markdown', { - defaultMessage: ` -Finds the maximum value between two numbers. - -Example: Find the maximum between two fields averages -\`pick_max(average(bytes), average(memory))\` - `, - }), - }, - pick_min: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.minFunction.markdown', { - defaultMessage: ` -Finds the minimum value between two numbers. - -Example: Find the minimum between two fields averages -\`pick_min(average(bytes), average(memory))\` - `, - }), - }, - defaults: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.defaultValue', { defaultMessage: 'default' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.defaultFunction.markdown', { - defaultMessage: ` -Returns a default numeric value when value is null. - -Example: Return -1 when a field has no data -\`defaults(average(bytes), -1)\` -`, - }), - }, - lt: { - section: 'comparison', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - outputType: getTypeI18n('boolean'), - help: i18n.translate('xpack.lens.formula.ltFunction.markdown', { - defaultMessage: ` -Performs a lower than comparison between two values. -To be used as condition for \`ifelse\` comparison function. -Also works with \`<\` symbol. - -Example: Returns true if the average of bytes is lower than the average amount of memory -\`average(bytes) <= average(memory)\` - -Example: \`lt(average(bytes), 1000)\` - `, - }), - }, - gt: { - section: 'comparison', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - outputType: getTypeI18n('boolean'), - help: i18n.translate('xpack.lens.formula.gtFunction.markdown', { - defaultMessage: ` -Performs a greater than comparison between two values. -To be used as condition for \`ifelse\` comparison function. -Also works with \`>\` symbol. - -Example: Returns true if the average of bytes is greater than the average amount of memory -\`average(bytes) > average(memory)\` - -Example: \`gt(average(bytes), 1000)\` - `, - }), - }, - eq: { - section: 'comparison', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - outputType: getTypeI18n('boolean'), - help: i18n.translate('xpack.lens.formula.eqFunction.markdown', { - defaultMessage: ` -Performs an equality comparison between two values. -To be used as condition for \`ifelse\` comparison function. -Also works with \`==\` symbol. - -Example: Returns true if the average of bytes is exactly the same amount of average memory -\`average(bytes) == average(memory)\` - -Example: \`eq(sum(bytes), 1000000)\` - `, - }), - }, - lte: { - section: 'comparison', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - outputType: getTypeI18n('boolean'), - help: i18n.translate('xpack.lens.formula.lteFunction.markdown', { - defaultMessage: ` -Performs a lower than or equal comparison between two values. -To be used as condition for \`ifelse\` comparison function. -Also works with \`<=\` symbol. - -Example: Returns true if the average of bytes is lower than or equal to the average amount of memory -\`average(bytes) <= average(memory)\` - -Example: \`lte(average(bytes), 1000)\` - `, - }), - }, - gte: { - section: 'comparison', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - outputType: getTypeI18n('boolean'), - help: i18n.translate('xpack.lens.formula.gteFunction.markdown', { - defaultMessage: ` -Performs a greater than comparison between two values. -To be used as condition for \`ifelse\` comparison function. -Also works with \`>=\` symbol. - -Example: Returns true if the average of bytes is greater than or equal to the average amount of memory -\`average(bytes) >= average(memory)\` - -Example: \`gte(average(bytes), 1000)\` - `, - }), - }, - ifelse: { - section: 'comparison', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.condition', { defaultMessage: 'condition' }), - type: getTypeI18n('boolean'), - }, - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.ifElseFunction.markdown', { - defaultMessage: ` -Returns a value depending on whether the element of condition is true or false. - -Example: Average revenue per customer but in some cases customer id is not provided which counts as additional customer -\`sum(total)/(unique_count(customer_id) + ifelse( count() > count(kql='customer_id:*'), 1, 0))\` - `, - }), - }, -}; - export function isMathNode(node: TinymathAST | string) { return isObject(node) && node.type === 'function' && tinymathFunctions[node.name]; } diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/validation.ts b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/validation.ts index 95eb8a84e6849..5d6085c377829 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/validation.ts +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/validation.ts @@ -10,6 +10,7 @@ import { i18n } from '@kbn/i18n'; import { parse, TinymathLocation, TinymathVariable } from '@kbn/tinymath'; import type { TinymathAST, TinymathFunction, TinymathNamedArgument } from '@kbn/tinymath'; import { luceneStringToDsl, toElasticsearchQuery, fromKueryExpression } from '@kbn/es-query'; +import { tinymathFunctions, getTypeI18n } from '@kbn/lens-formula-docs'; import type { Query } from '@kbn/es-query'; import { isAbsoluteTimeShift, @@ -24,11 +25,9 @@ import { findMathNodes, findVariables, getOperationParams, - getTypeI18n, getValueOrName, groupArgsByType, isMathNode, - tinymathFunctions, } from './util'; import type { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/index.ts b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/index.ts index 3c62f34cbc1f2..fd6b68c2bf65d 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/index.ts +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/index.ts @@ -350,11 +350,6 @@ interface BaseOperationDefinitionProps< * Operations can be used as middleware for other operations, hence not shown in the panel UI */ hidden?: boolean; - documentation?: { - signature: string; - description: string; - section: 'elasticsearch' | 'calculation' | 'constants'; - }; quickFunctionDocumentation?: string; /** * React component for operation field specific behaviour diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.tsx index 6432577173af2..0861148aacc3d 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.tsx @@ -18,6 +18,7 @@ import { import { AggFunctionsMapping } from '@kbn/data-plugin/public'; import { buildExpressionFunction } from '@kbn/expressions-plugin/public'; import { FormattedMessage } from '@kbn/i18n-react'; +import { LAST_VALUE_ID, LAST_VALUE_NAME } from '@kbn/lens-formula-docs'; import type { FieldBasedOperationErrorMessage, OperationDefinition } from '.'; import { FieldBasedIndexPatternColumn, ValueFormatConfig } from './column_types'; import type { IndexPatternField, IndexPattern } from '../../../../types'; @@ -136,7 +137,7 @@ function setDefaultShowArrayValues( } export interface LastValueIndexPatternColumn extends FieldBasedIndexPatternColumn { - operationType: 'last_value'; + operationType: typeof LAST_VALUE_ID; params: { sortField: string; showArrayValues: boolean; @@ -161,10 +162,8 @@ export const lastValueOperation: OperationDefinition< Partial, true > = { - type: 'last_value', - displayName: i18n.translate('xpack.lens.indexPattern.lastValue', { - defaultMessage: 'Last value', - }), + type: LAST_VALUE_ID, + displayName: LAST_VALUE_NAME, getDefaultLabel: (column, columns, indexPattern) => ofName( getSafeName(column.sourceField, indexPattern), @@ -250,7 +249,7 @@ export const lastValueOperation: OperationDefinition< return { label: ofName(field.displayName, previousColumn?.timeShift, previousColumn?.reducedTimeRange), dataType: field.type as DataType, - operationType: 'last_value', + operationType: LAST_VALUE_ID, isBucketed: false, scale: getScale(field.type), sourceField: field.name, @@ -450,22 +449,6 @@ export const lastValueOperation: OperationDefinition< ); }, - documentation: { - section: 'elasticsearch', - signature: i18n.translate('xpack.lens.indexPattern.lastValue.signature', { - defaultMessage: 'field: string', - }), - description: i18n.translate('xpack.lens.indexPattern.lastValue.documentation.markdown', { - defaultMessage: ` -Returns the value of a field from the last document, ordered by the default time field of the data view. - -This function is usefull the retrieve the latest state of an entity. - -Example: Get the current status of server A: -\`last_value(server.status, kql=\'server.name="A"\')\` - `, - }), - }, quickFunctionDocumentation: i18n.translate( 'xpack.lens.indexPattern.lastValue.documentation.quick', { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/metrics.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/metrics.tsx index 589b840c29f22..87e3432d54e2f 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/metrics.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/metrics.tsx @@ -10,6 +10,20 @@ import React from 'react'; import { EuiSwitch, EuiText } from '@elastic/eui'; import { euiThemeVars } from '@kbn/ui-theme'; import { buildExpressionFunction } from '@kbn/expressions-plugin/public'; +import { + AVG_ID, + AVG_NAME, + MAX_ID, + MAX_NAME, + MEDIAN_ID, + MEDIAN_NAME, + MIN_ID, + MIN_NAME, + STD_DEVIATION_ID, + STD_DEVIATION_NAME, + SUM_ID, + SUM_NAME, +} from '@kbn/lens-formula-docs'; import { LayerSettingsFeatures, OperationDefinition, ParamEditorProps } from '.'; import { getFormatFromPreviousColumn, @@ -62,7 +76,6 @@ function buildMetricOperation>({ supportsDate, hideZeroOption, aggConfigParams, - documentationDescription, quickFunctionDocumentation, unsupportedSettings, }: { @@ -228,28 +241,6 @@ function buildMetricOperation>({ ]), filterable: true, canReduceTimeRange: true, - documentation: { - section: 'elasticsearch', - signature: i18n.translate('xpack.lens.indexPattern.metric.signature', { - defaultMessage: 'field: string', - }), - description: - documentationDescription || - i18n.translate('xpack.lens.indexPattern.metric.documentation.markdown', { - defaultMessage: ` -Returns the {metric} of a field. This function only works for number fields. - -Example: Get the {metric} of price: -\`{metric}(price)\` - -Example: Get the {metric} of price for orders from the UK: -\`{metric}(price, kql='location:UK')\` - `, - values: { - metric: type, - }, - }), - }, quickFunctionDocumentation, shiftable: true, } as OperationDefinition; @@ -263,10 +254,8 @@ export type MaxIndexPatternColumn = MetricColumn<'max'>; export type MedianIndexPatternColumn = MetricColumn<'median'>; export const minOperation = buildMetricOperation({ - type: 'min', - displayName: i18n.translate('xpack.lens.indexPattern.min', { - defaultMessage: 'Minimum', - }), + type: MIN_ID, + displayName: MIN_NAME, ofName: (name) => i18n.translate('xpack.lens.indexPattern.minOf', { defaultMessage: 'Minimum of {name}', @@ -287,10 +276,8 @@ export const minOperation = buildMetricOperation({ }); export const maxOperation = buildMetricOperation({ - type: 'max', - displayName: i18n.translate('xpack.lens.indexPattern.max', { - defaultMessage: 'Maximum', - }), + type: MAX_ID, + displayName: MAX_NAME, ofName: (name) => i18n.translate('xpack.lens.indexPattern.maxOf', { defaultMessage: 'Maximum of {name}', @@ -311,11 +298,9 @@ export const maxOperation = buildMetricOperation({ }); export const averageOperation = buildMetricOperation({ - type: 'average', + type: AVG_ID, priority: 2, - displayName: i18n.translate('xpack.lens.indexPattern.avg', { - defaultMessage: 'Average', - }), + displayName: AVG_NAME, ofName: (name) => i18n.translate('xpack.lens.indexPattern.avgOf', { defaultMessage: 'Average of {name}', @@ -335,10 +320,8 @@ export const averageOperation = buildMetricOperation({ export const standardDeviationOperation = buildMetricOperation( { - type: 'standard_deviation', - displayName: i18n.translate('xpack.lens.indexPattern.standardDeviation', { - defaultMessage: 'Standard deviation', - }), + type: STD_DEVIATION_ID, + displayName: STD_DEVIATION_NAME, ofName: (name) => i18n.translate('xpack.lens.indexPattern.standardDeviationOf', { defaultMessage: 'Standard deviation of {name}', @@ -351,20 +334,6 @@ export const standardDeviationOperation = buildMetricOperation({ - type: 'sum', + type: SUM_ID, priority: 1, - displayName: i18n.translate('xpack.lens.indexPattern.sum', { - defaultMessage: 'Sum', - }), + displayName: SUM_NAME, ofName: (name) => i18n.translate('xpack.lens.indexPattern.sumOf', { defaultMessage: 'Sum of {name}', @@ -401,11 +368,9 @@ export const sumOperation = buildMetricOperation({ }); export const medianOperation = buildMetricOperation({ - type: 'median', + type: MEDIAN_ID, priority: 3, - displayName: i18n.translate('xpack.lens.indexPattern.median', { - defaultMessage: 'Median', - }), + displayName: MEDIAN_NAME, ofName: (name) => i18n.translate('xpack.lens.indexPattern.medianOf', { defaultMessage: 'Median of {name}', diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile.tsx index 3b9ecf0417313..be40f31c770aa 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile.tsx @@ -16,6 +16,7 @@ import { ExpressionAstFunctionBuilder, } from '@kbn/expressions-plugin/public'; import { useDebouncedValue } from '@kbn/visualization-ui-components'; +import { PERCENTILE_ID, PERCENTILE_NAME } from '@kbn/lens-formula-docs'; import { OperationDefinition } from '.'; import { getFormatFromPreviousColumn, @@ -33,7 +34,7 @@ import { getColumnReducedTimeRangeError } from '../../reduced_time_range_utils'; import { getGroupByKey, groupByKey } from './get_group_by_key'; export interface PercentileIndexPatternColumn extends FieldBasedIndexPatternColumn { - operationType: 'percentile'; + operationType: typeof PERCENTILE_ID; params: { percentile: number; format?: { @@ -110,11 +111,9 @@ export const percentileOperation: OperationDefinition< { percentile: number }, true > = { - type: 'percentile', + type: PERCENTILE_ID, allowAsReference: true, - displayName: i18n.translate('xpack.lens.indexPattern.percentile', { - defaultMessage: 'Percentile', - }), + displayName: PERCENTILE_NAME, input: 'field', operationParams: [ { name: 'percentile', type: 'number', required: false, defaultValue: DEFAULT_PERCENTILE_VALUE }, @@ -161,7 +160,7 @@ export const percentileOperation: OperationDefinition< buildColumn: ({ field, previousColumn, indexPattern }, columnParams) => { const existingPercentileParam = previousColumn && - isColumnOfType('percentile', previousColumn) && + isColumnOfType(PERCENTILE_ID, previousColumn) && previousColumn.params.percentile; const newPercentileParam = columnParams?.percentile ?? (existingPercentileParam || DEFAULT_PERCENTILE_VALUE); @@ -173,7 +172,7 @@ export const percentileOperation: OperationDefinition< previousColumn?.reducedTimeRange ), dataType: 'number', - operationType: 'percentile', + operationType: PERCENTILE_ID, sourceField: field.name, isBucketed: false, scale: 'ratio', @@ -431,20 +430,6 @@ export const percentileOperation: OperationDefinition< ); }, - documentation: { - section: 'elasticsearch', - signature: i18n.translate('xpack.lens.indexPattern.percentile.signature', { - defaultMessage: 'field: string, [percentile]: number', - }), - description: i18n.translate('xpack.lens.indexPattern.percentile.documentation.markdown', { - defaultMessage: ` -Returns the specified percentile of the values of a field. This is the value n percent of the values occuring in documents are smaller. - -Example: Get the number of bytes larger than 95 % of values: -\`percentile(bytes, percentile=95)\` - `, - }), - }, quickFunctionDocumentation: i18n.translate( 'xpack.lens.indexPattern.percentile.documentation.quick', { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx index 54d6f379d9e5f..3eb867442ef17 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx @@ -11,6 +11,7 @@ import { i18n } from '@kbn/i18n'; import { AggFunctionsMapping } from '@kbn/data-plugin/public'; import { buildExpressionFunction } from '@kbn/expressions-plugin/public'; import { useDebouncedValue } from '@kbn/visualization-ui-components'; +import { PERCENTILE_RANK_ID, PERCENTILE_RANK_NAME } from '@kbn/lens-formula-docs'; import { OperationDefinition } from '.'; import { getFormatFromPreviousColumn, @@ -27,7 +28,7 @@ import { FormRow } from './shared_components'; import { getColumnReducedTimeRangeError } from '../../reduced_time_range_utils'; export interface PercentileRanksIndexPatternColumn extends FieldBasedIndexPatternColumn { - operationType: 'percentile_rank'; + operationType: typeof PERCENTILE_RANK_ID; params: { value: number; }; @@ -63,11 +64,9 @@ export const percentileRanksOperation: OperationDefinition< { value: number }, true > = { - type: 'percentile_rank', + type: PERCENTILE_RANK_ID, allowAsReference: true, - displayName: i18n.translate('xpack.lens.indexPattern.percentileRank', { - defaultMessage: 'Percentile rank', - }), + displayName: PERCENTILE_RANK_NAME, input: 'field', operationParams: [ { @@ -256,20 +255,6 @@ export const percentileRanksOperation: OperationDefinition< ); }, - documentation: { - section: 'elasticsearch', - signature: i18n.translate('xpack.lens.indexPattern.percentileRanks.signature', { - defaultMessage: 'field: string, [value]: number', - }), - description: i18n.translate('xpack.lens.indexPattern.percentileRanks.documentation.markdown', { - defaultMessage: ` -Returns the percentage of values which are below a certain value. For example, if a value is greater than or equal to 95% of the observed values it is said to be at the 95th percentile rank - -Example: Get the percentage of values which are below of 100: -\`percentile_rank(bytes, value=100)\` - `, - }), - }, quickFunctionDocumentation: i18n.translate( 'xpack.lens.indexPattern.percentileRanks.documentation.quick', { diff --git a/x-pack/plugins/lens/public/visualizations/datatable/visualization.test.tsx b/x-pack/plugins/lens/public/visualizations/datatable/visualization.test.tsx index a3f4f6f797ee1..dda07ef2c41c8 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/visualization.test.tsx +++ b/x-pack/plugins/lens/public/visualizations/datatable/visualization.test.tsx @@ -759,6 +759,47 @@ describe('Datatable Visualization', () => { }).headerRowHeightLines ).toEqual([2]); }); + + it('sets alignment correctly', () => { + datasource.publicAPIMock.getOperationForColumnId.mockReturnValue({ + dataType: 'string', + isBucketed: false, // <= make them metrics + label: 'label', + isStaticValue: false, + hasTimeShift: false, + hasReducedTimeRange: false, + }); + const expression = datatableVisualization.toExpression( + { + ...defaultExpressionTableState, + columns: [ + { columnId: 'b', alignment: 'center' }, + { columnId: 'c', alignment: 'left' }, + { columnId: 'a' }, + ], + }, + frame.datasourceLayers, + {}, + { '1': { type: 'expression', chain: [] } } + ) as Ast; + + const columnArgs = buildExpression(expression).findFunction('lens_datatable_column'); + expect(columnArgs[0].arguments).toEqual( + expect.objectContaining({ + alignment: ['left'], + }) + ); + expect(columnArgs[1].arguments).toEqual( + expect.objectContaining({ + alignment: ['center'], + }) + ); + expect(columnArgs[2].arguments).toEqual( + expect.not.objectContaining({ + alignment: [], + }) + ); + }); }); describe('#onEditAction', () => { diff --git a/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx b/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx index 505b20bdc3e58..f22d17afad762 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx @@ -496,6 +496,7 @@ export const getDatatableVisualization = ({ width: column.width, isTransposed: column.isTransposed, transposable: isTransposable, + alignment: column.alignment, colorMode: canColor && column.colorMode ? column.colorMode : 'none', palette: paletteService.get(CUSTOM_PALETTE).toExpression(paletteParams), summaryRow: hasNoSummaryRow ? undefined : column.summaryRow!, diff --git a/x-pack/plugins/lens/tsconfig.json b/x-pack/plugins/lens/tsconfig.json index 6052ae05d37cf..8fc8eafc53f11 100644 --- a/x-pack/plugins/lens/tsconfig.json +++ b/x-pack/plugins/lens/tsconfig.json @@ -98,6 +98,7 @@ "@kbn/cell-actions", "@kbn/calculate-width-from-char-count", "@kbn/discover-utils", + "@kbn/lens-formula-docs", "@kbn/visualization-utils" ], "exclude": [ diff --git a/x-pack/plugins/maps/public/classes/layers/tile_errors_list.tsx b/x-pack/plugins/maps/public/classes/layers/tile_errors_list.tsx index 38bb078cd98d0..9520184d48753 100644 --- a/x-pack/plugins/maps/public/classes/layers/tile_errors_list.tsx +++ b/x-pack/plugins/maps/public/classes/layers/tile_errors_list.tsx @@ -8,9 +8,10 @@ import React, { useEffect, useState } from 'react'; import { Adapters } from '@kbn/inspector-plugin/common/adapters'; import { i18n } from '@kbn/i18n'; -import { EuiButton, EuiButtonEmpty, EuiCodeBlock, EuiContextMenu, EuiPopover } from '@elastic/eui'; +import { EuiButtonEmpty, EuiContextMenu, EuiPopover } from '@elastic/eui'; +import { createEsError } from '@kbn/search-errors'; import type { TileError } from '../../../common/descriptor_types'; -import { getInspector } from '../../kibana_services'; +import { getApplication, getDocLinks, getInspector } from '../../kibana_services'; import { RESPONSE_VIEW_ID } from '../../inspector/vector_tile_adapter/components/vector_tile_inspector'; interface Props { @@ -57,6 +58,41 @@ export function TileErrorsList(props: Props) { }, ]; + function renderError(tileError: TileError) { + if (!props.isESSource || !tileError.error) { + return tileError.message; + } + + const esError = createEsError( + { + statusCode: 400, + message: tileError.message, + attributes: { + error: tileError.error, + }, + }, + () => { + getInspector().open(props.inspectorAdapters, { + options: { + initialLayerId: props.layerId, + initialTileKey: tileError.tileKey, + initialTab: [RESPONSE_VIEW_ID], + }, + }); + }, + { + application: getApplication(), + docLinks: getDocLinks(), + } + ); + return ( + <> + {esError.getErrorMessage()} + {esError.getActions()} + + ); + } + return ( <> - - {getDescription(selectedTileError)} - - {props.isESSource && ( - { - getInspector().open(props.inspectorAdapters, { - options: { - initialLayerId: props.layerId, - initialTileKey: selectedTileError?.tileKey, - initialTab: [RESPONSE_VIEW_ID], - }, - }); - }} - size="s" - > - {i18n.translate('xpack.maps.tileError.viewDetailsButtonLabel', { - defaultMessage: 'View details', - })} - - )} + {renderError(selectedTileError)} ); } @@ -113,15 +128,3 @@ function getTitle(tileKey: string) { values: { tileKey }, }); } - -function getDescription(tileError: TileError) { - if (tileError.error?.root_cause?.[0]?.reason) { - return tileError.error.root_cause[0].reason; - } - - if (tileError.error?.reason) { - return tileError.error.reason; - } - - return tileError.message; -} diff --git a/x-pack/plugins/observability_ai_assistant/common/types.ts b/x-pack/plugins/observability_ai_assistant/common/types.ts index 2584a1c7083fd..b7ef771378403 100644 --- a/x-pack/plugins/observability_ai_assistant/common/types.ts +++ b/x-pack/plugins/observability_ai_assistant/common/types.ts @@ -6,15 +6,12 @@ */ import type { JSONSchema } from 'json-schema-to-ts'; -import type { - CreateChatCompletionResponse, - CreateChatCompletionResponseChoicesInner, -} from 'openai'; +import type OpenAI from 'openai'; import type { Observable } from 'rxjs'; -export type CreateChatCompletionResponseChunk = Omit & { +export type CreateChatCompletionResponseChunk = Omit & { choices: Array< - Omit & { + Omit & { delta: { content?: string; function_call?: { name?: string; arguments?: string } }; } >; diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/index.ts b/x-pack/plugins/observability_ai_assistant/server/functions/esql/index.ts index dcc26adc52e43..bbadaa82a8fb3 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/index.ts +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/index.ts @@ -288,6 +288,8 @@ export function registerEsqlFunction({ delta: { content: cachedContent, }, + index: 0, + finish_reason: null, }, ], }); diff --git a/x-pack/plugins/observability_ai_assistant/server/routes/chat/route.ts b/x-pack/plugins/observability_ai_assistant/server/routes/chat/route.ts index 163b41135b518..87b473e9a320b 100644 --- a/x-pack/plugins/observability_ai_assistant/server/routes/chat/route.ts +++ b/x-pack/plugins/observability_ai_assistant/server/routes/chat/route.ts @@ -7,7 +7,7 @@ import { notImplemented } from '@hapi/boom'; import * as t from 'io-ts'; import { toBooleanRt } from '@kbn/io-ts-utils'; -import type { CreateChatCompletionResponse } from 'openai'; +import type OpenAI from 'openai'; import { Readable } from 'stream'; import { createObservabilityAIAssistantServerRoute } from '../create_observability_ai_assistant_server_route'; import { messageRt } from '../runtime_types'; @@ -38,7 +38,7 @@ const chatRoute = createObservabilityAIAssistantServerRoute({ }), t.partial({ query: t.type({ stream: toBooleanRt }) }), ]), - handler: async (resources): Promise => { + handler: async (resources): Promise => { const { request, params, service } = resources; const client = await service.getClient({ request }); @@ -93,7 +93,7 @@ const chatCompleteRoute = createObservabilityAIAssistantServerRoute({ }), ]), }), - handler: async (resources): Promise => { + handler: async (resources): Promise => { const { request, params, service } = resources; const client = await service.getClient({ request }); diff --git a/x-pack/plugins/observability_ai_assistant/server/service/client/index.test.ts b/x-pack/plugins/observability_ai_assistant/server/service/client/index.test.ts index 7cffaa64d16d3..3e7660c427be7 100644 --- a/x-pack/plugins/observability_ai_assistant/server/service/client/index.test.ts +++ b/x-pack/plugins/observability_ai_assistant/server/service/client/index.test.ts @@ -7,9 +7,11 @@ import type { ActionsClient } from '@kbn/actions-plugin/server/actions_client'; import type { ElasticsearchClient, Logger } from '@kbn/core/server'; import type { DeeplyMockedKeys } from '@kbn/utility-types-jest'; -import { merge } from 'lodash'; +import { waitFor } from '@testing-library/react'; +import { last, merge, repeat } from 'lodash'; +import type OpenAI from 'openai'; import { Subject } from 'rxjs'; -import { PassThrough, type Readable } from 'stream'; +import { EventEmitter, PassThrough, type Readable } from 'stream'; import { finished } from 'stream/promises'; import { ObservabilityAIAssistantClient } from '.'; import { createResourceNamesMap } from '..'; @@ -49,6 +51,8 @@ function createLlmSimulator() { choices: [ { delta: msg, + index: 0, + finish_reason: null, }, ], }; @@ -70,7 +74,7 @@ function createLlmSimulator() { }; } -describe('Observability AI Assistant service', () => { +describe('Observability AI Assistant client', () => { let client: ObservabilityAIAssistantClient; const actionsClientMock: DeeplyMockedKeys = { @@ -84,14 +88,8 @@ describe('Observability AI Assistant service', () => { } as any; const currentUserEsClientMock: DeeplyMockedKeys = { - search: jest.fn().mockResolvedValue({ - hits: { - hits: [], - }, - }), - fieldCaps: jest.fn().mockResolvedValue({ - fields: [], - }), + search: jest.fn(), + fieldCaps: jest.fn(), } as any; const knowledgeBaseServiceMock: DeeplyMockedKeys = { @@ -107,16 +105,29 @@ describe('Observability AI Assistant service', () => { const functionClientMock: DeeplyMockedKeys = { executeFunction: jest.fn(), - getFunctions: jest.fn().mockReturnValue([]), - hasFunction: jest.fn().mockImplementation((name) => { - return name !== 'recall'; - }), + getFunctions: jest.fn(), + hasFunction: jest.fn(), } as any; let llmSimulator: LlmSimulator; function createClient() { - jest.clearAllMocks(); + jest.resetAllMocks(); + + functionClientMock.getFunctions.mockReturnValue([]); + functionClientMock.hasFunction.mockImplementation((name) => { + return name !== 'recall'; + }); + + currentUserEsClientMock.search.mockResolvedValue({ + hits: { + hits: [], + }, + } as any); + + currentUserEsClientMock.fieldCaps.mockResolvedValue({ + fields: [], + } as any); return new ObservabilityAIAssistantClient({ actionsClient: actionsClientMock, @@ -158,6 +169,10 @@ describe('Observability AI Assistant service', () => { ); } + beforeEach(() => { + jest.clearAllMocks(); + }); + describe('when completing a conversation without an initial conversation id', () => { let stream: Readable; @@ -961,6 +976,7 @@ describe('Observability AI Assistant service', () => { model: 'gpt-4', object: 'chat.completion.chunk', choices: [ + // @ts-expect-error { delta: { content: 'Hello', @@ -1011,6 +1027,7 @@ describe('Observability AI Assistant service', () => { model: 'gpt-4', object: 'chat.completion.chunk', choices: [ + // @ts-expect-error { delta: { content: 'Hello', @@ -1148,4 +1165,197 @@ describe('Observability AI Assistant service', () => { }); }); }); + + describe('when the LLM keeps on calling a function and the limit has been exceeded', () => { + let stream: Readable; + + let dataHandler: jest.Mock; + + beforeEach(async () => { + client = createClient(); + + const onLlmCall = new EventEmitter(); + + function waitForNextLlmCall() { + return new Promise((resolve) => onLlmCall.addListener('next', resolve)); + } + + actionsClientMock.execute.mockImplementation(async () => { + llmSimulator = createLlmSimulator(); + onLlmCall.emit('next'); + return { + actionId: '', + status: 'ok', + data: llmSimulator.stream, + }; + }); + + functionClientMock.getFunctions.mockImplementation(() => [ + { + definition: { + name: 'get_top_alerts', + contexts: ['core'], + description: '', + parameters: {}, + }, + respond: async () => { + return { content: 'Call this function again' }; + }, + }, + ]); + + functionClientMock.hasFunction.mockImplementation((name) => name === 'get_top_alerts'); + functionClientMock.executeFunction.mockImplementation(async () => ({ + content: 'Call this function again', + })); + + stream = await client.complete({ + connectorId: 'foo', + messages: [system('This is a system message'), user('How many alerts do I have?')], + functionClient: functionClientMock, + signal: new AbortController().signal, + title: 'My predefined title', + persist: true, + }); + + dataHandler = jest.fn(); + + stream.on('data', dataHandler); + + async function requestAlertsFunctionCall() { + const body = JSON.parse( + (actionsClientMock.execute.mock.lastCall![0].params as any).subActionParams.body + ); + + let nextLlmCallPromise: Promise; + + if (body.functions?.length) { + nextLlmCallPromise = waitForNextLlmCall(); + await llmSimulator.next({ function_call: { name: 'get_top_alerts' } }); + } else { + nextLlmCallPromise = Promise.resolve(); + await llmSimulator.next({ content: 'Looks like we are done here' }); + } + + await llmSimulator.complete(); + + await nextLlmCallPromise; + } + + await requestAlertsFunctionCall(); + + await requestAlertsFunctionCall(); + + await requestAlertsFunctionCall(); + + await requestAlertsFunctionCall(); + + await finished(stream); + }); + + it('executed the function no more than three times', () => { + expect(functionClientMock.executeFunction).toHaveBeenCalledTimes(3); + }); + + it('does not give the LLM the choice to call a function anymore', () => { + const firstBody = JSON.parse( + (actionsClientMock.execute.mock.calls[0][0].params as any).subActionParams.body + ); + const body = JSON.parse( + (actionsClientMock.execute.mock.lastCall![0].params as any).subActionParams.body + ); + + expect(firstBody.functions.length).toBe(1); + + expect(body.functions).toBeUndefined(); + }); + }); + + describe('when the function response exceeds the max no of tokens for one', () => { + let stream: Readable; + + let dataHandler: jest.Mock; + + beforeEach(async () => { + client = createClient(); + + let functionResponsePromiseResolve: Function | undefined; + + actionsClientMock.execute.mockImplementation(async () => { + llmSimulator = createLlmSimulator(); + return { + actionId: '', + status: 'ok', + data: llmSimulator.stream, + }; + }); + + functionClientMock.getFunctions.mockImplementation(() => [ + { + definition: { + name: 'get_top_alerts', + contexts: ['core'], + description: '', + parameters: {}, + }, + respond: async () => { + return { content: '' }; + }, + }, + ]); + + functionClientMock.hasFunction.mockImplementation((name) => name === 'get_top_alerts'); + + functionClientMock.executeFunction.mockImplementation(() => { + return new Promise((resolve) => { + functionResponsePromiseResolve = resolve; + }); + }); + + stream = await client.complete({ + connectorId: 'foo', + messages: [system('This is a system message'), user('How many alerts do I have?')], + functionClient: functionClientMock, + signal: new AbortController().signal, + title: 'My predefined title', + persist: true, + }); + + dataHandler = jest.fn(); + + stream.on('data', dataHandler); + + await llmSimulator.next({ function_call: { name: 'get_top_alerts' } }); + + await llmSimulator.complete(); + + await waitFor(() => functionResponsePromiseResolve !== undefined); + + functionResponsePromiseResolve!({ + content: repeat('word ', 10000), + }); + + await waitFor(() => actionsClientMock.execute.mock.calls.length > 1); + + await llmSimulator.next({ content: 'Looks like this was truncated' }); + + await llmSimulator.complete(); + + await finished(stream); + }); + it('truncates the message', () => { + const body = JSON.parse( + (actionsClientMock.execute.mock.lastCall![0].params as any).subActionParams.body + ) as OpenAI.Chat.ChatCompletionCreateParams; + + const parsed = JSON.parse(last(body.messages)!.content! as string); + + expect(parsed).toEqual({ + message: 'Function response exceeded the maximum length allowed and was truncated', + truncated: expect.any(String), + }); + + expect(parsed.truncated.includes('word ')).toBe(true); + }); + }); }); diff --git a/x-pack/plugins/observability_ai_assistant/server/service/client/index.ts b/x-pack/plugins/observability_ai_assistant/server/service/client/index.ts index fafb7606a2769..0e3927f82370d 100644 --- a/x-pack/plugins/observability_ai_assistant/server/service/client/index.ts +++ b/x-pack/plugins/observability_ai_assistant/server/service/client/index.ts @@ -10,12 +10,9 @@ import type { ActionsClient } from '@kbn/actions-plugin/server'; import type { ElasticsearchClient } from '@kbn/core/server'; import type { Logger } from '@kbn/logging'; import type { PublicMethodsOf } from '@kbn/utility-types'; -import { compact, isEmpty, last, merge, omit, pick } from 'lodash'; -import type { - ChatCompletionRequestMessage, - CreateChatCompletionRequest, - CreateChatCompletionResponse, -} from 'openai'; +import type OpenAI from 'openai'; +import { decode, encode } from 'gpt-tokenizer'; +import { compact, isEmpty, last, merge, omit, pick, take } from 'lodash'; import { isObservable, lastValueFrom } from 'rxjs'; import { PassThrough, Readable } from 'stream'; import { v4 } from 'uuid'; @@ -176,6 +173,11 @@ export class ObservabilityAIAssistantClient { }); } + let numFunctionsCalled: number = 0; + + const MAX_FUNCTION_CALLS = 3; + const MAX_FUNCTION_RESPONSE_TOKEN_COUNT = 4000; + const next = async (nextMessages: Message[]): Promise => { const lastMessage = last(nextMessages); @@ -222,9 +224,12 @@ export class ObservabilityAIAssistantClient { connectorId, stream: true, signal, - functions: functionClient - .getFunctions() - .map((fn) => pick(fn.definition, 'name', 'description', 'parameters')), + functions: + numFunctionsCalled >= MAX_FUNCTION_CALLS + ? [] + : functionClient + .getFunctions() + .map((fn) => pick(fn.definition, 'name', 'description', 'parameters')), }) ).pipe(processOpenAiStream()), }); @@ -232,22 +237,52 @@ export class ObservabilityAIAssistantClient { } if (isAssistantMessageWithFunctionRequest) { - const functionResponse = await functionClient - .executeFunction({ - connectorId, - name: lastMessage.message.function_call!.name, - messages: nextMessages, - args: lastMessage.message.function_call!.arguments, - signal, - }) - .catch((error): FunctionResponse => { - return { - content: { - message: error.toString(), - error, - }, - }; - }); + const functionResponse = + numFunctionsCalled >= MAX_FUNCTION_CALLS + ? { + content: { + error: {}, + message: 'Function limit exceeded, ask the user what to do next', + }, + } + : await functionClient + .executeFunction({ + connectorId, + name: lastMessage.message.function_call!.name, + messages: nextMessages, + args: lastMessage.message.function_call!.arguments, + signal, + }) + .then((response) => { + if (isObservable(response)) { + return response; + } + + const encoded = encode(JSON.stringify(response.content || {})); + + if (encoded.length <= MAX_FUNCTION_RESPONSE_TOKEN_COUNT) { + return response; + } + + return { + data: response.data, + content: { + message: + 'Function response exceeded the maximum length allowed and was truncated', + truncated: decode(take(encoded, MAX_FUNCTION_RESPONSE_TOKEN_COUNT)), + }, + }; + }) + .catch((error): FunctionResponse => { + return { + content: { + message: error.toString(), + error, + }, + }; + }); + + numFunctionsCalled++; if (signal.aborted) { return; @@ -380,8 +415,12 @@ export class ObservabilityAIAssistantClient { functionCall?: string; stream?: TStream; signal: AbortSignal; - }): Promise => { - const messagesForOpenAI: ChatCompletionRequestMessage[] = compact( + }): Promise => { + const messagesForOpenAI: Array< + Omit & { + role: MessageRole; + } + > = compact( messages .filter((message) => message.message.content || message.message.function_call?.name) .map((message) => { @@ -401,8 +440,8 @@ export class ObservabilityAIAssistantClient { const functionsForOpenAI = functions; - const request: Omit & { model?: string } = { - messages: messagesForOpenAI, + const request: Omit & { model?: string } = { + messages: messagesForOpenAI as OpenAI.ChatCompletionCreateParams['messages'], ...(stream ? { stream: true } : {}), ...(!!functions?.length ? { functions: functionsForOpenAI } : {}), temperature: 0, @@ -429,7 +468,7 @@ export class ObservabilityAIAssistantClient { const response = stream ? (executeResult.data as Readable) - : (executeResult.data as CreateChatCompletionResponse); + : (executeResult.data as OpenAI.ChatCompletion); if (response instanceof Readable) { signal.addEventListener('abort', () => response.destroy()); diff --git a/x-pack/plugins/remote_clusters/__jest__/client_integration/list/remote_clusters_list.test.js b/x-pack/plugins/remote_clusters/__jest__/client_integration/list/remote_clusters_list.test.js index eed0f041ca8d2..fa13749a65801 100644 --- a/x-pack/plugins/remote_clusters/__jest__/client_integration/list/remote_clusters_list.test.js +++ b/x-pack/plugins/remote_clusters/__jest__/client_integration/list/remote_clusters_list.test.js @@ -208,6 +208,7 @@ describe('', () => { hasDeprecatedProxySetting: true, seeds: null, connectedNodesCount: null, + securityModel: 'api_keys', }); const remoteClusters = [remoteCluster1, remoteCluster2, remoteCluster3]; @@ -246,6 +247,7 @@ describe('', () => { 'Connected', 'default', remoteCluster1.seeds.join(', '), + 'CertificateInfo', remoteCluster1.connectedNodesCount.toString(), '', // Empty because the last column is for the "actions" on the resource ], @@ -255,6 +257,7 @@ describe('', () => { 'Not connected', PROXY_MODE, remoteCluster2.proxyAddress, + 'CertificateInfo', remoteCluster2.connectedSocketsCount.toString(), '', ], @@ -264,6 +267,7 @@ describe('', () => { 'Not connected', PROXY_MODE, remoteCluster2.proxyAddress, + 'api_keysInfo', remoteCluster2.connectedSocketsCount.toString(), '', ], @@ -278,13 +282,18 @@ describe('', () => { }); test('should have a tooltip to indicate that the cluster has a deprecated setting', () => { - const secondRow = rows[2].reactWrapper; // The third cluster has been defined with deprecated setting + const thirdRow = rows[2].reactWrapper; // The third cluster has been defined with deprecated setting expect( - findTestSubject(secondRow, 'remoteClustersTableListClusterWithDeprecatedSettingTooltip') + findTestSubject(thirdRow, 'remoteClustersTableListClusterWithDeprecatedSettingTooltip') .length ).toBe(1); }); + test('should have a tooltip to indicate that the cluster is using an old security model', () => { + const secondRow = rows[1].reactWrapper; + expect(findTestSubject(secondRow, 'authenticationTypeWarning').length).toBe(1); + }); + describe('bulk delete button', () => { test('should be visible when a remote cluster is selected', () => { expect(exists('remoteClusterBulkDeleteButton')).toBe(false); @@ -442,6 +451,11 @@ describe('', () => { actions.clickRemoteClusterAt(1); // the remoteCluster2 has been configured by node expect(exists('remoteClusterConfiguredByNodeWarning')).toBe(true); }); + + test('Should display authentication type', () => { + actions.clickRemoteClusterAt(2); + expect(exists('remoteClusterDetailAuthType')).toBe(true); + }); }); }); }); diff --git a/x-pack/plugins/remote_clusters/common/constants.ts b/x-pack/plugins/remote_clusters/common/constants.ts index 09cd79104d140..1357de2cd4640 100644 --- a/x-pack/plugins/remote_clusters/common/constants.ts +++ b/x-pack/plugins/remote_clusters/common/constants.ts @@ -26,3 +26,19 @@ export const API_BASE_PATH = '/api/remote_clusters'; export const SNIFF_MODE = 'sniff'; export const PROXY_MODE = 'proxy'; + +export const getSecurityModel = (type: string) => { + if (type === 'certificate') { + return i18n.translate('xpack.remoteClusters.securityModelCert', { + defaultMessage: 'Certificate', + }); + } + + if (type === 'api_key') { + return i18n.translate('xpack.remoteClusters.securityModelApiKey', { + defaultMessage: 'API key', + }); + } + + return type; +}; diff --git a/x-pack/plugins/remote_clusters/fixtures/remote_cluster.js b/x-pack/plugins/remote_clusters/fixtures/remote_cluster.js index d750636b76234..89f14b53c980c 100644 --- a/x-pack/plugins/remote_clusters/fixtures/remote_cluster.js +++ b/x-pack/plugins/remote_clusters/fixtures/remote_cluster.js @@ -19,6 +19,7 @@ export const getRemoteClusterMock = ({ mode = SNIFF_MODE, proxyAddress, hasDeprecatedProxySetting = false, + securityModel = 'certificate', } = {}) => ({ name, seeds, @@ -32,4 +33,5 @@ export const getRemoteClusterMock = ({ connectedSocketsCount, proxyAddress, hasDeprecatedProxySetting, + securityModel, }); diff --git a/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/index.js b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/index.js index 7bbc9ede4c4df..3776e66a073ff 100644 --- a/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/index.js +++ b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/index.js @@ -7,3 +7,4 @@ export { ConnectionStatus } from './connection_status'; export { RemoveClusterButtonProvider } from './remove_cluster_button_provider'; +export { SecurityModel } from './security_model'; diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ml_model/common.ts b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/security_model/index.ts similarity index 83% rename from x-pack/plugins/fleet/server/services/epm/elasticsearch/ml_model/common.ts rename to x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/security_model/index.ts index e08d973f8df0e..831de5cf899c8 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ml_model/common.ts +++ b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/security_model/index.ts @@ -5,4 +5,4 @@ * 2.0. */ -export { getAsset } from '../../archive'; +export { SecurityModel } from './security_model'; diff --git a/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/security_model/security_model.tsx b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/security_model/security_model.tsx new file mode 100644 index 0000000000000..c368493dbfd6c --- /dev/null +++ b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/security_model/security_model.tsx @@ -0,0 +1,40 @@ +/* + * 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 { FormattedMessage } from '@kbn/i18n-react'; +import { EuiText, EuiFlexGroup, EuiFlexItem, EuiIconTip } from '@elastic/eui'; + +import { getSecurityModel } from '../../../../../../common/constants'; +import { Cluster } from '../../../../../../common/lib/cluster_serialization'; + +export function SecurityModel({ securityModel }: { securityModel: Cluster['securityModel'] }) { + return ( + + + + {getSecurityModel(securityModel)} + + + + {securityModel !== 'api_key' && ( + + + } + /> + + )} + + ); +} diff --git a/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/detail_panel/detail_panel.js b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/detail_panel/detail_panel.js index 83e59f0f28d66..0caf89a6dea38 100644 --- a/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/detail_panel/detail_panel.js +++ b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/detail_panel/detail_panel.js @@ -34,7 +34,7 @@ import { import { reactRouterNavigate } from '@kbn/kibana-react-plugin/public'; import { PROXY_MODE } from '../../../../../common/constants'; import { ConfiguredByNodeWarning } from '../../components'; -import { ConnectionStatus, RemoveClusterButtonProvider } from '../components'; +import { ConnectionStatus, RemoveClusterButtonProvider, SecurityModel } from '../components'; import { getRouter } from '../../../services'; import { proxyModeUrl } from '../../../services/documentation'; @@ -181,6 +181,7 @@ export class DetailPanel extends Component { maxConnectionsPerCluster, initialConnectTimeout, mode, + securityModel, }) { return ( @@ -198,6 +199,18 @@ export class DetailPanel extends Component { + + + + + + + + + @@ -297,6 +311,18 @@ export class DetailPanel extends Component { + + + + + + + + + { if (queryText) { @@ -249,6 +249,16 @@ export class RemoteClusterTable extends Component { return connectionMode; }, }, + { + field: 'securityModel', + name: i18n.translate('xpack.remoteClusters.remoteClusterList.table.authTypeColumnTitle', { + defaultMessage: 'Authentication type', + }), + sortable: true, + render: (securityModel) => { + return ; + }, + }, { field: 'mode', name: i18n.translate( diff --git a/x-pack/plugins/reporting/server/routes/common/jobs/get_job_routes.ts b/x-pack/plugins/reporting/server/routes/common/jobs/get_job_routes.ts index a88abae999be0..ca25b13990dc8 100644 --- a/x-pack/plugins/reporting/server/routes/common/jobs/get_job_routes.ts +++ b/x-pack/plugins/reporting/server/routes/common/jobs/get_job_routes.ts @@ -81,17 +81,43 @@ export const commonJobsRouteHandlerFactory = (reporting: ReportingCore) => { return jobManagementPreRouting(reporting, res, docId, user, counters, async (doc) => { const docIndex = doc.index; const stream = await getContentStream(reporting, { id: docId, index: docIndex }); - /** @note Overwriting existing content with an empty buffer to remove all the chunks. */ - await new Promise((resolve) => { - stream.end('', 'utf8', () => { - resolve(); - }); + const reportingSetup = reporting.getPluginSetupDeps(); + const logger = reportingSetup.logger.get('delete-report'); + + // An "error" event is emitted if an error is + // passed to the `stream.end` callback from + // the _final method of the ContentStream. + // This event must be handled. + stream.on('error', (err) => { + logger.error(err); }); - await jobsQuery.delete(docIndex, docId); - return res.ok({ - body: { deleted: true }, - }); + try { + // Overwriting existing content with an + // empty buffer to remove all the chunks. + await new Promise((resolve, reject) => { + stream.end('', 'utf8', (error?: Error) => { + if (error) { + // handle error that could be thrown + // from the _write method of the ContentStream + reject(error); + } else { + resolve(); + } + }); + }); + + await jobsQuery.delete(docIndex, docId); + + return res.ok({ + body: { deleted: true }, + }); + } catch (error) { + logger.error(error); + return res.customError({ + statusCode: 500, + }); + } }); }; diff --git a/x-pack/plugins/reporting/server/routes/internal/management/integration_tests/jobs.test.ts b/x-pack/plugins/reporting/server/routes/internal/management/integration_tests/jobs.test.ts index decc2300026e3..6fe086f33faa5 100644 --- a/x-pack/plugins/reporting/server/routes/internal/management/integration_tests/jobs.test.ts +++ b/x-pack/plugins/reporting/server/routes/internal/management/integration_tests/jobs.test.ts @@ -36,7 +36,7 @@ import { registerJobInfoRoutesInternal as registerJobInfoRoutes } from '../jobs' type SetupServerReturn = Awaited>; -describe(`GET ${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}`, () => { +describe(`Reporting Job Management Routes: Internal`, () => { const reportingSymbol = Symbol('reporting'); let server: SetupServerReturn['server']; let usageCounter: IUsageCounter; @@ -144,148 +144,148 @@ describe(`GET ${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}`, () => { await server.stop(); }); - it('fails on malformed download IDs', async () => { - mockEsClient.search.mockResponseOnce(getHits()); - registerJobInfoRoutes(core); + describe('download report', () => { + it('fails on malformed download IDs', async () => { + mockEsClient.search.mockResponseOnce(getHits()); + registerJobInfoRoutes(core); - await server.start(); + await server.start(); - await supertest(httpSetup.server.listener) - .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/1`) - .expect(400) - .then(({ body }) => - expect(body.message).toMatchInlineSnapshot( - '"[request params.docId]: value has length [1] but it must have a minimum length of [3]."' - ) - ); - }); + await supertest(httpSetup.server.listener) + .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/1`) + .expect(400) + .then(({ body }) => + expect(body.message).toMatchInlineSnapshot( + '"[request params.docId]: value has length [1] but it must have a minimum length of [3]."' + ) + ); + }); - it('fails on unauthenticated users', async () => { - mockStartDeps = await createMockPluginStart( - { - licensing: { - ...licensingMock.createStart(), - license$: new BehaviorSubject({ isActive: true, isAvailable: true, type: 'gold' }), + it('fails on unauthenticated users', async () => { + mockStartDeps = await createMockPluginStart( + { + licensing: { + ...licensingMock.createStart(), + license$: new BehaviorSubject({ isActive: true, isAvailable: true, type: 'gold' }), + }, + security: { authc: { getCurrentUser: () => undefined } }, }, - security: { authc: { getCurrentUser: () => undefined } }, - }, - mockConfigSchema - ); - core = await createMockReportingCore(mockConfigSchema, mockSetupDeps, mockStartDeps); - registerJobInfoRoutes(core); + mockConfigSchema + ); + core = await createMockReportingCore(mockConfigSchema, mockSetupDeps, mockStartDeps); + registerJobInfoRoutes(core); - await server.start(); + await server.start(); - await supertest(httpSetup.server.listener) - .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dope`) - .expect(401) - .then(({ body }) => - expect(body.message).toMatchInlineSnapshot(`"Sorry, you aren't authenticated"`) - ); - }); + await supertest(httpSetup.server.listener) + .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dope`) + .expect(401) + .then(({ body }) => + expect(body.message).toMatchInlineSnapshot(`"Sorry, you aren't authenticated"`) + ); + }); - it('returns 404 if job not found', async () => { - mockEsClient.search.mockResponseOnce(getHits()); - registerJobInfoRoutes(core); + it('returns 404 if job not found', async () => { + mockEsClient.search.mockResponseOnce(getHits()); + registerJobInfoRoutes(core); - await server.start(); + await server.start(); - await supertest(httpSetup.server.listener) - .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/poo`) - .expect(404); - }); + await supertest(httpSetup.server.listener) + .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/poo`) + .expect(404); + }); - it('returns a 403 if not a valid job type', async () => { - mockEsClient.search.mockResponseOnce( - getHits({ - jobtype: 'invalidJobType', - payload: { title: 'invalid!' }, - }) - ); - registerJobInfoRoutes(core); + it('returns a 403 if not a valid job type', async () => { + mockEsClient.search.mockResponseOnce( + getHits({ + jobtype: 'invalidJobType', + payload: { title: 'invalid!' }, + }) + ); + registerJobInfoRoutes(core); - await server.start(); + await server.start(); - await supertest(httpSetup.server.listener) - .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/poo`) - .expect(403); - }); + await supertest(httpSetup.server.listener) + .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/poo`) + .expect(403); + }); - it(`returns job's info`, async () => { - mockEsClient.search.mockResponseOnce( - getHits({ - jobtype: mockJobTypeBase64Encoded, - payload: {}, // payload is irrelevant - }) - ); + it(`returns job's info`, async () => { + mockEsClient.search.mockResponseOnce( + getHits({ + jobtype: mockJobTypeBase64Encoded, + payload: {}, // payload is irrelevant + }) + ); - registerJobInfoRoutes(core); + registerJobInfoRoutes(core); - await server.start(); + await server.start(); - await supertest(httpSetup.server.listener) - .get(`${INTERNAL_ROUTES.JOBS.INFO_PREFIX}/test`) - .expect(200); - }); + await supertest(httpSetup.server.listener) + .get(`${INTERNAL_ROUTES.JOBS.INFO_PREFIX}/test`) + .expect(200); + }); - it(`returns 403 if a user cannot view a job's info`, async () => { - mockEsClient.search.mockResponseOnce( - getHits({ - jobtype: 'customForbiddenJobType', - payload: {}, // payload is irrelevant - }) - ); + it(`returns 403 if a user cannot view a job's info`, async () => { + mockEsClient.search.mockResponseOnce( + getHits({ + jobtype: 'customForbiddenJobType', + payload: {}, // payload is irrelevant + }) + ); - registerJobInfoRoutes(core); + registerJobInfoRoutes(core); - await server.start(); + await server.start(); - await supertest(httpSetup.server.listener) - .get(`${INTERNAL_ROUTES.JOBS.INFO_PREFIX}/test`) - .expect(403); - }); + await supertest(httpSetup.server.listener) + .get(`${INTERNAL_ROUTES.JOBS.INFO_PREFIX}/test`) + .expect(403); + }); - it('when a job is incomplete', async () => { - mockEsClient.search.mockResponseOnce( - getHits({ - jobtype: mockJobTypeUnencoded, - status: 'pending', - payload: { title: 'incomplete!' }, - }) - ); - registerJobInfoRoutes(core); - - await server.start(); - await supertest(httpSetup.server.listener) - .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`) - .expect(503) - .expect('Content-Type', 'text/plain; charset=utf-8') - .expect('Retry-After', '30') - .then(({ text }) => expect(text).toEqual('pending')); - }); + it('when a job is incomplete', async () => { + mockEsClient.search.mockResponseOnce( + getHits({ + jobtype: mockJobTypeUnencoded, + status: 'pending', + payload: { title: 'incomplete!' }, + }) + ); + registerJobInfoRoutes(core); - it('when a job fails', async () => { - mockEsClient.search.mockResponse( - getHits({ - jobtype: mockJobTypeUnencoded, - status: 'failed', - output: { content: 'job failure message' }, - payload: { title: 'failing job!' }, - }) - ); - registerJobInfoRoutes(core); - - await server.start(); - await supertest(httpSetup.server.listener) - .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`) - .expect(500) - .expect('Content-Type', 'application/json; charset=utf-8') - .then(({ body }) => - expect(body.message).toEqual('Reporting generation failed: job failure message') + await server.start(); + await supertest(httpSetup.server.listener) + .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`) + .expect(503) + .expect('Content-Type', 'text/plain; charset=utf-8') + .expect('Retry-After', '30') + .then(({ text }) => expect(text).toEqual('pending')); + }); + + it('when a job fails', async () => { + mockEsClient.search.mockResponse( + getHits({ + jobtype: mockJobTypeUnencoded, + status: 'failed', + output: { content: 'job failure message' }, + payload: { title: 'failing job!' }, + }) ); - }); + registerJobInfoRoutes(core); + + await server.start(); + await supertest(httpSetup.server.listener) + .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`) + .expect(500) + .expect('Content-Type', 'application/json; charset=utf-8') + .then(({ body }) => + expect(body.message).toEqual('Reporting generation failed: job failure message') + ); + }); - describe('successful downloads', () => { it('when a known job-type is complete', async () => { mockEsClient.search.mockResponseOnce(getCompleteHits()); registerJobInfoRoutes(core); @@ -483,4 +483,28 @@ describe(`GET ${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}`, () => { }); }); }); + + describe('delete report', () => { + it('handles content stream errors', async () => { + stream = new Readable({ + read() { + this.push('test'); + this.push(null); + }, + }) as typeof stream; + stream.end = jest.fn().mockImplementation((_name, _encoding, callback) => { + callback(new Error('An error occurred in ending the content stream')); + }); + + (getContentStream as jest.MockedFunction).mockResolvedValue(stream); + mockEsClient.search.mockResponseOnce(getCompleteHits()); + registerJobInfoRoutes(core); + + await server.start(); + await supertest(httpSetup.server.listener) + .delete(`${INTERNAL_ROUTES.JOBS.DELETE_PREFIX}/dank`) + .expect(500) + .expect('Content-Type', 'application/json; charset=utf-8'); + }); + }); }); diff --git a/x-pack/plugins/reporting/server/routes/public/integration_tests/jobs.test.ts b/x-pack/plugins/reporting/server/routes/public/integration_tests/jobs.test.ts index b301b1546dabf..1d2ef78cf60e3 100644 --- a/x-pack/plugins/reporting/server/routes/public/integration_tests/jobs.test.ts +++ b/x-pack/plugins/reporting/server/routes/public/integration_tests/jobs.test.ts @@ -36,7 +36,7 @@ import { registerJobInfoRoutesPublic } from '../jobs'; type SetupServerReturn = Awaited>; -describe(`GET ${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}`, () => { +describe(`Reporting Job Management Routes: Public`, () => { const reportingSymbol = Symbol('reporting'); let server: SetupServerReturn['server']; let usageCounter: IUsageCounter; @@ -135,114 +135,114 @@ describe(`GET ${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}`, () => { await server.stop(); }); - it('fails on malformed download IDs', async () => { - mockEsClient.search.mockResponseOnce(getHits()); - registerJobInfoRoutesPublic(core); + describe('download report', () => { + it('fails on malformed download IDs', async () => { + mockEsClient.search.mockResponseOnce(getHits()); + registerJobInfoRoutesPublic(core); - await server.start(); + await server.start(); - await supertest(httpSetup.server.listener) - .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/1`) - .expect(400) - .then(({ body }) => - expect(body.message).toMatchInlineSnapshot( - '"[request params.docId]: value has length [1] but it must have a minimum length of [3]."' - ) - ); - }); + await supertest(httpSetup.server.listener) + .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/1`) + .expect(400) + .then(({ body }) => + expect(body.message).toMatchInlineSnapshot( + '"[request params.docId]: value has length [1] but it must have a minimum length of [3]."' + ) + ); + }); - it('fails on unauthenticated users', async () => { - mockStartDeps = await createMockPluginStart( - { - licensing: { - ...licensingMock.createStart(), - license$: new BehaviorSubject({ isActive: true, isAvailable: true, type: 'gold' }), + it('fails on unauthenticated users', async () => { + mockStartDeps = await createMockPluginStart( + { + licensing: { + ...licensingMock.createStart(), + license$: new BehaviorSubject({ isActive: true, isAvailable: true, type: 'gold' }), + }, + security: { authc: { getCurrentUser: () => undefined } }, }, - security: { authc: { getCurrentUser: () => undefined } }, - }, - mockConfigSchema - ); - core = await createMockReportingCore(mockConfigSchema, mockSetupDeps, mockStartDeps); - registerJobInfoRoutesPublic(core); + mockConfigSchema + ); + core = await createMockReportingCore(mockConfigSchema, mockSetupDeps, mockStartDeps); + registerJobInfoRoutesPublic(core); - await server.start(); + await server.start(); - await supertest(httpSetup.server.listener) - .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/dope`) - .expect(401) - .then(({ body }) => - expect(body.message).toMatchInlineSnapshot(`"Sorry, you aren't authenticated"`) - ); - }); + await supertest(httpSetup.server.listener) + .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/dope`) + .expect(401) + .then(({ body }) => + expect(body.message).toMatchInlineSnapshot(`"Sorry, you aren't authenticated"`) + ); + }); + + it('returns 404 if job not found', async () => { + mockEsClient.search.mockResponseOnce(getHits()); + registerJobInfoRoutesPublic(core); - it('returns 404 if job not found', async () => { - mockEsClient.search.mockResponseOnce(getHits()); - registerJobInfoRoutesPublic(core); + await server.start(); - await server.start(); + await supertest(httpSetup.server.listener) + .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/poo`) + .expect(404); + }); - await supertest(httpSetup.server.listener) - .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/poo`) - .expect(404); - }); + it('returns a 403 if not a valid job type', async () => { + mockEsClient.search.mockResponseOnce( + getHits({ + jobtype: 'invalidJobType', + payload: { title: 'invalid!' }, + }) + ); + registerJobInfoRoutesPublic(core); - it('returns a 403 if not a valid job type', async () => { - mockEsClient.search.mockResponseOnce( - getHits({ - jobtype: 'invalidJobType', - payload: { title: 'invalid!' }, - }) - ); - registerJobInfoRoutesPublic(core); + await server.start(); - await server.start(); + await supertest(httpSetup.server.listener) + .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/poo`) + .expect(403); + }); - await supertest(httpSetup.server.listener) - .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/poo`) - .expect(403); - }); + it('when a job is incomplete', async () => { + mockEsClient.search.mockResponseOnce( + getHits({ + jobtype: 'unencodedJobType', + status: 'pending', + payload: { title: 'incomplete!' }, + }) + ); + registerJobInfoRoutesPublic(core); - it('when a job is incomplete', async () => { - mockEsClient.search.mockResponseOnce( - getHits({ - jobtype: 'unencodedJobType', - status: 'pending', - payload: { title: 'incomplete!' }, - }) - ); - registerJobInfoRoutesPublic(core); - - await server.start(); - await supertest(httpSetup.server.listener) - .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`) - .expect(503) - .expect('Content-Type', 'text/plain; charset=utf-8') - .expect('Retry-After', '30') - .then(({ text }) => expect(text).toEqual('pending')); - }); + await server.start(); + await supertest(httpSetup.server.listener) + .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`) + .expect(503) + .expect('Content-Type', 'text/plain; charset=utf-8') + .expect('Retry-After', '30') + .then(({ text }) => expect(text).toEqual('pending')); + }); - it('when a job fails', async () => { - mockEsClient.search.mockResponse( - getHits({ - jobtype: 'unencodedJobType', - status: 'failed', - output: { content: 'job failure message' }, - payload: { title: 'failing job!' }, - }) - ); - registerJobInfoRoutesPublic(core); - - await server.start(); - await supertest(httpSetup.server.listener) - .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`) - .expect(500) - .expect('Content-Type', 'application/json; charset=utf-8') - .then(({ body }) => - expect(body.message).toEqual('Reporting generation failed: job failure message') + it('when a job fails', async () => { + mockEsClient.search.mockResponse( + getHits({ + jobtype: 'unencodedJobType', + status: 'failed', + output: { content: 'job failure message' }, + payload: { title: 'failing job!' }, + }) ); - }); + registerJobInfoRoutesPublic(core); + + await server.start(); + await supertest(httpSetup.server.listener) + .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`) + .expect(500) + .expect('Content-Type', 'application/json; charset=utf-8') + .then(({ body }) => + expect(body.message).toEqual('Reporting generation failed: job failure message') + ); + }); - describe('successful downloads', () => { it('when a known job-type is complete', async () => { mockEsClient.search.mockResponseOnce(getCompleteHits()); registerJobInfoRoutesPublic(core); @@ -292,4 +292,28 @@ describe(`GET ${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}`, () => { }); }); }); + + describe('delete report', () => { + it('handles content stream errors', async () => { + stream = new Readable({ + read() { + this.push('test'); + this.push(null); + }, + }) as typeof stream; + stream.end = jest.fn().mockImplementation((_name, _encoding, callback) => { + callback(new Error('An error occurred in ending the content stream')); + }); + + (getContentStream as jest.MockedFunction).mockResolvedValue(stream); + mockEsClient.search.mockResponseOnce(getCompleteHits()); + registerJobInfoRoutesPublic(core); + + await server.start(); + await supertest(httpSetup.server.listener) + .delete('/api/reporting/jobs/delete/denk') + .expect(500) + .expect('Content-Type', 'application/json; charset=utf-8'); + }); + }); }); diff --git a/x-pack/plugins/screenshotting/server/browsers/download/fetch.test.ts b/x-pack/plugins/screenshotting/server/browsers/download/fetch.test.ts index 1fc87b7e8b3ea..5e1b5fc771d6d 100644 --- a/x-pack/plugins/screenshotting/server/browsers/download/fetch.test.ts +++ b/x-pack/plugins/screenshotting/server/browsers/download/fetch.test.ts @@ -8,7 +8,7 @@ import mockFs from 'mock-fs'; import axios from 'axios'; import { createHash } from 'crypto'; -import { readFileSync } from 'fs'; +import { readFile } from 'fs/promises'; import { resolve as resolvePath } from 'path'; import { Readable } from 'stream'; import { fetch } from './fetch'; @@ -38,7 +38,7 @@ describe('fetch', () => { test('downloads the url to the path', async () => { await fetch('url', TEMP_FILE); - expect(readFileSync(TEMP_FILE, 'utf8')).toEqual('foobar'); + await expect(readFile(TEMP_FILE, 'utf8')).resolves.toBe('foobar'); }); test('returns the sha1 hex hash of the http body', async () => { diff --git a/x-pack/plugins/screenshotting/server/browsers/download/fetch.ts b/x-pack/plugins/screenshotting/server/browsers/download/fetch.ts index 871eee46c2180..6b05337147c0a 100644 --- a/x-pack/plugins/screenshotting/server/browsers/download/fetch.ts +++ b/x-pack/plugins/screenshotting/server/browsers/download/fetch.ts @@ -7,7 +7,8 @@ import Axios from 'axios'; import { createHash } from 'crypto'; -import { closeSync, mkdirSync, openSync, writeSync } from 'fs'; +import { mkdir, open } from 'fs/promises'; +import { writeSync } from 'fs'; import { dirname } from 'path'; import { Readable } from 'stream'; import { finished } from 'stream/promises'; @@ -21,9 +22,8 @@ export async function fetch(url: string, path: string, logger?: Logger): Promise const hash = createHash('sha256'); - mkdirSync(dirname(path), { recursive: true }); - const handle = openSync(path, 'w'); - + await mkdir(dirname(path), { recursive: true }); + const handle = await open(path, 'w'); try { const response = await Axios.request({ url, @@ -32,7 +32,7 @@ export async function fetch(url: string, path: string, logger?: Logger): Promise }); response.data.on('data', (chunk: Buffer) => { - writeSync(handle, chunk); + writeSync(handle.fd, chunk); hash.update(chunk); }); @@ -43,7 +43,7 @@ export async function fetch(url: string, path: string, logger?: Logger): Promise throw new Error(`Unable to download ${url}: ${error}`); } finally { - closeSync(handle); + await handle.close(); } return hash.digest('hex'); diff --git a/x-pack/plugins/screenshotting/server/browsers/download/index.test.ts b/x-pack/plugins/screenshotting/server/browsers/download/index.test.ts index 303462fc533db..96d9bd0299327 100644 --- a/x-pack/plugins/screenshotting/server/browsers/download/index.test.ts +++ b/x-pack/plugins/screenshotting/server/browsers/download/index.test.ts @@ -7,7 +7,7 @@ import path from 'path'; import mockFs from 'mock-fs'; -import { existsSync, readdirSync } from 'fs'; +import { access, readdir } from 'fs/promises'; import { ChromiumArchivePaths, PackageInfo } from '../chromium'; import { fetch } from './fetch'; import { sha256 } from './checksum'; @@ -55,8 +55,8 @@ describe('ensureDownloaded', () => { await download(paths, pkg); - expect(existsSync(unexpectedPath1)).toBe(false); - expect(existsSync(unexpectedPath2)).toBe(false); + await expect(access(unexpectedPath1)).rejects.toThrow(); + await expect(access(unexpectedPath2)).rejects.toThrow(); }); it('should reject when download fails', async () => { @@ -84,14 +84,14 @@ describe('ensureDownloaded', () => { await download(paths, pkg); expect(fetch).not.toHaveBeenCalled(); - expect(readdirSync(path.resolve(`${paths.archivesPath}/x64`))).toEqual( + await expect(readdir(path.resolve(`${paths.archivesPath}/x64`))).resolves.toEqual( expect.arrayContaining([ 'chrome-mac.zip', 'chrome-win.zip', expect.stringMatching(/^chromium-[0-9a-f]{7}-locales-linux_x64\.zip$/), ]) ); - expect(readdirSync(path.resolve(`${paths.archivesPath}/arm64`))).toEqual( + await expect(readdir(path.resolve(`${paths.archivesPath}/arm64`))).resolves.toEqual( expect.arrayContaining([ 'chrome-mac.zip', expect.stringMatching(/^chromium-[0-9a-f]{7}-locales-linux_arm64\.zip$/), diff --git a/x-pack/plugins/screenshotting/server/browsers/download/index.ts b/x-pack/plugins/screenshotting/server/browsers/download/index.ts index fe6e8c632ebdb..bef22c7c2196a 100644 --- a/x-pack/plugins/screenshotting/server/browsers/download/index.ts +++ b/x-pack/plugins/screenshotting/server/browsers/download/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { existsSync } from 'fs'; +import { access } from 'fs/promises'; import del from 'del'; import type { Logger } from '@kbn/core/server'; import type { ChromiumArchivePaths, PackageInfo } from '../chromium'; @@ -42,7 +42,13 @@ export async function download( const resolvedPath = paths.resolvePath(pkg); const foundChecksum = await sha256(resolvedPath).catch(() => 'MISSING'); - const pathExists = existsSync(resolvedPath); + let pathExists = null; + try { + await access(resolvedPath); + pathExists = true; + } catch (e) { + pathExists = false; + } if (pathExists && foundChecksum === archiveChecksum) { logger?.debug( `Browser archive for ${pkg.platform}/${pkg.architecture} already found in ${resolvedPath} with matching checksum.` diff --git a/x-pack/plugins/screenshotting/server/browsers/extract/unzip.test.ts b/x-pack/plugins/screenshotting/server/browsers/extract/unzip.test.ts index 4af457a0c3a6e..08eac21450f26 100644 --- a/x-pack/plugins/screenshotting/server/browsers/extract/unzip.test.ts +++ b/x-pack/plugins/screenshotting/server/browsers/extract/unzip.test.ts @@ -6,7 +6,7 @@ */ import mockFs from 'mock-fs'; -import { readFileSync } from 'fs'; +import { readFile } from 'fs/promises'; import { ExtractError } from './extract_error'; import { unzip } from './unzip'; @@ -28,7 +28,7 @@ describe('unzip', () => { it('should extract zipped contents', async () => { await unzip('/test.zip', '/output'); - expect(readFileSync('/output/test.txt').toString()).toEqual('test'); + await expect(readFile('/output/test.txt', 'utf8')).resolves.toBe('test'); }); it('should reject on invalid archive', async () => { diff --git a/x-pack/plugins/searchprofiler/public/application/lib/check_for_json_errors.test.ts b/x-pack/plugins/searchprofiler/public/application/lib/check_for_json_errors.test.ts index ccd8761c031b2..606b302fc8559 100644 --- a/x-pack/plugins/searchprofiler/public/application/lib/check_for_json_errors.test.ts +++ b/x-pack/plugins/searchprofiler/public/application/lib/check_for_json_errors.test.ts @@ -12,7 +12,7 @@ describe('checkForParseErrors', function () { it('returns error from bad JSON', function () { const json = '{"foo": {"bar": {"baz": "buzz}}}'; const result = checkForParseErrors(json); - expect(result.error.message).to.be(`Unexpected end of JSON input`); + expect(result.error.message).to.be(`Unterminated string in JSON at position 32`); }); it('returns parsed value from good JSON', function () { diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index 805192aed8a9f..2b34532e4e848 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -158,6 +158,11 @@ export const allowedExperimentalValues = Object.freeze({ * version and the latest available version. */ jsonPrebuiltRulesDiffingEnabled: true, + /* + * Disables discover esql tab within timeline + * + */ + timelineEsqlTabDisabled: false, }); type ExperimentalConfigKeys = Array; diff --git a/x-pack/plugins/security_solution/public/assistant/send_to_timeline/index.tsx b/x-pack/plugins/security_solution/public/assistant/send_to_timeline/index.tsx index fe2c23b8f60b1..94ff2b7b39e85 100644 --- a/x-pack/plugins/security_solution/public/assistant/send_to_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/assistant/send_to_timeline/index.tsx @@ -36,6 +36,7 @@ import { } from '../../timelines/store/actions'; import { useDiscoverInTimelineContext } from '../../common/components/discover_in_timeline/use_discover_in_timeline_context'; import { useShowTimeline } from '../../common/utils/timeline/use_show_timeline'; +import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features'; export interface SendToTimelineButtonProps { asEmptyButton: boolean; @@ -60,6 +61,8 @@ export const SendToTimelineButton: React.FunctionComponent sourcererSelectors.getSourcererDataViewsSelector(), [] @@ -226,6 +229,13 @@ export const SendToTimelineButton: React.FunctionComponent { const dispatch = useDispatch(); + const isEsqlTabDisabled = useIsExperimentalFeatureEnabled('timelineEsqlTabDisabled'); + const onInitialize = useCallback( (initialState: TimelineUrl | null) => { if (initialState != null) { queryTimelineById({ - activeTimelineTab: initialState.activeTab, + activeTimelineTab: + initialState.activeTab === TimelineTabs.esql && isEsqlTabDisabled + ? TimelineTabs.query + : initialState.activeTab, duplicate: false, graphEventId: initialState.graphEventId, timelineId: initialState.id, @@ -38,7 +45,7 @@ export const useInitTimelineFromUrlParam = () => { }); } }, - [dispatch] + [dispatch, isEsqlTabDisabled] ); useEffect(() => { diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx index 2b195eb11fe3c..2d4d493c5f8ca 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx @@ -24,6 +24,7 @@ import styled from 'styled-components'; import { ALERT_WORKFLOW_ASSIGNEE_IDS } from '@kbn/rule-data-utils'; import { TableId } from '@kbn/securitysolution-data-table'; +import { URL_PARAM_KEY } from '../../../../common/hooks/use_url_state'; import type { GetFieldsData } from '../../../../common/hooks/use_get_fields_data'; import { Assignees } from '../../../../flyout/document_details/right/components/assignees'; import { useAssistantAvailability } from '../../../../assistant/use_assistant_availability'; @@ -107,6 +108,9 @@ export const ExpandableEventTitle = React.memo( _index: eventIndex, timestamp, }); + const urlModifier = (value: string) => { + return `${value}&${URL_PARAM_KEY.eventFlyout}=(preview:!(),rightPanel:(id:document-details-right,params:(id:${eventId},indexName:${eventIndex},scopeId:${scopeId})))`; + }; const { refetch } = useRefetchByScope({ scopeId }); const alertAssignees = useMemo( @@ -160,7 +164,7 @@ export const ExpandableEventTitle = React.memo( )} {isAlert && alertDetailsLink && ( - + {(copy) => ( = ({ sessionViewConfig, timelineDescription, }) => { + const isEsqlTabInTimelineDisabled = useIsExperimentalFeatureEnabled('timelineEsqlTabDisabled'); const isEsqlSettingEnabled = useKibana().services.configSettings.ESQLEnabled; const { hasAssistantPrivilege } = useAssistantAvailability(); const dispatch = useDispatch(); @@ -404,7 +406,7 @@ const TabsContentComponent: React.FC = ({ {i18n.QUERY_TAB} {showTimeline && } - {isEsqlSettingEnabled && ( + {!isEsqlTabInTimelineDisabled && isEsqlSettingEnabled && ( => { const ruleName = 'Promote SentinelOne alerts'; - const sentinelOneAlertsIndexPattern = 'logs-sentinel_one.alert'; + const sentinelOneAlertsIndexPattern = 'logs-sentinel_one.alert*'; const ruleQueryValue = 'observer.serial_number:*'; const { data } = await findRules(kbnClient, { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/import_rules/route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/import_rules/route.test.ts index f383a9d11cc00..da4f9e67d7b8f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/import_rules/route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/import_rules/route.test.ts @@ -167,7 +167,7 @@ describe('Import rules route', () => { errors: [ { error: { - message: 'Unexpected token h in JSON at position 1', + message: `Unexpected token 'h', "this is not"... is not valid JSON`, status_code: 400, }, rule_id: '(unknown id)', diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/import/create_rules_stream_from_ndjson.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/import/create_rules_stream_from_ndjson.test.ts index b6cffd47a494e..5e37f161c3dde 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/import/create_rules_stream_from_ndjson.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/import/create_rules_stream_from_ndjson.test.ts @@ -234,7 +234,9 @@ describe('create_rules_stream_from_ndjson', () => { type: 'query', immutable: false, }); - expect(resultOrError[1].message).toEqual('Unexpected token , in JSON at position 1'); + expect(resultOrError[1].message).toEqual( + `Expected property name or '}' in JSON at position 1` + ); expect(resultOrError[2]).toEqual({ rule_id: 'rule-2', output_index: '.siem-signals', diff --git a/x-pack/plugins/serverless_search/common/doc_links.ts b/x-pack/plugins/serverless_search/common/doc_links.ts index 7168f089c41e1..b222165f22359 100644 --- a/x-pack/plugins/serverless_search/common/doc_links.ts +++ b/x-pack/plugins/serverless_search/common/doc_links.ts @@ -10,7 +10,6 @@ import { DocLinks } from '@kbn/doc-links'; class ESDocLinks { public apiIntro: string = ''; public beats: string = ''; - public connectors: string = ''; public integrations: string = ''; public kibanaFeedback: string = ''; public kibanaRunApiInConsole: string = ''; @@ -20,6 +19,10 @@ class ESDocLinks { public securityApis: string = ''; public ingestionPipelines: string = ''; public dataStreams: string = ''; + // Connectors links + public connectors: string = ''; + public connectorsRunFromSource: string = ''; + public connectorsRunWithDocker: string = ''; // Client links public elasticsearchClients: string = ''; // go @@ -55,7 +58,6 @@ class ESDocLinks { this.integrations = newDocLinks.serverlessSearch.integrations; this.logstash = newDocLinks.serverlessSearch.integrationsLogstash; this.beats = newDocLinks.serverlessSearch.integrationsBeats; - this.connectors = newDocLinks.serverlessSearch.integrationsConnectorClient; this.kibanaFeedback = newDocLinks.kibana.feedback; this.kibanaRunApiInConsole = newDocLinks.console.serverlessGuide; this.metadata = newDocLinks.security.mappingRoles; @@ -64,6 +66,12 @@ class ESDocLinks { this.ingestionPipelines = newDocLinks.ingest.pipelines; this.dataStreams = newDocLinks.elasticsearch.dataStreams; + // Connectors links + this.connectors = newDocLinks.serverlessSearch.integrationsConnectorClient; + this.connectorsRunFromSource = + newDocLinks.serverlessSearch.integrationsConnectorClientRunFromSource; + this.connectorsRunWithDocker = + newDocLinks.serverlessSearch.integrationsConnectorClientRunWithDocker; // Client links this.elasticsearchClients = newDocLinks.serverlessClients.clientLib; // Go diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_link.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_link.tsx index 45f43a2b72b35..f6c039e2359aa 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_link.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_link.tsx @@ -67,7 +67,8 @@ export const ConnectorLinkElasticsearch: React.FC {i18n.translate('xpack.serverlessSearch.connectors.runWithDockerLink', { @@ -81,7 +82,8 @@ export const ConnectorLinkElasticsearch: React.FC {i18n.translate('xpack.serverlessSearch.connectors.runFromSourceLink', { diff --git a/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.ts b/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.ts index d41b5590341ff..d9f040a446b65 100644 --- a/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.ts +++ b/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.ts @@ -42,6 +42,8 @@ interface TaskRunCounts extends JsonObject { [TaskRunKeys.SUCCESS]: number; [TaskRunKeys.NOT_TIMED_OUT]: number; [TaskRunKeys.TOTAL]: number; + [TaskRunKeys.USER_ERRORS]: number; + [TaskRunKeys.FRAMEWORK_ERRORS]: number; } export interface TaskRunMetrics extends JsonObject { diff --git a/x-pack/plugins/task_manager/server/saved_objects/migrations.test.ts b/x-pack/plugins/task_manager/server/saved_objects/migrations.test.ts index 081918673d82a..794a9c466906f 100644 --- a/x-pack/plugins/task_manager/server/saved_objects/migrations.test.ts +++ b/x-pack/plugins/task_manager/server/saved_objects/migrations.test.ts @@ -282,7 +282,7 @@ describe('handles errors during migrations', () => { migration800(taskInstance, migrationContext); }).toThrowError(); expect(migrationContext.log.error).toHaveBeenCalledWith( - `savedObject 8.0.0 migration failed for task instance ${taskInstance.id} with error: Unexpected token s in JSON at position 2`, + `savedObject 8.0.0 migration failed for task instance ${taskInstance.id} with error: Expected property name or '}' in JSON at position 2`, { migrations: { taskInstanceDocument: { diff --git a/x-pack/plugins/transform/public/app/common/constants/validation_messages.ts b/x-pack/plugins/transform/public/app/common/constants/validation_messages.ts deleted file mode 100644 index 6d06d3215a895..0000000000000 --- a/x-pack/plugins/transform/public/app/common/constants/validation_messages.ts +++ /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. - */ - -import { i18n } from '@kbn/i18n'; - -export const numberRangeMinus1To100NotValidErrorMessage = i18n.translate( - 'xpack.transform.transformSettingValidations.numberGreaterThanOrEqualToNegativeOneNotValidErrorMessage', - { - defaultMessage: 'Number of retries needs to be between 0 and 100, or -1 for infinite retries.', - } -); - -export const numberRange10To10000NotValidErrorMessage = i18n.translate( - 'xpack.transform.transformSettingValidations.numberRange10To10000NotValidErrorMessage', - { - defaultMessage: 'Value needs to be an integer between 10 and 10000.', - } -); - -export const pageSearchSizeInvalidErrorMessage = i18n.translate( - 'xpack.transform.transformSettingValidations.maxPageSearchSizeInvalidMessage', - { - defaultMessage: 'Maximum page search size needs to be an integer between 10 and 65536.', - } -); - -// Retention policy max age validator -export const retentionPolicyMaxAgeInvalidErrorMessage = i18n.translate( - 'xpack.transform.transformSettingValidations.retentionPolicyMaxAgeInvalidMessage', - { - defaultMessage: 'Invalid max age format. Minimum of 60s required.', - } -); - -// xpack.transform.transformList.numberOfRetriesInvalidErrorMessage -export const numberOfRetriesInvalidErrorMessage = i18n.translate( - 'xpack.transform.transformSettingsValidations.numberOfRetriesInvalidErrorMessage', - { - defaultMessage: 'Number of retries needs to be between 0 and 100, or -1 for infinite retries.', - } -); diff --git a/x-pack/plugins/transform/public/app/common/validators.test.ts b/x-pack/plugins/transform/public/app/common/validators.test.ts deleted file mode 100644 index 324ce7f8255e1..0000000000000 --- a/x-pack/plugins/transform/public/app/common/validators.test.ts +++ /dev/null @@ -1,165 +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 { - continuousModeDelayValidator, - jsonStringValidator, - parseDuration, - retentionPolicyMaxAgeValidator, - transformFrequencyValidator, -} from './validators'; - -describe('continuousModeDelayValidator', () => { - it('should allow 0 input without unit', () => { - expect(continuousModeDelayValidator('0')).toBe(true); - }); - - it('should allow 0 input with unit provided', () => { - expect(continuousModeDelayValidator('0s')).toBe(true); - }); - - it('should allow integer input with unit provided', () => { - expect(continuousModeDelayValidator('234nanos')).toBe(true); - }); - - it('should not allow integer input without unit provided', () => { - expect(continuousModeDelayValidator('90000')).toBe(false); - }); - - it('should not allow float input', () => { - expect(continuousModeDelayValidator('122.5d')).toBe(false); - }); -}); - -describe('parseDuration', () => { - it('should return undefined when the input is not an integer and valid time unit.', () => { - expect(parseDuration('0')).toBe(undefined); - expect(parseDuration('0.1s')).toBe(undefined); - expect(parseDuration('1.1m')).toBe(undefined); - expect(parseDuration('10.1asdf')).toBe(undefined); - }); - - it('should return parsed data for valid time units nanos|micros|ms|s|m|h|d.', () => { - expect(parseDuration('1a')).toEqual(undefined); - expect(parseDuration('1nanos')).toEqual({ - number: 1, - timeUnit: 'nanos', - }); - expect(parseDuration('1micros')).toEqual({ - number: 1, - timeUnit: 'micros', - }); - expect(parseDuration('1ms')).toEqual({ number: 1, timeUnit: 'ms' }); - expect(parseDuration('1s')).toEqual({ number: 1, timeUnit: 's' }); - expect(parseDuration('1m')).toEqual({ number: 1, timeUnit: 'm' }); - expect(parseDuration('1h')).toEqual({ number: 1, timeUnit: 'h' }); - expect(parseDuration('1d')).toEqual({ number: 1, timeUnit: 'd' }); - }); -}); - -describe('retentionPolicyMaxAgeValidator', () => { - it('should fail when the input is not an integer and valid time unit.', () => { - expect(retentionPolicyMaxAgeValidator('0')).toBe(false); - expect(retentionPolicyMaxAgeValidator('0.1s')).toBe(false); - expect(retentionPolicyMaxAgeValidator('1.1m')).toBe(false); - expect(retentionPolicyMaxAgeValidator('10.1asdf')).toBe(false); - }); - - it('should only allow values equal or above 60s.', () => { - expect(retentionPolicyMaxAgeValidator('0nanos')).toBe(false); - expect(retentionPolicyMaxAgeValidator('59999999999nanos')).toBe(false); - expect(retentionPolicyMaxAgeValidator('60000000000nanos')).toBe(true); - expect(retentionPolicyMaxAgeValidator('60000000001nanos')).toBe(true); - - expect(retentionPolicyMaxAgeValidator('0micros')).toBe(false); - expect(retentionPolicyMaxAgeValidator('59999999micros')).toBe(false); - expect(retentionPolicyMaxAgeValidator('60000000micros')).toBe(true); - expect(retentionPolicyMaxAgeValidator('60000001micros')).toBe(true); - - expect(retentionPolicyMaxAgeValidator('0ms')).toBe(false); - expect(retentionPolicyMaxAgeValidator('59999ms')).toBe(false); - expect(retentionPolicyMaxAgeValidator('60000ms')).toBe(true); - expect(retentionPolicyMaxAgeValidator('60001ms')).toBe(true); - - expect(retentionPolicyMaxAgeValidator('0s')).toBe(false); - expect(retentionPolicyMaxAgeValidator('1s')).toBe(false); - expect(retentionPolicyMaxAgeValidator('59s')).toBe(false); - expect(retentionPolicyMaxAgeValidator('60s')).toBe(true); - expect(retentionPolicyMaxAgeValidator('61s')).toBe(true); - expect(retentionPolicyMaxAgeValidator('10000s')).toBe(true); - - expect(retentionPolicyMaxAgeValidator('0m')).toBe(false); - expect(retentionPolicyMaxAgeValidator('1m')).toBe(true); - expect(retentionPolicyMaxAgeValidator('100m')).toBe(true); - - expect(retentionPolicyMaxAgeValidator('0h')).toBe(false); - expect(retentionPolicyMaxAgeValidator('1h')).toBe(true); - expect(retentionPolicyMaxAgeValidator('2h')).toBe(true); - }); -}); - -describe('transformFrequencyValidator', () => { - it('should fail when the input is not an integer and valid time unit.', () => { - expect(transformFrequencyValidator('0')).toBe(false); - expect(transformFrequencyValidator('0.1s')).toBe(false); - expect(transformFrequencyValidator('1.1m')).toBe(false); - expect(transformFrequencyValidator('10.1asdf')).toBe(false); - }); - - it('should only allow s/m/h as time unit.', () => { - expect(transformFrequencyValidator('1ms')).toBe(false); - expect(transformFrequencyValidator('1s')).toBe(true); - expect(transformFrequencyValidator('1m')).toBe(true); - expect(transformFrequencyValidator('1h')).toBe(true); - expect(transformFrequencyValidator('1d')).toBe(false); - }); - - it('should only allow values above 0 and up to 1 hour.', () => { - expect(transformFrequencyValidator('0s')).toBe(false); - expect(transformFrequencyValidator('1s')).toBe(true); - expect(transformFrequencyValidator('3599s')).toBe(true); - expect(transformFrequencyValidator('3600s')).toBe(true); - expect(transformFrequencyValidator('3601s')).toBe(false); - expect(transformFrequencyValidator('10000s')).toBe(false); - - expect(transformFrequencyValidator('0m')).toBe(false); - expect(transformFrequencyValidator('1m')).toBe(true); - expect(transformFrequencyValidator('59m')).toBe(true); - expect(transformFrequencyValidator('60m')).toBe(true); - expect(transformFrequencyValidator('61m')).toBe(false); - expect(transformFrequencyValidator('100m')).toBe(false); - - expect(transformFrequencyValidator('0h')).toBe(false); - expect(transformFrequencyValidator('1h')).toBe(true); - expect(transformFrequencyValidator('2h')).toBe(false); - }); -}); - -describe('jsonStringValidator', () => { - it('should return false for non-string input', () => { - expect(jsonStringValidator(false)).toBe(false); - expect(jsonStringValidator(undefined)).toBe(false); - expect(jsonStringValidator(null)).toBe(false); - expect(jsonStringValidator(0)).toBe(false); - expect(jsonStringValidator({})).toBe(false); - }); - - it('should return whether string is parsable as valid json', () => { - expect( - jsonStringValidator(`{ - "must": [], - "must_not": [], - "should": [] - }`) - ).toBe(true); - expect( - jsonStringValidator(`{ - "must":, - }`) - ).toBe(false); - }); -}); diff --git a/x-pack/plugins/transform/public/app/common/validators.ts b/x-pack/plugins/transform/public/app/common/validators.ts deleted file mode 100644 index cde8940f6f18e..0000000000000 --- a/x-pack/plugins/transform/public/app/common/validators.ts +++ /dev/null @@ -1,178 +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 { numberValidator } from '@kbn/ml-agg-utils'; -import { - numberOfRetriesInvalidErrorMessage, - numberRange10To10000NotValidErrorMessage, - numberRangeMinus1To100NotValidErrorMessage, - pageSearchSizeInvalidErrorMessage, -} from './constants/validation_messages'; - -const RETENTION_POLICY_MIN_AGE_SECONDS = 60; -const TIME_UNITS = ['nanos', 'micros', 'ms', 's', 'm', 'h', 'd']; - -/** - * Validates continuous mode time delay input. - * Doesn't allow floating intervals. - * @param value User input value. - */ -export function continuousModeDelayValidator(value: string): boolean { - return value.match(/^(0|\d*(nanos|micros|ms|s|m|h|d))$/) !== null; -} - -/** - * Parses a duration uses a string format like `60s`. - * @param value User input value. - */ -export interface ParsedDuration { - number: number; - timeUnit: string; -} -export function parseDuration(value: string): ParsedDuration | undefined { - if (typeof value !== 'string' || value === null) { - return; - } - - // split string by groups of numbers and letters - const regexStr = value.match(/[a-z]+|[^a-z]+/gi); - - // only valid if one group of numbers and one group of letters - if (regexStr === null || (Array.isArray(regexStr) && regexStr.length !== 2)) { - return; - } - - const number = +regexStr[0]; - const timeUnit = regexStr[1]; - - // only valid if number is an integer - if (isNaN(number) || !Number.isInteger(number)) { - return; - } - - if (!TIME_UNITS.includes(timeUnit)) { - return; - } - - return { number, timeUnit }; -} - -export function isValidRetentionPolicyMaxAge({ number, timeUnit }: ParsedDuration): boolean { - // only valid if value is equal or more than 60s - // supported time units: https://www.elastic.co/guide/en/elasticsearch/reference/master/common-options.html#time-units - return ( - (timeUnit === 'nanos' && number >= RETENTION_POLICY_MIN_AGE_SECONDS * 1000000000) || - (timeUnit === 'micros' && number >= RETENTION_POLICY_MIN_AGE_SECONDS * 1000000) || - (timeUnit === 'ms' && number >= RETENTION_POLICY_MIN_AGE_SECONDS * 1000) || - (timeUnit === 's' && number >= RETENTION_POLICY_MIN_AGE_SECONDS) || - ((timeUnit === 'm' || timeUnit === 'h' || timeUnit === 'd') && number >= 1) - ); -} - -/** - * Validates retention policy max age input. - * Doesn't allow floating intervals. - * @param value User input value. Minimum of 60s. - */ -export function retentionPolicyMaxAgeValidator(value: string): boolean { - const parsedValue = parseDuration(value); - - if (parsedValue === undefined) { - return false; - } - - return isValidRetentionPolicyMaxAge(parsedValue); -} - -// only valid if value is up to 1 hour -export function isValidFrequency({ number, timeUnit }: ParsedDuration): boolean { - return ( - (timeUnit === 's' && number <= 3600) || - (timeUnit === 'm' && number <= 60) || - (timeUnit === 'h' && number === 1) - ); -} - -/** - * Validates transform frequency input. - * Allows time units of s/m/h only. - * Must be above 0 and only up to 1h. - * @param value User input value. - */ -export const transformFrequencyValidator = (value: string): boolean => { - if (typeof value !== 'string' || value === null) { - return false; - } - - // split string by groups of numbers and letters - const regexStr = value.match(/[a-z]+|[^a-z]+/gi); - - // only valid if one group of numbers and one group of letters - if (regexStr === null || (Array.isArray(regexStr) && regexStr.length !== 2)) { - return false; - } - - const number = +regexStr[0]; - const timeUnit = regexStr[1]; - - // only valid if number is an integer above 0 - if (isNaN(number) || !Number.isInteger(number) || number === 0) { - return false; - } - - return isValidFrequency({ number, timeUnit }); -}; - -// A Validator function takes in a value to check and returns an array of error messages. -// If no messages (empty array) get returned, the value is valid. -export type Validator = (value: any, isOptional?: boolean) => string[]; - -/** - * Validates transform max_page_search_size input. - * Must be a number between 10 and 65536. - * @param value User input value. - */ -export const transformSettingsPageSearchSizeValidator: Validator = (value) => - !(value + '').includes('.') && - numberValidator({ min: 10, max: 65536, integerOnly: true })(+value) === null - ? [] - : [pageSearchSizeInvalidErrorMessage]; - -export const transformSettingsNumberOfRetriesValidator: Validator = (value) => - !(value + '').includes('.') && - numberValidator({ min: -1, max: 100, integerOnly: true })(+value) === null - ? [] - : [numberOfRetriesInvalidErrorMessage]; - -/** - * Validates whether string input can be parsed as a valid JSON - * @param value User input value. - */ -export function jsonStringValidator(value: unknown): boolean { - if (typeof value !== 'string') return false; - - try { - return !!JSON.parse(value); - } catch (e) { - // eslint-disable-next-line no-console - console.error(`JSON is invalid.\n${e}`); - return false; - } - return true; -} - -export const integerRangeMinus1To100Validator: Validator = (value) => - !(value + '').includes('.') && - numberValidator({ min: -1, max: 100, integerOnly: true })(+value) === null - ? [] - : [numberRangeMinus1To100NotValidErrorMessage]; - -export const integerRange10To10000Validator: Validator = (value) => - !(value + '').includes('.') && - numberValidator({ min: 10, max: 100001, integerOnly: true })(+value) === null - ? [] - : [numberRange10To10000NotValidErrorMessage]; diff --git a/x-pack/plugins/transform/public/app/common/validators/frequency_validator.test.ts b/x-pack/plugins/transform/public/app/common/validators/frequency_validator.test.ts new file mode 100644 index 0000000000000..1ebdd3d41cd57 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/frequency_validator.test.ts @@ -0,0 +1,48 @@ +/* + * 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 { frequencyValidator } from './frequency_validator'; + +describe('Transform: frequencyValidator()', () => { + // frequencyValidator() returns an array of error messages so + // an array with a length of 0 means a successful validation. + + it('should fail when the input is not an integer and valid time unit.', () => { + expect(frequencyValidator('0')).toEqual(['The frequency value is not valid.']); + expect(frequencyValidator('0.1s')).toEqual(['The frequency value is not valid.']); + expect(frequencyValidator('1.1m')).toEqual(['The frequency value is not valid.']); + expect(frequencyValidator('10.1asdf')).toEqual(['The frequency value is not valid.']); + }); + + it('should only allow s/m/h as time unit.', () => { + expect(frequencyValidator('1ms')).toEqual(['The frequency value is not valid.']); + expect(frequencyValidator('1s')).toEqual([]); + expect(frequencyValidator('1m')).toEqual([]); + expect(frequencyValidator('1h')).toEqual([]); + expect(frequencyValidator('1d')).toEqual(['The frequency value is not valid.']); + }); + + it('should only allow values above 0 and up to 1 hour.', () => { + expect(frequencyValidator('0s')).toEqual(['The frequency value is not valid.']); + expect(frequencyValidator('1s')).toEqual([]); + expect(frequencyValidator('3599s')).toEqual([]); + expect(frequencyValidator('3600s')).toEqual([]); + expect(frequencyValidator('3601s')).toEqual(['The frequency value is not valid.']); + expect(frequencyValidator('10000s')).toEqual(['The frequency value is not valid.']); + + expect(frequencyValidator('0m')).toEqual(['The frequency value is not valid.']); + expect(frequencyValidator('1m')).toEqual([]); + expect(frequencyValidator('59m')).toEqual([]); + expect(frequencyValidator('60m')).toEqual([]); + expect(frequencyValidator('61m')).toEqual(['The frequency value is not valid.']); + expect(frequencyValidator('100m')).toEqual(['The frequency value is not valid.']); + + expect(frequencyValidator('0h')).toEqual(['The frequency value is not valid.']); + expect(frequencyValidator('1h')).toEqual([]); + expect(frequencyValidator('2h')).toEqual(['The frequency value is not valid.']); + }); +}); diff --git a/x-pack/plugins/transform/public/app/common/validators/frequency_validator.ts b/x-pack/plugins/transform/public/app/common/validators/frequency_validator.ts new file mode 100644 index 0000000000000..2c007b091462a --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/frequency_validator.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 { frequencyNotValidErrorMessage } from './messages'; + +import { parseDurationAboveZero } from './parse_duration_above_zero'; +import { isValidFrequency } from './is_valid_frequency'; +import type { Validator } from './types'; + +// Only allow frequencies in the form of 1s/1h etc. +export const frequencyValidator: Validator = (arg) => { + const parsedArg = parseDurationAboveZero(arg); + + if (Array.isArray(parsedArg)) { + return parsedArg; + } + + return isValidFrequency(parsedArg) ? [] : [frequencyNotValidErrorMessage]; +}; diff --git a/x-pack/plugins/transform/public/app/common/validators/index.ts b/x-pack/plugins/transform/public/app/common/validators/index.ts new file mode 100644 index 0000000000000..8cf312b828dd3 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/index.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. + */ + +export { frequencyValidator } from './frequency_validator'; +export { integerRangeMinus1To100Validator } from './integer_range_minus_1_to_100_validator'; +export { integerAboveZeroValidator } from './integer_above_zero_validator'; +export { isJsonString } from './is_json_string'; +export { isContinuousModeDelay } from './is_continuous_mode_delay'; +export { isRetentionPolicyMaxAge } from './is_retention_policy_max_age'; +export { isTransformWizardFrequency } from './is_transform_wizard_frequency'; +export { parseDurationAboveZero } from './parse_duration_above_zero'; +export { retentionPolicyMaxAgeValidator } from './retention_policy_max_age_validator'; +export { stringValidator } from './string_validator'; +export { transformSettingsNumberOfRetriesValidator } from './transform_settings_number_of_retries_validator'; +export { transformSettingsPageSearchSizeValidator } from './transform_settings_page_search_size_validator'; +export type { Validator } from './types'; diff --git a/x-pack/plugins/transform/public/app/common/validators/integer_above_zero_validator.test.ts b/x-pack/plugins/transform/public/app/common/validators/integer_above_zero_validator.test.ts new file mode 100644 index 0000000000000..1031e23565933 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/integer_above_zero_validator.test.ts @@ -0,0 +1,29 @@ +/* + * 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 { integerAboveZeroValidator } from './integer_above_zero_validator'; + +describe('Transform: integerAboveZeroValidator()', () => { + it('should only allow integers above zero', () => { + // invalid + expect(integerAboveZeroValidator('a-string')).toEqual([ + 'Value needs to be an integer above zero.', + ]); + expect(integerAboveZeroValidator('0s')).toEqual(['Value needs to be an integer above zero.']); + expect(integerAboveZeroValidator('1m')).toEqual(['Value needs to be an integer above zero.']); + expect(integerAboveZeroValidator('1..')).toEqual(['Value needs to be an integer above zero.']); + expect(integerAboveZeroValidator(-1)).toEqual(['Value needs to be an integer above zero.']); + expect(integerAboveZeroValidator(0)).toEqual(['Value needs to be an integer above zero.']); + expect(integerAboveZeroValidator(0.1)).toEqual(['Value needs to be an integer above zero.']); + + // valid + expect(integerAboveZeroValidator(1)).toEqual([]); + expect(integerAboveZeroValidator('1')).toEqual([]); + expect(integerAboveZeroValidator('1.')).toEqual([]); + expect(integerAboveZeroValidator('1.0')).toEqual([]); + }); +}); diff --git a/x-pack/plugins/transform/public/app/common/validators/integer_above_zero_validator.ts b/x-pack/plugins/transform/public/app/common/validators/integer_above_zero_validator.ts new file mode 100644 index 0000000000000..c7903dcbc7f9e --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/integer_above_zero_validator.ts @@ -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 { i18n } from '@kbn/i18n'; +import { numberValidator } from '@kbn/ml-agg-utils'; + +import type { Validator } from './types'; + +const numberAboveZeroNotValidErrorMessage = i18n.translate( + 'xpack.transform.transformList.editFlyoutFormNumberAboveZeroNotValidErrorMessage', + { + defaultMessage: 'Value needs to be an integer above zero.', + } +); + +// memoize validator +const validator = numberValidator({ min: 1, integerOnly: true }); + +export const integerAboveZeroValidator: Validator = (value) => + validator(+value) === null ? [] : [numberAboveZeroNotValidErrorMessage]; diff --git a/x-pack/plugins/transform/public/app/common/validators/integer_range_minus_1_to_100_validator.ts b/x-pack/plugins/transform/public/app/common/validators/integer_range_minus_1_to_100_validator.ts new file mode 100644 index 0000000000000..290ca7e556dda --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/integer_range_minus_1_to_100_validator.ts @@ -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 { numberValidator } from '@kbn/ml-agg-utils'; +import { i18n } from '@kbn/i18n'; + +import type { Validator } from './types'; + +const numberRangeMinus1To100NotValidErrorMessage = i18n.translate( + 'xpack.transform.transformSettingValidations.numberGreaterThanOrEqualToNegativeOneNotValidErrorMessage', + { + defaultMessage: 'Number of retries needs to be between 0 and 100, or -1 for infinite retries.', + } +); + +// memoize validator +const validator = numberValidator({ min: -1, max: 100, integerOnly: true }); + +export const integerRangeMinus1To100Validator: Validator = (value) => + validator(+value) === null ? [] : [numberRangeMinus1To100NotValidErrorMessage]; diff --git a/x-pack/plugins/transform/public/app/common/validators/is_continuous_mode_delay.test.ts b/x-pack/plugins/transform/public/app/common/validators/is_continuous_mode_delay.test.ts new file mode 100644 index 0000000000000..934dd39d00683 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/is_continuous_mode_delay.test.ts @@ -0,0 +1,30 @@ +/* + * 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 { isContinuousModeDelay } from './is_continuous_mode_delay'; + +describe('isContinuousModeDelay', () => { + it('should allow 0 input without unit', () => { + expect(isContinuousModeDelay('0')).toBe(true); + }); + + it('should allow 0 input with unit provided', () => { + expect(isContinuousModeDelay('0s')).toBe(true); + }); + + it('should allow integer input with unit provided', () => { + expect(isContinuousModeDelay('234nanos')).toBe(true); + }); + + it('should not allow integer input without unit provided', () => { + expect(isContinuousModeDelay('90000')).toBe(false); + }); + + it('should not allow float input', () => { + expect(isContinuousModeDelay('122.5d')).toBe(false); + }); +}); diff --git a/x-pack/plugins/transform/public/app/common/validators/is_continuous_mode_delay.ts b/x-pack/plugins/transform/public/app/common/validators/is_continuous_mode_delay.ts new file mode 100644 index 0000000000000..af3d837db4c92 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/is_continuous_mode_delay.ts @@ -0,0 +1,15 @@ +/* + * 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. + */ + +/** + * Validates continuous mode time delay input. + * Doesn't allow floating intervals. + * @param value User input value. + */ +export function isContinuousModeDelay(value: string): boolean { + return value.match(/^(0|\d*(nanos|micros|ms|s|m|h|d))$/) !== null; +} diff --git a/x-pack/plugins/transform/public/app/common/validators/is_json_string.test.ts b/x-pack/plugins/transform/public/app/common/validators/is_json_string.test.ts new file mode 100644 index 0000000000000..89e1bb9a14563 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/is_json_string.test.ts @@ -0,0 +1,34 @@ +/* + * 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 { isJsonString } from './is_json_string'; + +describe('isJsonString', () => { + it('should return false for non-string input', () => { + expect(isJsonString(true)).toBe(false); + expect(isJsonString(false)).toBe(false); + expect(isJsonString(undefined)).toBe(false); + expect(isJsonString(null)).toBe(false); + expect(isJsonString(0)).toBe(false); + expect(isJsonString({})).toBe(false); + }); + + it('should return whether string is parsable as valid json', () => { + expect( + isJsonString(`{ + "must": [], + "must_not": [], + "should": [] + }`) + ).toBe(true); + expect( + isJsonString(`{ + "must":, + }`) + ).toBe(false); + }); +}); diff --git a/x-pack/plugins/transform/public/app/common/validators/is_json_string.ts b/x-pack/plugins/transform/public/app/common/validators/is_json_string.ts new file mode 100644 index 0000000000000..985374fe1fa80 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/is_json_string.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. + */ + +/** + * Validates whether string input can be parsed as a valid JSON + * @param value User input value. + */ +export function isJsonString(value: unknown): boolean { + if (typeof value !== 'string') return false; + + try { + return !!JSON.parse(value); + } catch (e) { + return false; + } +} diff --git a/x-pack/plugins/transform/public/app/common/validators/is_retention_policy_max_age.test.ts b/x-pack/plugins/transform/public/app/common/validators/is_retention_policy_max_age.test.ts new file mode 100644 index 0000000000000..bc28b01202705 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/is_retention_policy_max_age.test.ts @@ -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 { isRetentionPolicyMaxAge } from './is_retention_policy_max_age'; + +describe('isRetentionPolicyMaxAge', () => { + it('should fail when the input is not an integer and valid time unit.', () => { + expect(isRetentionPolicyMaxAge('0')).toBe(false); + expect(isRetentionPolicyMaxAge('0.1s')).toBe(false); + expect(isRetentionPolicyMaxAge('1.1m')).toBe(false); + expect(isRetentionPolicyMaxAge('10.1asdf')).toBe(false); + }); + + it('should only allow values equal or above 60s.', () => { + expect(isRetentionPolicyMaxAge('0nanos')).toBe(false); + expect(isRetentionPolicyMaxAge('59999999999nanos')).toBe(false); + expect(isRetentionPolicyMaxAge('60000000000nanos')).toBe(true); + expect(isRetentionPolicyMaxAge('60000000001nanos')).toBe(true); + + expect(isRetentionPolicyMaxAge('0micros')).toBe(false); + expect(isRetentionPolicyMaxAge('59999999micros')).toBe(false); + expect(isRetentionPolicyMaxAge('60000000micros')).toBe(true); + expect(isRetentionPolicyMaxAge('60000001micros')).toBe(true); + + expect(isRetentionPolicyMaxAge('0ms')).toBe(false); + expect(isRetentionPolicyMaxAge('59999ms')).toBe(false); + expect(isRetentionPolicyMaxAge('60000ms')).toBe(true); + expect(isRetentionPolicyMaxAge('60001ms')).toBe(true); + + expect(isRetentionPolicyMaxAge('0s')).toBe(false); + expect(isRetentionPolicyMaxAge('1s')).toBe(false); + expect(isRetentionPolicyMaxAge('59s')).toBe(false); + expect(isRetentionPolicyMaxAge('60s')).toBe(true); + expect(isRetentionPolicyMaxAge('61s')).toBe(true); + expect(isRetentionPolicyMaxAge('10000s')).toBe(true); + + expect(isRetentionPolicyMaxAge('0m')).toBe(false); + expect(isRetentionPolicyMaxAge('1m')).toBe(true); + expect(isRetentionPolicyMaxAge('100m')).toBe(true); + + expect(isRetentionPolicyMaxAge('0h')).toBe(false); + expect(isRetentionPolicyMaxAge('1h')).toBe(true); + expect(isRetentionPolicyMaxAge('2h')).toBe(true); + }); +}); diff --git a/x-pack/plugins/transform/public/app/common/validators/is_retention_policy_max_age.ts b/x-pack/plugins/transform/public/app/common/validators/is_retention_policy_max_age.ts new file mode 100644 index 0000000000000..fdd8a4b9e7b72 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/is_retention_policy_max_age.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 { isPopulatedObject } from '@kbn/ml-is-populated-object'; + +import { parseDurationAboveZero } from './parse_duration_above_zero'; + +const RETENTION_POLICY_MIN_AGE_SECONDS = 60; + +export function isRetentionPolicyMaxAge(arg: unknown): boolean { + const parsedArg = parseDurationAboveZero(arg); + + if (!isPopulatedObject(parsedArg, ['number', 'timeUnit'])) { + return false; + } + + const { number, timeUnit } = parsedArg; + + if (typeof number !== 'number' || typeof timeUnit !== 'string') { + return false; + } + + // only valid if value is equal or more than 60s + // supported time units: https://www.elastic.co/guide/en/elasticsearch/reference/master/common-options.html#time-units + return ( + (timeUnit === 'nanos' && number >= RETENTION_POLICY_MIN_AGE_SECONDS * 1000000000) || + (timeUnit === 'micros' && number >= RETENTION_POLICY_MIN_AGE_SECONDS * 1000000) || + (timeUnit === 'ms' && number >= RETENTION_POLICY_MIN_AGE_SECONDS * 1000) || + (timeUnit === 's' && number >= RETENTION_POLICY_MIN_AGE_SECONDS) || + ((timeUnit === 'm' || timeUnit === 'h' || timeUnit === 'd') && number >= 1) + ); +} diff --git a/x-pack/plugins/transform/public/app/common/validators/is_transform_wizard_frequency.test.ts b/x-pack/plugins/transform/public/app/common/validators/is_transform_wizard_frequency.test.ts new file mode 100644 index 0000000000000..8c6d1b79a2eae --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/is_transform_wizard_frequency.test.ts @@ -0,0 +1,45 @@ +/* + * 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 { isTransformWizardFrequency } from './is_transform_wizard_frequency'; + +describe('isTransformWizardFrequency', () => { + it('should fail when the input is not an integer and valid time unit.', () => { + expect(isTransformWizardFrequency('0')).toBe(false); + expect(isTransformWizardFrequency('0.1s')).toBe(false); + expect(isTransformWizardFrequency('1.1m')).toBe(false); + expect(isTransformWizardFrequency('10.1asdf')).toBe(false); + }); + + it('should only allow s/m/h as time unit.', () => { + expect(isTransformWizardFrequency('1ms')).toBe(false); + expect(isTransformWizardFrequency('1s')).toBe(true); + expect(isTransformWizardFrequency('1m')).toBe(true); + expect(isTransformWizardFrequency('1h')).toBe(true); + expect(isTransformWizardFrequency('1d')).toBe(false); + }); + + it('should only allow values above 0 and up to 1 hour.', () => { + expect(isTransformWizardFrequency('0s')).toBe(false); + expect(isTransformWizardFrequency('1s')).toBe(true); + expect(isTransformWizardFrequency('3599s')).toBe(true); + expect(isTransformWizardFrequency('3600s')).toBe(true); + expect(isTransformWizardFrequency('3601s')).toBe(false); + expect(isTransformWizardFrequency('10000s')).toBe(false); + + expect(isTransformWizardFrequency('0m')).toBe(false); + expect(isTransformWizardFrequency('1m')).toBe(true); + expect(isTransformWizardFrequency('59m')).toBe(true); + expect(isTransformWizardFrequency('60m')).toBe(true); + expect(isTransformWizardFrequency('61m')).toBe(false); + expect(isTransformWizardFrequency('100m')).toBe(false); + + expect(isTransformWizardFrequency('0h')).toBe(false); + expect(isTransformWizardFrequency('1h')).toBe(true); + expect(isTransformWizardFrequency('2h')).toBe(false); + }); +}); diff --git a/x-pack/plugins/transform/public/app/common/validators/is_transform_wizard_frequency.ts b/x-pack/plugins/transform/public/app/common/validators/is_transform_wizard_frequency.ts new file mode 100644 index 0000000000000..4063bac69f02a --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/is_transform_wizard_frequency.ts @@ -0,0 +1,38 @@ +/* + * 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 { isValidFrequency } from './is_valid_frequency'; + +/** + * Validates transform frequency input. + * Allows time units of s/m/h only. + * Must be above 0 and only up to 1h. + * @param value User input value. + */ +export const isTransformWizardFrequency = (value: string): boolean => { + if (typeof value !== 'string' || value === null) { + return false; + } + + // split string by groups of numbers and letters + const regexStr = value.match(/[a-z]+|[^a-z]+/gi); + + // only valid if one group of numbers and one group of letters + if (regexStr === null || (Array.isArray(regexStr) && regexStr.length !== 2)) { + return false; + } + + const number = +regexStr[0]; + const timeUnit = regexStr[1]; + + // only valid if number is an integer above 0 + if (isNaN(number) || !Number.isInteger(number) || number === 0) { + return false; + } + + return isValidFrequency({ number, timeUnit }); +}; diff --git a/x-pack/plugins/transform/public/app/common/validators/is_valid_frequency.ts b/x-pack/plugins/transform/public/app/common/validators/is_valid_frequency.ts new file mode 100644 index 0000000000000..6fe7781a5d6f4 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/is_valid_frequency.ts @@ -0,0 +1,29 @@ +/* + * 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 { isPopulatedObject } from '@kbn/ml-is-populated-object'; + +import type { ParsedDuration } from './types'; + +// only valid if value is up to 1 hour +export function isValidFrequency(arg: unknown): arg is ParsedDuration { + if (!isPopulatedObject(arg, ['number', 'timeUnit'])) { + return false; + } + + const { number, timeUnit } = arg; + + if (typeof number !== 'number' || typeof timeUnit !== 'string') { + return false; + } + + return ( + (timeUnit === 's' && number <= 3600) || + (timeUnit === 'm' && number <= 60) || + (timeUnit === 'h' && number === 1) + ); +} diff --git a/x-pack/plugins/transform/public/app/common/validators/messages.ts b/x-pack/plugins/transform/public/app/common/validators/messages.ts new file mode 100644 index 0000000000000..7355fb2d7022b --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/messages.ts @@ -0,0 +1,37 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +// Retention policy max age validator +export const retentionPolicyMaxAgeInvalidErrorMessage = i18n.translate( + 'xpack.transform.transformSettingValidations.retentionPolicyMaxAgeInvalidMessage', + { + defaultMessage: 'Invalid max age format. Minimum of 60s required.', + } +); + +export const requiredErrorMessage = i18n.translate( + 'xpack.transform.transformList.editFlyoutFormRequiredErrorMessage', + { + defaultMessage: 'Required field.', + } +); + +export const stringNotValidErrorMessage = i18n.translate( + 'xpack.transform.transformList.editFlyoutFormStringNotValidErrorMessage', + { + defaultMessage: 'Value needs to be of type string.', + } +); + +export const frequencyNotValidErrorMessage = i18n.translate( + 'xpack.transform.transformList.editFlyoutFormFrequencyNotValidErrorMessage', + { + defaultMessage: 'The frequency value is not valid.', + } +); diff --git a/x-pack/plugins/transform/public/app/common/validators/parse_duration_above_zero.test.ts b/x-pack/plugins/transform/public/app/common/validators/parse_duration_above_zero.test.ts new file mode 100644 index 0000000000000..6f48aab3e8ff3 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/parse_duration_above_zero.test.ts @@ -0,0 +1,34 @@ +/* + * 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 { parseDurationAboveZero } from './parse_duration_above_zero'; + +describe('parseDurationAboveZero', () => { + it('should return error when the input is not an integer and valid time unit.', () => { + expect(parseDurationAboveZero('0')).toEqual(['The frequency value is not valid.']); + expect(parseDurationAboveZero('0.1s')).toEqual(['The frequency value is not valid.']); + expect(parseDurationAboveZero('1.1m')).toEqual(['The frequency value is not valid.']); + expect(parseDurationAboveZero('10.1asdf')).toEqual(['The frequency value is not valid.']); + }); + + it('should return parsed data for valid time units nanos|micros|ms|s|m|h|d.', () => { + expect(parseDurationAboveZero('1a')).toEqual(['The frequency value is not valid.']); + expect(parseDurationAboveZero('1nanos')).toEqual({ + number: 1, + timeUnit: 'nanos', + }); + expect(parseDurationAboveZero('1micros')).toEqual({ + number: 1, + timeUnit: 'micros', + }); + expect(parseDurationAboveZero('1ms')).toEqual({ number: 1, timeUnit: 'ms' }); + expect(parseDurationAboveZero('1s')).toEqual({ number: 1, timeUnit: 's' }); + expect(parseDurationAboveZero('1m')).toEqual({ number: 1, timeUnit: 'm' }); + expect(parseDurationAboveZero('1h')).toEqual({ number: 1, timeUnit: 'h' }); + expect(parseDurationAboveZero('1d')).toEqual({ number: 1, timeUnit: 'd' }); + }); +}); diff --git a/x-pack/plugins/transform/public/app/common/validators/parse_duration_above_zero.ts b/x-pack/plugins/transform/public/app/common/validators/parse_duration_above_zero.ts new file mode 100644 index 0000000000000..2eb468b9b8aea --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/parse_duration_above_zero.ts @@ -0,0 +1,40 @@ +/* + * 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 { frequencyNotValidErrorMessage, stringNotValidErrorMessage } from './messages'; + +import type { ParsedDuration } from './types'; + +const TIME_UNITS = ['nanos', 'micros', 'ms', 's', 'm', 'h', 'd']; + +export function parseDurationAboveZero(arg: unknown): ParsedDuration | string[] { + if (typeof arg !== 'string' || arg === null) { + return [stringNotValidErrorMessage]; + } + + // split string by groups of numbers and letters + const regexStr = arg.match(/[a-z]+|[^a-z]+/gi); + + // only valid if one group of numbers and one group of letters + if (regexStr === null || (Array.isArray(regexStr) && regexStr.length !== 2)) { + return [frequencyNotValidErrorMessage]; + } + + const number = +regexStr[0]; + const timeUnit = regexStr[1]; + + // only valid if number is an integer above 0 + if (isNaN(number) || !Number.isInteger(number) || number === 0) { + return [frequencyNotValidErrorMessage]; + } + + if (!TIME_UNITS.includes(timeUnit)) { + return [frequencyNotValidErrorMessage]; + } + + return { number, timeUnit }; +} diff --git a/x-pack/plugins/transform/public/app/common/validators/retention_policy_max_age_validator.test.ts b/x-pack/plugins/transform/public/app/common/validators/retention_policy_max_age_validator.test.ts new file mode 100644 index 0000000000000..7e1f8a6614b65 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/retention_policy_max_age_validator.test.ts @@ -0,0 +1,54 @@ +/* + * 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 { retentionPolicyMaxAgeValidator } from './retention_policy_max_age_validator'; + +describe('Transform: retentionPolicyMaxAgeValidator()', () => { + it('should only allow values equal or above 60s.', () => { + expect(retentionPolicyMaxAgeValidator('0nanos')).toEqual(['The frequency value is not valid.']); + expect(retentionPolicyMaxAgeValidator('59999999999nanos')).toEqual([ + 'Invalid max age format. Minimum of 60s required.', + ]); + expect(retentionPolicyMaxAgeValidator('60000000000nanos')).toEqual([]); + expect(retentionPolicyMaxAgeValidator('60000000001nanos')).toEqual([]); + + expect(retentionPolicyMaxAgeValidator('0micros')).toEqual([ + 'The frequency value is not valid.', + ]); + expect(retentionPolicyMaxAgeValidator('59999999micros')).toEqual([ + 'Invalid max age format. Minimum of 60s required.', + ]); + expect(retentionPolicyMaxAgeValidator('60000000micros')).toEqual([]); + expect(retentionPolicyMaxAgeValidator('60000001micros')).toEqual([]); + + expect(retentionPolicyMaxAgeValidator('0ms')).toEqual(['The frequency value is not valid.']); + expect(retentionPolicyMaxAgeValidator('59999ms')).toEqual([ + 'Invalid max age format. Minimum of 60s required.', + ]); + expect(retentionPolicyMaxAgeValidator('60000ms')).toEqual([]); + expect(retentionPolicyMaxAgeValidator('60001ms')).toEqual([]); + + expect(retentionPolicyMaxAgeValidator('0s')).toEqual(['The frequency value is not valid.']); + expect(retentionPolicyMaxAgeValidator('1s')).toEqual([ + 'Invalid max age format. Minimum of 60s required.', + ]); + expect(retentionPolicyMaxAgeValidator('59s')).toEqual([ + 'Invalid max age format. Minimum of 60s required.', + ]); + expect(retentionPolicyMaxAgeValidator('60s')).toEqual([]); + expect(retentionPolicyMaxAgeValidator('61s')).toEqual([]); + expect(retentionPolicyMaxAgeValidator('10000s')).toEqual([]); + + expect(retentionPolicyMaxAgeValidator('0m')).toEqual(['The frequency value is not valid.']); + expect(retentionPolicyMaxAgeValidator('1m')).toEqual([]); + expect(retentionPolicyMaxAgeValidator('100m')).toEqual([]); + + expect(retentionPolicyMaxAgeValidator('0h')).toEqual(['The frequency value is not valid.']); + expect(retentionPolicyMaxAgeValidator('1h')).toEqual([]); + expect(retentionPolicyMaxAgeValidator('2h')).toEqual([]); + }); +}); diff --git a/x-pack/plugins/transform/public/app/common/validators/retention_policy_max_age_validator.ts b/x-pack/plugins/transform/public/app/common/validators/retention_policy_max_age_validator.ts new file mode 100644 index 0000000000000..f92e242f0dc89 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/retention_policy_max_age_validator.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 { retentionPolicyMaxAgeInvalidErrorMessage } from './messages'; + +import { parseDurationAboveZero } from './parse_duration_above_zero'; +import { isRetentionPolicyMaxAge } from './is_retention_policy_max_age'; +import type { Validator } from './types'; + +/** + * Validates retention policy max age input. + * Doesn't allow floating intervals. + * @param value User input value. Minimum of 60s. + */ +export const retentionPolicyMaxAgeValidator: Validator = (arg) => { + const parsedArg = parseDurationAboveZero(arg); + + if (Array.isArray(parsedArg)) { + return parsedArg; + } + + // We pass in again the original `arg`, not `parsedArg` since it will parse it again. + return isRetentionPolicyMaxAge(arg) ? [] : [retentionPolicyMaxAgeInvalidErrorMessage]; +}; diff --git a/x-pack/plugins/transform/public/app/common/validators/string_validator.test.ts b/x-pack/plugins/transform/public/app/common/validators/string_validator.test.ts new file mode 100644 index 0000000000000..6956ef305a66a --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/string_validator.test.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 { stringValidator } from './string_validator'; + +describe('Transform: stringValidator()', () => { + it('should allow an empty string for optional fields', () => { + expect(stringValidator('')).toEqual([]); + }); + + it('should not allow an empty string for required fields', () => { + expect(stringValidator('', false)).toEqual(['Required field.']); + }); +}); diff --git a/x-pack/plugins/transform/public/app/common/validators/string_validator.ts b/x-pack/plugins/transform/public/app/common/validators/string_validator.ts new file mode 100644 index 0000000000000..e0c417036daec --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/string_validator.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 { requiredErrorMessage, stringNotValidErrorMessage } from './messages'; + +import type { Validator } from './types'; + +export const stringValidator: Validator = (value, isOptional = true) => { + if (typeof value !== 'string') { + return [stringNotValidErrorMessage]; + } + + if (value.length === 0 && !isOptional) { + return [requiredErrorMessage]; + } + + return []; +}; diff --git a/x-pack/plugins/transform/public/app/common/validators/transform_settings_number_of_retries_validator.ts b/x-pack/plugins/transform/public/app/common/validators/transform_settings_number_of_retries_validator.ts new file mode 100644 index 0000000000000..c2eb421c56dfd --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/transform_settings_number_of_retries_validator.ts @@ -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 { i18n } from '@kbn/i18n'; +import { numberValidator } from '@kbn/ml-agg-utils'; + +import type { Validator } from './types'; + +const numberOfRetriesInvalidErrorMessage = i18n.translate( + 'xpack.transform.transformSettingsValidations.numberOfRetriesInvalidErrorMessage', + { + defaultMessage: 'Number of retries needs to be between 0 and 100, or -1 for infinite retries.', + } +); + +// memoize validator +const validator = numberValidator({ min: -1, max: 100, integerOnly: true }); + +export const transformSettingsNumberOfRetriesValidator: Validator = (value) => + validator(+value) === null ? [] : [numberOfRetriesInvalidErrorMessage]; diff --git a/x-pack/plugins/transform/public/app/common/validators/transform_settings_page_search_size_validator.ts b/x-pack/plugins/transform/public/app/common/validators/transform_settings_page_search_size_validator.ts new file mode 100644 index 0000000000000..b177a3680d948 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/transform_settings_page_search_size_validator.ts @@ -0,0 +1,29 @@ +/* + * 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 { i18n } from '@kbn/i18n'; +import { numberValidator } from '@kbn/ml-agg-utils'; + +import type { Validator } from './types'; + +const pageSearchSizeInvalidErrorMessage = i18n.translate( + 'xpack.transform.transformSettingValidations.maxPageSearchSizeInvalidMessage', + { + defaultMessage: 'Maximum page search size needs to be an integer between 10 and 65536.', + } +); + +// memoize validator +const validator = numberValidator({ min: 10, max: 65536, integerOnly: true }); + +/** + * Validates transform max_page_search_size input. + * Must be a number between 10 and 65536. + * @param value User input value. + */ +export const transformSettingsPageSearchSizeValidator: Validator = (value) => + validator(+value) === null ? [] : [pageSearchSizeInvalidErrorMessage]; diff --git a/x-pack/plugins/transform/public/app/common/validators/types.ts b/x-pack/plugins/transform/public/app/common/validators/types.ts new file mode 100644 index 0000000000000..de1f51aa518c5 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/types.ts @@ -0,0 +1,27 @@ +/* + * 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 Validator function takes in a value to check and returns an array of error messages. + * If no messages (empty array) get returned, the value is valid. + * + * Informal naming convention: + * `is*()` is a plain check that returns a `boolean` + * `*Validator()` implements this type and returns error messages. + * + * @param value The value to be validated + * @param isOptional Optional boolean flag if the provided value is optional + */ +export type Validator = (value: T, isOptional?: boolean) => string[]; + +/** + * Interface for the parsed result of a duration string. + */ +export interface ParsedDuration { + number: number; + timeUnit: string; +} diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/config.ts b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/config.ts index 4003f9f88d40d..0b1d4f1caa521 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/config.ts +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/config.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { jsonStringValidator } from '../../../../../../common/validators'; +import { isJsonString } from '../../../../../../common/validators'; import { isPivotAggsConfigWithUiBase, PivotAggsConfigBase, @@ -209,7 +209,7 @@ export function getFilterAggTypeConfig( 2 ), isValid() { - return jsonStringValidator(this.filterAggConfig); + return isJsonString(this.filterAggConfig); }, getEsAggConfig() { return JSON.parse(this.filterAggConfig!); @@ -224,7 +224,7 @@ export function getFilterAggTypeConfig( return this.filterAggConfig !== undefined ? JSON.parse(this.filterAggConfig!) : {}; }, isValid() { - return jsonStringValidator(this.filterAggConfig); + return isJsonString(this.filterAggConfig); }, }; } diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx index 424d6dd820df6..57f9388311210 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx @@ -29,7 +29,7 @@ import { toMountPoint } from '@kbn/react-kibana-mount'; import { CreateDataViewForm } from '@kbn/ml-data-view-utils/components/create_data_view_form_row'; import { DestinationIndexForm } from '@kbn/ml-creation-wizard-utils/components/destination_index_form'; -import { retentionPolicyMaxAgeInvalidErrorMessage } from '../../../../common/constants/validation_messages'; +import { retentionPolicyMaxAgeInvalidErrorMessage } from '../../../../common/validators/messages'; import { DEFAULT_TRANSFORM_FREQUENCY } from '../../../../../../common/constants'; import { TransformId } from '../../../../../../common/types/transform'; import { isValidIndexName } from '../../../../../../common/utils/es_utils'; @@ -54,10 +54,10 @@ import { } from '../../../../common'; import { EsIndexName } from './common'; import { - continuousModeDelayValidator, + isContinuousModeDelay, + isRetentionPolicyMaxAge, + isTransformWizardFrequency, integerRangeMinus1To100Validator, - retentionPolicyMaxAgeValidator, - transformFrequencyValidator, transformSettingsPageSearchSizeValidator, } from '../../../../common/validators'; import { StepDefineExposedState } from '../step_define/common'; @@ -260,7 +260,7 @@ export const StepDetailsForm: FC = React.memo( isContinuousModeAvailable ? sourceIndexDateFieldNames[0] : '' ); const [continuousModeDelay, setContinuousModeDelay] = useState(defaults.continuousModeDelay); - const isContinuousModeDelayValid = continuousModeDelayValidator(continuousModeDelay); + const isContinuousModeDelayValid = isContinuousModeDelay(continuousModeDelay); // Retention Policy const isRetentionPolicyAvailable = destIndexAvailableTimeFields.length > 0; @@ -274,7 +274,7 @@ export const StepDetailsForm: FC = React.memo( defaults.retentionPolicyMaxAge ); const retentionPolicyMaxAgeEmpty = retentionPolicyMaxAge === ''; - const isRetentionPolicyMaxAgeValid = retentionPolicyMaxAgeValidator(retentionPolicyMaxAge); + const isRetentionPolicyMaxAgeValid = isRetentionPolicyMaxAge(retentionPolicyMaxAge); useEffect(() => { // Reset retention policy settings when the user disables the whole option @@ -308,7 +308,7 @@ export const StepDetailsForm: FC = React.memo( const dataViewTitleExists = dataViewTitles?.some((name) => destinationIndex === name) ?? false; const [transformFrequency, setTransformFrequency] = useState(defaults.transformFrequency); - const isTransformFrequencyValid = transformFrequencyValidator(transformFrequency); + const isTransformFrequencyValid = isTransformWizardFrequency(transformFrequency); const [transformSettingsMaxPageSearchSize, setTransformSettingsMaxPageSearchSize] = useState< number | undefined diff --git a/x-pack/plugins/transform/public/app/sections/transform_management/components/edit_transform_flyout/use_edit_transform_flyout.test.ts b/x-pack/plugins/transform/public/app/sections/transform_management/components/edit_transform_flyout/use_edit_transform_flyout.test.ts index 1aeb7a425331f..ebea339c44300 100644 --- a/x-pack/plugins/transform/public/app/sections/transform_management/components/edit_transform_flyout/use_edit_transform_flyout.test.ts +++ b/x-pack/plugins/transform/public/app/sections/transform_management/components/edit_transform_flyout/use_edit_transform_flyout.test.ts @@ -10,11 +10,7 @@ import { TransformPivotConfig } from '../../../../../../common/types/transform'; import { applyFormStateToTransformConfig, formReducerFactory, - frequencyValidator, getDefaultState, - integerAboveZeroValidator, - retentionPolicyMaxAgeValidator, - stringValidator, } from './use_edit_transform_flyout'; const getTransformConfigMock = (): TransformPivotConfig => ({ @@ -232,111 +228,3 @@ describe('Transform: formReducerFactory()', () => { ]); }); }); - -describe('Transform: stringValidator()', () => { - it('should allow an empty string for optional fields', () => { - expect(stringValidator('')).toHaveLength(0); - }); - - it('should not allow an empty string for required fields', () => { - expect(stringValidator('', false)).toHaveLength(1); - }); -}); - -describe('Transform: frequencyValidator()', () => { - const transformFrequencyValidator = (arg: string) => frequencyValidator(arg).length === 0; - - it('should fail when the input is not an integer and valid time unit.', () => { - expect(transformFrequencyValidator('0')).toBe(false); - expect(transformFrequencyValidator('0.1s')).toBe(false); - expect(transformFrequencyValidator('1.1m')).toBe(false); - expect(transformFrequencyValidator('10.1asdf')).toBe(false); - }); - - it('should only allow s/m/h as time unit.', () => { - expect(transformFrequencyValidator('1ms')).toBe(false); - expect(transformFrequencyValidator('1s')).toBe(true); - expect(transformFrequencyValidator('1m')).toBe(true); - expect(transformFrequencyValidator('1h')).toBe(true); - expect(transformFrequencyValidator('1d')).toBe(false); - }); - - it('should only allow values above 0 and up to 1 hour.', () => { - expect(transformFrequencyValidator('0s')).toBe(false); - expect(transformFrequencyValidator('1s')).toBe(true); - expect(transformFrequencyValidator('3599s')).toBe(true); - expect(transformFrequencyValidator('3600s')).toBe(true); - expect(transformFrequencyValidator('3601s')).toBe(false); - expect(transformFrequencyValidator('10000s')).toBe(false); - - expect(transformFrequencyValidator('0m')).toBe(false); - expect(transformFrequencyValidator('1m')).toBe(true); - expect(transformFrequencyValidator('59m')).toBe(true); - expect(transformFrequencyValidator('60m')).toBe(true); - expect(transformFrequencyValidator('61m')).toBe(false); - expect(transformFrequencyValidator('100m')).toBe(false); - - expect(transformFrequencyValidator('0h')).toBe(false); - expect(transformFrequencyValidator('1h')).toBe(true); - expect(transformFrequencyValidator('2h')).toBe(false); - }); -}); - -describe('Transform: retentionPolicyMaxAgeValidator()', () => { - const transformRetentionPolicyMaxAgeValidator = (arg: string) => - retentionPolicyMaxAgeValidator(arg).length === 0; - - it('should only allow values equal or above 60s.', () => { - expect(transformRetentionPolicyMaxAgeValidator('0nanos')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('59999999999nanos')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('60000000000nanos')).toBe(true); - expect(transformRetentionPolicyMaxAgeValidator('60000000001nanos')).toBe(true); - - expect(transformRetentionPolicyMaxAgeValidator('0micros')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('59999999micros')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('60000000micros')).toBe(true); - expect(transformRetentionPolicyMaxAgeValidator('60000001micros')).toBe(true); - - expect(transformRetentionPolicyMaxAgeValidator('0ms')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('59999ms')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('60000ms')).toBe(true); - expect(transformRetentionPolicyMaxAgeValidator('60001ms')).toBe(true); - - expect(transformRetentionPolicyMaxAgeValidator('0s')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('1s')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('59s')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('60s')).toBe(true); - expect(transformRetentionPolicyMaxAgeValidator('61s')).toBe(true); - expect(transformRetentionPolicyMaxAgeValidator('10000s')).toBe(true); - - expect(transformRetentionPolicyMaxAgeValidator('0m')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('1m')).toBe(true); - expect(transformRetentionPolicyMaxAgeValidator('100m')).toBe(true); - - expect(transformRetentionPolicyMaxAgeValidator('0h')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('1h')).toBe(true); - expect(transformRetentionPolicyMaxAgeValidator('2h')).toBe(true); - }); -}); - -describe('Transform: integerAboveZeroValidator()', () => { - it('should only allow integers above zero', () => { - // integerAboveZeroValidator() returns an array of error messages so - // an array with a length of 0 means a successful validation. - - // invalid - expect(integerAboveZeroValidator('a-string')).toHaveLength(1); - expect(integerAboveZeroValidator('0s')).toHaveLength(1); - expect(integerAboveZeroValidator('1m')).toHaveLength(1); - expect(integerAboveZeroValidator('1.')).toHaveLength(1); - expect(integerAboveZeroValidator('1..')).toHaveLength(1); - expect(integerAboveZeroValidator('1.0')).toHaveLength(1); - expect(integerAboveZeroValidator(-1)).toHaveLength(1); - expect(integerAboveZeroValidator(0)).toHaveLength(1); - expect(integerAboveZeroValidator(0.1)).toHaveLength(1); - - // valid - expect(integerAboveZeroValidator(1)).toHaveLength(0); - expect(integerAboveZeroValidator('1')).toHaveLength(0); - }); -}); diff --git a/x-pack/plugins/transform/public/app/sections/transform_management/components/edit_transform_flyout/use_edit_transform_flyout.tsx b/x-pack/plugins/transform/public/app/sections/transform_management/components/edit_transform_flyout/use_edit_transform_flyout.tsx index b1aac5e54d259..2e82edb54b6fd 100644 --- a/x-pack/plugins/transform/public/app/sections/transform_management/components/edit_transform_flyout/use_edit_transform_flyout.tsx +++ b/x-pack/plugins/transform/public/app/sections/transform_management/components/edit_transform_flyout/use_edit_transform_flyout.tsx @@ -9,11 +9,8 @@ import constate from 'constate'; import { isEqual, merge } from 'lodash'; import { useMemo, useReducer } from 'react'; -import { i18n } from '@kbn/i18n'; -import { numberValidator } from '@kbn/ml-agg-utils'; import { getNestedProperty, setNestedProperty } from '@kbn/ml-nested-property'; -import { retentionPolicyMaxAgeInvalidErrorMessage } from '../../../../common/constants/validation_messages'; import { PostTransformsUpdateRequestSchema } from '../../../../../../common/api_schemas/update_transforms'; import { DEFAULT_TRANSFORM_FREQUENCY, @@ -21,13 +18,20 @@ import { } from '../../../../../../common/constants'; import { TransformConfigUnion } from '../../../../../../common/types/transform'; +// Note on the form validation and input components used: +// All inputs use `EuiFieldText` which means all form values will be treated as strings. +// This means we cast other formats like numbers coming from the transform config to strings, +// then revalidate them and cast them again to number before submitting a transform update. +// We do this so we have fine grained control over field validation and the option to +// cast to special values like `null` for disabling `docs_per_second`. import { - isValidFrequency, - isValidRetentionPolicyMaxAge, - ParsedDuration, + frequencyValidator, + integerAboveZeroValidator, transformSettingsNumberOfRetriesValidator, transformSettingsPageSearchSizeValidator, - Validator, + retentionPolicyMaxAgeValidator, + stringValidator, + type Validator, } from '../../../../common/validators'; // This custom hook uses nested reducers to provide a generic framework to manage form state @@ -61,7 +65,7 @@ export interface FormField { isNullable: boolean; isOptional: boolean; section?: EditTransformFormSections; - validator: keyof typeof validate; + validator: Validator; value: string; valueParser: (value: string) => any; } @@ -100,108 +104,6 @@ type EditTransformFlyoutSectionsState = Record - !(value + '').includes('.') && numberValidator({ min: 1, integerOnly: true })(+value) === null - ? [] - : [numberAboveZeroNotValidErrorMessage]; - -const requiredErrorMessage = i18n.translate( - 'xpack.transform.transformList.editFlyoutFormRequiredErrorMessage', - { - defaultMessage: 'Required field.', - } -); -const stringNotValidErrorMessage = i18n.translate( - 'xpack.transform.transformList.editFlyoutFormStringNotValidErrorMessage', - { - defaultMessage: 'Value needs to be of type string.', - } -); -export const stringValidator: Validator = (value, isOptional = true) => { - if (typeof value !== 'string') { - return [stringNotValidErrorMessage]; - } - - if (value.length === 0 && !isOptional) { - return [requiredErrorMessage]; - } - - return []; -}; - -function parseDurationAboveZero(arg: unknown, errorMessage: string): ParsedDuration | string[] { - if (typeof arg !== 'string' || arg === null) { - return [stringNotValidErrorMessage]; - } - - // split string by groups of numbers and letters - const regexStr = arg.match(/[a-z]+|[^a-z]+/gi); - - // only valid if one group of numbers and one group of letters - if (regexStr === null || (Array.isArray(regexStr) && regexStr.length !== 2)) { - return [frequencyNotValidErrorMessage]; - } - - const number = +regexStr[0]; - const timeUnit = regexStr[1]; - - // only valid if number is an integer above 0 - if (isNaN(number) || !Number.isInteger(number) || number === 0) { - return [frequencyNotValidErrorMessage]; - } - - return { number, timeUnit }; -} - -// Only allow frequencies in the form of 1s/1h etc. -const frequencyNotValidErrorMessage = i18n.translate( - 'xpack.transform.transformList.editFlyoutFormFrequencyNotValidErrorMessage', - { - defaultMessage: 'The frequency value is not valid.', - } -); -export const frequencyValidator: Validator = (arg) => { - const parsedArg = parseDurationAboveZero(arg, frequencyNotValidErrorMessage); - - if (Array.isArray(parsedArg)) { - return parsedArg; - } - - return isValidFrequency(parsedArg) ? [] : [frequencyNotValidErrorMessage]; -}; - -export const retentionPolicyMaxAgeValidator: Validator = (arg) => { - const parsedArg = parseDurationAboveZero(arg, retentionPolicyMaxAgeInvalidErrorMessage); - - if (Array.isArray(parsedArg)) { - return parsedArg; - } - - return isValidRetentionPolicyMaxAge(parsedArg) ? [] : [retentionPolicyMaxAgeInvalidErrorMessage]; -}; - -const validate = { - string: stringValidator, - frequency: frequencyValidator, - integerAboveZero: integerAboveZeroValidator, - transformSettingsNumberOfRetriesValidator, - transformSettingsPageSearchSizeValidator, - retentionPolicyMaxAgeValidator, -} as const; - export const initializeField = ( formFieldName: EditTransformFormFields, configFieldName: string, @@ -220,7 +122,7 @@ export const initializeField = ( errorMessages: [], isNullable: false, isOptional: true, - validator: 'string', + validator: stringValidator, value, valueParser: (v) => v, ...(overloads !== undefined ? { ...overloads } : {}), @@ -359,7 +261,7 @@ export const getDefaultState = (config: TransformConfigUnion): EditTransformFlyo description: initializeField('description', 'description', config), frequency: initializeField('frequency', 'frequency', config, { defaultValue: DEFAULT_TRANSFORM_FREQUENCY, - validator: 'frequency', + validator: frequencyValidator, }), // dest.* @@ -381,7 +283,7 @@ export const getDefaultState = (config: TransformConfigUnion): EditTransformFlyo docsPerSecond: initializeField('docsPerSecond', 'settings.docs_per_second', config, { isNullable: true, isOptional: true, - validator: 'integerAboveZero', + validator: integerAboveZeroValidator, valueParser: (v) => (v === '' ? null : +v), }), maxPageSearchSize: initializeField( @@ -392,7 +294,7 @@ export const getDefaultState = (config: TransformConfigUnion): EditTransformFlyo defaultValue: `${DEFAULT_TRANSFORM_SETTINGS_MAX_PAGE_SEARCH_SIZE}`, isNullable: true, isOptional: true, - validator: 'transformSettingsPageSearchSizeValidator', + validator: transformSettingsPageSearchSizeValidator, valueParser: (v) => +v, } ), @@ -404,7 +306,7 @@ export const getDefaultState = (config: TransformConfigUnion): EditTransformFlyo defaultValue: undefined, isNullable: true, isOptional: true, - validator: 'transformSettingsNumberOfRetriesValidator', + validator: transformSettingsNumberOfRetriesValidator, valueParser: (v) => +v, } ), @@ -430,7 +332,7 @@ export const getDefaultState = (config: TransformConfigUnion): EditTransformFlyo isNullable: false, isOptional: true, section: 'retentionPolicy', - validator: 'retentionPolicyMaxAgeValidator', + validator: retentionPolicyMaxAgeValidator, } ), }, @@ -458,7 +360,7 @@ const formFieldReducer = (state: FormField, value: string): FormField => { errorMessages: state.isOptional && typeof value === 'string' && value.length === 0 ? [] - : validate[state.validator](value, state.isOptional), + : state.validator(value, state.isOptional), value, }; }; diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 7c828eaee3afa..14a9f8257d1c6 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -21925,53 +21925,53 @@ "xpack.lens.xyVisualization.dataTypeFailureXShort": "Type de données incorrect pour {axis}.", "xpack.lens.xyVisualization.dataTypeFailureYLong": "La dimension {label} fournie pour {axis} possède un type de données incorrect. Un nombre est attendu, mais {dataType} trouvé", "xpack.lens.xyVisualization.dataTypeFailureYShort": "Type de données incorrect pour {axis}.", - "xpack.lens.formula.absFunction.markdown": "\nCalcule une valeur absolue. Une valeur négative est multipliée par -1, une valeur positive reste identique.\n\nExemple : calculer la distance moyenne par rapport au niveau de la mer \"abs(average(altitude))\"\n ", - "xpack.lens.formula.addFunction.markdown": "\nAjoute jusqu'à deux nombres.\nFonctionne également avec le symbole \"+\".\n\nExemple : calculer la somme de deux champs\n\n\"sum(price) + sum(tax)\"\n\nExemple : compenser le compte par une valeur statique\n\n\"add(count(), 5)\"\n ", - "xpack.lens.formula.cbrtFunction.markdown": "\nÉtablit la racine carrée de la valeur.\n\nExemple : calculer la longueur du côté à partir du volume\n`cbrt(last_value(volume))`\n ", - "xpack.lens.formula.ceilFunction.markdown": "\nArrondit le plafond de la valeur au chiffre supérieur.\n\nExemple : arrondir le prix au dollar supérieur\n`ceil(sum(price))`\n ", - "xpack.lens.formula.clampFunction.markdown": "\nÉtablit une limite minimale et maximale pour la valeur.\n\nExemple : s'assurer de repérer les valeurs aberrantes\n```\nclamp(\n average(bytes),\n percentile(bytes, percentile=5),\n percentile(bytes, percentile=95)\n)\n```\n", - "xpack.lens.formula.cubeFunction.markdown": "\nCalcule le cube d'un nombre.\n\nExemple : calculer le volume à partir de la longueur du côté\n`cube(last_value(length))`\n ", - "xpack.lens.formula.defaultFunction.markdown": "\nRetourne une valeur numérique par défaut lorsque la valeur est nulle.\n\nExemple : Retourne -1 lorsqu'un champ ne contient aucune donnée.\n\"defaults(average(bytes), -1)\"\n", - "xpack.lens.formula.divideFunction.markdown": "\nDivise le premier nombre par le deuxième.\nFonctionne également avec le symbole \"/\".\n\nExemple : calculer la marge bénéficiaire\n\"sum(profit) / sum(revenue)\"\n\nExemple : \"divide(sum(bytes), 2)\"\n ", - "xpack.lens.formula.eqFunction.markdown": "\nEffectue une comparaison d'égalité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \"==\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est égale à la quantité de mémoire moyenne.\n\"average(bytes) == average(memory)\"\n\nExemple : \"eq(sum(bytes), 1000000)\"\n ", - "xpack.lens.formula.expFunction.markdown": "\nÉlève *e* à la puissance n.\n\nExemple : calculer la fonction exponentielle naturelle\n\n`exp(last_value(duration))`\n ", - "xpack.lens.formula.fixFunction.markdown": "\nPour les valeurs positives, part du bas. Pour les valeurs négatives, part du haut.\n\nExemple : arrondir à zéro\n\"fix(sum(profit))\"\n ", - "xpack.lens.formula.floorFunction.markdown": "\nArrondit à la valeur entière inférieure la plus proche.\n\nExemple : arrondir un prix au chiffre inférieur\n\"floor(sum(price))\"\n ", - "xpack.lens.formula.gteFunction.markdown": "\nEffectue une comparaison de supériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \">=\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est supérieure ou égale à la quantité moyenne de mémoire.\n\"average(bytes) >= average(memory)\"\n\nExemple : \"gte(average(bytes), 1000)\"\n ", - "xpack.lens.formula.gtFunction.markdown": "\nEffectue une comparaison de supériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \">\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est supérieure à la quantité moyenne de mémoire.\n\"average(bytes) > average(memory)\"\n\nExemple : \"gt(average(bytes), 1000)\"\n ", - "xpack.lens.formula.ifElseFunction.markdown": "\nRetourne une valeur selon si l'élément de condition est \"true\" ou \"false\".\n\nExemple : Revenus moyens par client, mais dans certains cas, l'ID du client n'est pas fourni, et le client est alors compté comme client supplémentaire.\n`sum(total)/(unique_count(customer_id) + ifelse( count() > count(kql='customer_id:*'), 1, 0))`\n ", - "xpack.lens.formula.logFunction.markdown": "\nÉtablit un logarithme avec base optionnelle. La base naturelle *e* est utilisée par défaut.\n\nExemple : calculer le nombre de bits nécessaire au stockage de valeurs\n```\nlog(sum(bytes))\nlog(sum(bytes), 2)\n```\n ", - "xpack.lens.formula.lteFunction.markdown": "\nEffectue une comparaison d'infériorité ou de supériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \"<=\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est inférieure ou égale à la quantité moyenne de mémoire.\n\"average(bytes) <= average(memory)\"\n\nExemple : \"lte(average(bytes), 1000)\"\n ", - "xpack.lens.formula.ltFunction.markdown": "\nEffectue une comparaison d'infériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \"<\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est inférieure à la quantité moyenne de mémoire.\n\"average(bytes) <= average(memory)\"\n\nExemple : \"lt(average(bytes), 1000)\"\n ", - "xpack.lens.formula.maxFunction.markdown": "\nTrouve la valeur maximale entre deux nombres.\n\nExemple : Trouver le maximum entre deux moyennes de champs\n\"pick_max(average(bytes), average(memory))\"\n ", - "xpack.lens.formula.minFunction.markdown": "\nTrouve la valeur minimale entre deux nombres.\n\nExemple : Trouver le minimum entre deux moyennes de champs\n`pick_min(average(bytes), average(memory))`\n ", - "xpack.lens.formula.modFunction.markdown": "\nÉtablit le reste après division de la fonction par un nombre.\n\nExemple : calculer les trois derniers chiffres d'une valeur\n\"mod(sum(price), 1000)\"\n ", - "xpack.lens.formula.multiplyFunction.markdown": "\nMultiplie deux nombres.\nFonctionne également avec le symbole \"*\".\n\nExemple : calculer le prix après application du taux d'imposition courant\n`sum(bytes) * last_value(tax_rate)`\n\nExemple : calculer le prix après application du taux d'imposition constant\n\"multiply(sum(price), 1.2)\"\n ", - "xpack.lens.formula.powFunction.markdown": "\nÉlève la valeur à une puissance spécifique. Le deuxième argument est obligatoire.\n\nExemple : calculer le volume en fonction de la longueur du côté\n\"pow(last_value(length), 3)\"\n ", - "xpack.lens.formula.roundFunction.markdown": "\nArrondit à un nombre donné de décimales, 0 étant la valeur par défaut.\n\nExemples : arrondir au centième\n```\nround(sum(bytes))\nround(sum(bytes), 2)\n```\n ", - "xpack.lens.formula.sqrtFunction.markdown": "\nÉtablit la racine carrée d'une valeur positive uniquement.\n\nExemple : calculer la longueur du côté en fonction de la surface\n`sqrt(last_value(area))`\n ", - "xpack.lens.formula.squareFunction.markdown": "\nÉlève la valeur à la puissance 2.\n\nExemple : calculer l’aire en fonction de la longueur du côté\n`square(last_value(length))`\n ", - "xpack.lens.formula.subtractFunction.markdown": "\nSoustrait le premier nombre du deuxième.\nFonctionne également avec le symbole \"-\".\n\nExemple : calculer la plage d'un champ\n\"subtract(max(bytes), min(bytes))\"\n ", - "xpack.lens.formulaDocumentation.filterRatioDescription.markdown": "### Rapport de filtre :\n\nUtilisez \"kql=''\" pour filtrer un ensemble de documents et le comparer à d'autres documents du même regroupement.\nPar exemple, pour consulter l'évolution du taux d'erreur au fil du temps :\n\n```\ncount(kql='response.status_code > 400') / count()\n```\n ", - "xpack.lens.formulaDocumentation.percentOfTotalDescription.markdown": "### Pourcentage du total\n\nLes formules peuvent calculer \"overall_sum\" pour tous les regroupements,\nce qui permet de convertir chaque regroupement en un pourcentage du total :\n\n```\nsum(products.base_price) / overall_sum(sum(products.base_price))\n```\n ", - "xpack.lens.formulaDocumentation.recentChangeDescription.markdown": "### Modification récente\n\nUtilisez \"reducedTimeRange='30m'\" pour ajouter un filtre supplémentaire sur la plage temporelle d'un indicateur aligné avec la fin d'une plage temporelle globale. Vous pouvez l'utiliser pour calculer le degré de modification récente d'une valeur.\n\n```\nmax(system.network.in.bytes, reducedTimeRange=\"30m\")\n - min(system.network.in.bytes, reducedTimeRange=\"30m\")\n```\n ", - "xpack.lens.formulaDocumentation.weekOverWeekDescription.markdown": "### Semaine après semaine :\n\nUtilisez \"shift='1w'\" pour obtenir la valeur de chaque regroupement\nde la semaine précédente. Le décalage ne doit pas être utilisé avec la fonction *Valeurs les plus élevées*.\n\n```\npercentile(system.network.in.bytes, percentile=99) /\npercentile(system.network.in.bytes, percentile=99, shift='1w')\n```\n ", - "xpack.lens.indexPattern.cardinality.documentation.markdown": "\nCalcule le nombre de valeurs uniques d'un champ donné. Fonctionne pour les nombres, les chaînes, les dates et les valeurs booléennes.\n\nExemple : calculer le nombre de produits différents :\n`unique_count(product.name)`\n\nExemple : calculer le nombre de produits différents du groupe \"clothes\" :\n\"unique_count(product.name, kql='product.group=clothes')\"\n ", - "xpack.lens.indexPattern.count.documentation.markdown": "\nNombre total de documents. Lorsque vous fournissez un champ, le nombre total de valeurs de champ est compté. Lorsque vous utilisez la fonction de décompte pour les champs qui comportent plusieurs valeurs dans un même document, toutes les valeurs sont comptées.\n\n#### Exemples\n\nPour calculer le nombre total de documents, utilisez `count()`.\n\nPour calculer le nombre de produits, utilisez `count(products.id)`.\n\nPour calculer le nombre de documents qui correspondent à un filtre donné, utilisez `count(kql='price > 500')`.\n ", - "xpack.lens.indexPattern.counterRate.documentation.markdown": "\nCalcule le taux d'un compteur toujours croissant. Cette fonction renvoie uniquement des résultats utiles inhérents aux champs d'indicateurs de compteur qui contiennent une mesure quelconque à croissance régulière.\nSi la valeur diminue, elle est interprétée comme une mesure de réinitialisation de compteur. Pour obtenir des résultats plus précis, \"counter_rate\" doit être calculé d’après la valeur \"max\" du champ.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\nIl utilise l'intervalle en cours utilisé dans la formule.\n\nExemple : visualiser le taux d'octets reçus au fil du temps par un serveur Memcached :\n`counter_rate(max(memcached.stats.read.bytes))`\n ", - "xpack.lens.indexPattern.cumulativeSum.documentation.markdown": "\nCalcule la somme cumulée d'un indicateur au fil du temps, en ajoutant toutes les valeurs précédentes d'une série à chaque valeur. Pour utiliser cette fonction, vous devez également configurer une dimension de l'histogramme de dates.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\n\nExemple : visualiser les octets reçus cumulés au fil du temps :\n`cumulative_sum(sum(bytes))`\n ", - "xpack.lens.indexPattern.differences.documentation.markdown": "\nCalcule la différence par rapport à la dernière valeur d'un indicateur au fil du temps. Pour utiliser cette fonction, vous devez également configurer une dimension de l'histogramme de dates.\nLes données doivent être séquentielles pour les différences. Si vos données sont vides lorsque vous utilisez des différences, essayez d'augmenter l'intervalle de l'histogramme de dates.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\n\nExemple : visualiser la modification des octets reçus au fil du temps :\n`differences(sum(bytes))`\n ", - "xpack.lens.indexPattern.lastValue.documentation.markdown": "\nRenvoie la valeur d'un champ du dernier document, triée par le champ d'heure par défaut de la vue de données.\n\nCette fonction permet de récupérer le dernier état d'une entité.\n\nExemple : obtenir le statut actuel du serveur A :\n`last_value(server.status, kql='server.name=\"A\"')`\n ", - "xpack.lens.indexPattern.metric.documentation.markdown": "\nRenvoie l'indicateur {metric} d'un champ. Cette fonction fonctionne uniquement pour les champs numériques.\n\nExemple : obtenir l'indicateur {metric} d'un prix :\n\"{metric}(price)\"\n\nExemple : obtenir l'indicateur {metric} d'un prix pour des commandes du Royaume-Uni :\n\"{metric}(price, kql='location:UK')\"\n ", - "xpack.lens.indexPattern.movingAverage.documentation.markdown": "\nCalcule la moyenne mobile d'un indicateur au fil du temps, en prenant la moyenne des n dernières valeurs pour calculer la valeur actuelle. Pour utiliser cette fonction, vous devez également configurer une dimension de l'histogramme de dates.\nLa valeur de fenêtre par défaut est {defaultValue}.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\n\nPrend un paramètre nommé \"window\" qui spécifie le nombre de dernières valeurs à inclure dans le calcul de la moyenne de la valeur actuelle.\n\nExemple : lisser une ligne de mesures :\n`moving_average(sum(bytes), window=5)`\n ", - "xpack.lens.indexPattern.overall_average.documentation.markdown": "\nCalcule la moyenne d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, \"overall_average\" calcule la moyenne pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : écart par rapport à la moyenne :\n\"sum(bytes) - overall_average(sum(bytes))\"\n ", - "xpack.lens.indexPattern.overall_max.documentation.markdown": "\nCalcule la valeur maximale d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, \"overall_max\" calcule la valeur maximale pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : pourcentage de plage\n\"(sum(bytes) - overall_min(sum(bytes))) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))\"\n ", - "xpack.lens.indexPattern.overall_min.documentation.markdown": "\nCalcule la valeur minimale d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, \"overall_min\" calcule la valeur minimale pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : pourcentage de plage\n\"(sum(bytes) - overall_min(sum(bytes)) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))\"\n ", - "xpack.lens.indexPattern.overall_sum.documentation.markdown": "\nCalcule la somme d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, \"overall_sum\" calcule la somme pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : pourcentage de total\n\"sum(bytes) / overall_sum(sum(bytes))\"\n ", - "xpack.lens.indexPattern.percentile.documentation.markdown": "\nRenvoie le centile spécifié des valeurs d'un champ. Il s'agit de la valeur de n pour cent des valeurs présentes dans les documents.\n\nExemple : obtenir le nombre d'octets supérieurs à 95 % des valeurs :\n`percentile(bytes, percentile=95)`\n ", - "xpack.lens.indexPattern.percentileRanks.documentation.markdown": "\nRetourne le pourcentage de valeurs qui sont en dessous d'une certaine valeur. Par exemple, si une valeur est supérieure à 95 % des valeurs observées, elle est placée au 95e rang centile.\n\nExemple : Obtenir le pourcentage de valeurs qui sont en dessous de 100 :\n\"percentile_rank(bytes, value=100)\"\n ", - "xpack.lens.indexPattern.standardDeviation.documentation.markdown": "\nRetourne la taille de la variation ou de la dispersion du champ. Cette fonction ne s’applique qu’aux champs numériques.\n\n#### Exemples\n\nPour obtenir l'écart type d'un prix, utilisez standard_deviation(price).\n\nPour obtenir la variance du prix des commandes passées au Royaume-Uni, utilisez `square(standard_deviation(price, kql='location:UK'))`.\n ", - "xpack.lens.indexPattern.time_scale.documentation.markdown": "\n\nCette fonction avancée est utile pour normaliser les comptes et les sommes sur un intervalle de temps spécifique. Elle permet l'intégration avec les indicateurs qui sont stockés déjà normalisés sur un intervalle de temps spécifique.\n\nVous pouvez faire appel à cette fonction uniquement si une fonction d'histogramme des dates est utilisée dans le graphique actuel.\n\nExemple : Un rapport comparant un indicateur déjà normalisé à un autre indicateur devant être normalisé.\n\"normalize_by_unit(counter_rate(max(system.diskio.write.bytes)), unit='s') / last_value(apache.status.bytes_per_second)\"\n ", + "lensFormulaDocs.tinymath.absFunction.markdown": "\nCalcule une valeur absolue. Une valeur négative est multipliée par -1, une valeur positive reste identique.\n\nExemple : calculer la distance moyenne par rapport au niveau de la mer \"abs(average(altitude))\"\n ", + "lensFormulaDocs.tinymath.addFunction.markdown": "\nAjoute jusqu'à deux nombres.\nFonctionne également avec le symbole \"+\".\n\nExemple : calculer la somme de deux champs\n\n\"sum(price) + sum(tax)\"\n\nExemple : compenser le compte par une valeur statique\n\n\"add(count(), 5)\"\n ", + "lensFormulaDocs.tinymath.cbrtFunction.markdown": "\nÉtablit la racine carrée de la valeur.\n\nExemple : calculer la longueur du côté à partir du volume\n`cbrt(last_value(volume))`\n ", + "lensFormulaDocs.tinymath.ceilFunction.markdown": "\nArrondit le plafond de la valeur au chiffre supérieur.\n\nExemple : arrondir le prix au dollar supérieur\n`ceil(sum(price))`\n ", + "lensFormulaDocs.tinymath.clampFunction.markdown": "\nÉtablit une limite minimale et maximale pour la valeur.\n\nExemple : s'assurer de repérer les valeurs aberrantes\n```\nclamp(\n average(bytes),\n percentile(bytes, percentile=5),\n percentile(bytes, percentile=95)\n)\n```\n", + "lensFormulaDocs.tinymath.cubeFunction.markdown": "\nCalcule le cube d'un nombre.\n\nExemple : calculer le volume à partir de la longueur du côté\n`cube(last_value(length))`\n ", + "lensFormulaDocs.tinymath.defaultFunction.markdown": "\nRetourne une valeur numérique par défaut lorsque la valeur est nulle.\n\nExemple : Retourne -1 lorsqu'un champ ne contient aucune donnée.\n\"defaults(average(bytes), -1)\"\n", + "lensFormulaDocs.tinymath.divideFunction.markdown": "\nDivise le premier nombre par le deuxième.\nFonctionne également avec le symbole \"/\".\n\nExemple : calculer la marge bénéficiaire\n\"sum(profit) / sum(revenue)\"\n\nExemple : \"divide(sum(bytes), 2)\"\n ", + "lensFormulaDocs.tinymath.eqFunction.markdown": "\nEffectue une comparaison d'égalité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \"==\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est égale à la quantité de mémoire moyenne.\n\"average(bytes) == average(memory)\"\n\nExemple : \"eq(sum(bytes), 1000000)\"\n ", + "lensFormulaDocs.tinymath.expFunction.markdown": "\nÉlève *e* à la puissance n.\n\nExemple : calculer la fonction exponentielle naturelle\n\n`exp(last_value(duration))`\n ", + "lensFormulaDocs.tinymath.fixFunction.markdown": "\nPour les valeurs positives, part du bas. Pour les valeurs négatives, part du haut.\n\nExemple : arrondir à zéro\n\"fix(sum(profit))\"\n ", + "lensFormulaDocs.tinymath.floorFunction.markdown": "\nArrondit à la valeur entière inférieure la plus proche.\n\nExemple : arrondir un prix au chiffre inférieur\n\"floor(sum(price))\"\n ", + "lensFormulaDocs.tinymath.gteFunction.markdown": "\nEffectue une comparaison de supériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \">=\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est supérieure ou égale à la quantité moyenne de mémoire.\n\"average(bytes) >= average(memory)\"\n\nExemple : \"gte(average(bytes), 1000)\"\n ", + "lensFormulaDocs.tinymath.gtFunction.markdown": "\nEffectue une comparaison de supériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \">\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est supérieure à la quantité moyenne de mémoire.\n\"average(bytes) > average(memory)\"\n\nExemple : \"gt(average(bytes), 1000)\"\n ", + "lensFormulaDocs.tinymath.ifElseFunction.markdown": "\nRetourne une valeur selon si l'élément de condition est \"true\" ou \"false\".\n\nExemple : Revenus moyens par client, mais dans certains cas, l'ID du client n'est pas fourni, et le client est alors compté comme client supplémentaire.\n`sum(total)/(unique_count(customer_id) + ifelse( count() > count(kql='customer_id:*'), 1, 0))`\n ", + "lensFormulaDocs.tinymath.logFunction.markdown": "\nÉtablit un logarithme avec base optionnelle. La base naturelle *e* est utilisée par défaut.\n\nExemple : calculer le nombre de bits nécessaire au stockage de valeurs\n```\nlog(sum(bytes))\nlog(sum(bytes), 2)\n```\n ", + "lensFormulaDocs.tinymath.lteFunction.markdown": "\nEffectue une comparaison d'infériorité ou de supériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \"<=\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est inférieure ou égale à la quantité moyenne de mémoire.\n\"average(bytes) <= average(memory)\"\n\nExemple : \"lte(average(bytes), 1000)\"\n ", + "lensFormulaDocs.tinymath.ltFunction.markdown": "\nEffectue une comparaison d'infériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \"<\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est inférieure à la quantité moyenne de mémoire.\n\"average(bytes) <= average(memory)\"\n\nExemple : \"lt(average(bytes), 1000)\"\n ", + "lensFormulaDocs.tinymath.maxFunction.markdown": "\nTrouve la valeur maximale entre deux nombres.\n\nExemple : Trouver le maximum entre deux moyennes de champs\n\"pick_max(average(bytes), average(memory))\"\n ", + "lensFormulaDocs.tinymath.minFunction.markdown": "\nTrouve la valeur minimale entre deux nombres.\n\nExemple : Trouver le minimum entre deux moyennes de champs\n`pick_min(average(bytes), average(memory))`\n ", + "lensFormulaDocs.tinymath.modFunction.markdown": "\nÉtablit le reste après division de la fonction par un nombre.\n\nExemple : calculer les trois derniers chiffres d'une valeur\n\"mod(sum(price), 1000)\"\n ", + "lensFormulaDocs.tinymath.multiplyFunction.markdown": "\nMultiplie deux nombres.\nFonctionne également avec le symbole \"*\".\n\nExemple : calculer le prix après application du taux d'imposition courant\n`sum(bytes) * last_value(tax_rate)`\n\nExemple : calculer le prix après application du taux d'imposition constant\n\"multiply(sum(price), 1.2)\"\n ", + "lensFormulaDocs.tinymath.powFunction.markdown": "\nÉlève la valeur à une puissance spécifique. Le deuxième argument est obligatoire.\n\nExemple : calculer le volume en fonction de la longueur du côté\n\"pow(last_value(length), 3)\"\n ", + "lensFormulaDocs.tinymath.roundFunction.markdown": "\nArrondit à un nombre donné de décimales, 0 étant la valeur par défaut.\n\nExemples : arrondir au centième\n```\nround(sum(bytes))\nround(sum(bytes), 2)\n```\n ", + "lensFormulaDocs.tinymath.sqrtFunction.markdown": "\nÉtablit la racine carrée d'une valeur positive uniquement.\n\nExemple : calculer la longueur du côté en fonction de la surface\n`sqrt(last_value(area))`\n ", + "lensFormulaDocs.tinymath.squareFunction.markdown": "\nÉlève la valeur à la puissance 2.\n\nExemple : calculer l’aire en fonction de la longueur du côté\n`square(last_value(length))`\n ", + "lensFormulaDocs.tinymath.subtractFunction.markdown": "\nSoustrait le premier nombre du deuxième.\nFonctionne également avec le symbole \"-\".\n\nExemple : calculer la plage d'un champ\n\"subtract(max(bytes), min(bytes))\"\n ", + "lensFormulaDocs.documentation.filterRatioDescription.markdown": "### Rapport de filtre :\n\nUtilisez \"kql=''\" pour filtrer un ensemble de documents et le comparer à d'autres documents du même regroupement.\nPar exemple, pour consulter l'évolution du taux d'erreur au fil du temps :\n\n```\ncount(kql='response.status_code > 400') / count()\n```\n ", + "lensFormulaDocs.documentation.percentOfTotalDescription.markdown": "### Pourcentage du total\n\nLes formules peuvent calculer \"overall_sum\" pour tous les regroupements,\nce qui permet de convertir chaque regroupement en un pourcentage du total :\n\n```\nsum(products.base_price) / overall_sum(sum(products.base_price))\n```\n ", + "lensFormulaDocs.documentation.recentChangeDescription.markdown": "### Modification récente\n\nUtilisez \"reducedTimeRange='30m'\" pour ajouter un filtre supplémentaire sur la plage temporelle d'un indicateur aligné avec la fin d'une plage temporelle globale. Vous pouvez l'utiliser pour calculer le degré de modification récente d'une valeur.\n\n```\nmax(system.network.in.bytes, reducedTimeRange=\"30m\")\n - min(system.network.in.bytes, reducedTimeRange=\"30m\")\n```\n ", + "lensFormulaDocs.documentation.weekOverWeekDescription.markdown": "### Semaine après semaine :\n\nUtilisez \"shift='1w'\" pour obtenir la valeur de chaque regroupement\nde la semaine précédente. Le décalage ne doit pas être utilisé avec la fonction *Valeurs les plus élevées*.\n\n```\npercentile(system.network.in.bytes, percentile=99) /\npercentile(system.network.in.bytes, percentile=99, shift='1w')\n```\n ", + "lensFormulaDocs.cardinality.documentation.markdown": "\nCalcule le nombre de valeurs uniques d'un champ donné. Fonctionne pour les nombres, les chaînes, les dates et les valeurs booléennes.\n\nExemple : calculer le nombre de produits différents :\n`unique_count(product.name)`\n\nExemple : calculer le nombre de produits différents du groupe \"clothes\" :\n\"unique_count(product.name, kql='product.group=clothes')\"\n ", + "lensFormulaDocs.count.documentation.markdown": "\nNombre total de documents. Lorsque vous fournissez un champ, le nombre total de valeurs de champ est compté. Lorsque vous utilisez la fonction de décompte pour les champs qui comportent plusieurs valeurs dans un même document, toutes les valeurs sont comptées.\n\n#### Exemples\n\nPour calculer le nombre total de documents, utilisez `count()`.\n\nPour calculer le nombre de produits, utilisez `count(products.id)`.\n\nPour calculer le nombre de documents qui correspondent à un filtre donné, utilisez `count(kql='price > 500')`.\n ", + "lensFormulaDocs.counterRate.documentation.markdown": "\nCalcule le taux d'un compteur toujours croissant. Cette fonction renvoie uniquement des résultats utiles inhérents aux champs d'indicateurs de compteur qui contiennent une mesure quelconque à croissance régulière.\nSi la valeur diminue, elle est interprétée comme une mesure de réinitialisation de compteur. Pour obtenir des résultats plus précis, \"counter_rate\" doit être calculé d’après la valeur \"max\" du champ.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\nIl utilise l'intervalle en cours utilisé dans la formule.\n\nExemple : visualiser le taux d'octets reçus au fil du temps par un serveur Memcached :\n`counter_rate(max(memcached.stats.read.bytes))`\n ", + "lensFormulaDocs.cumulativeSum.documentation.markdown": "\nCalcule la somme cumulée d'un indicateur au fil du temps, en ajoutant toutes les valeurs précédentes d'une série à chaque valeur. Pour utiliser cette fonction, vous devez également configurer une dimension de l'histogramme de dates.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\n\nExemple : visualiser les octets reçus cumulés au fil du temps :\n`cumulative_sum(sum(bytes))`\n ", + "lensFormulaDocs.differences.documentation.markdown": "\nCalcule la différence par rapport à la dernière valeur d'un indicateur au fil du temps. Pour utiliser cette fonction, vous devez également configurer une dimension de l'histogramme de dates.\nLes données doivent être séquentielles pour les différences. Si vos données sont vides lorsque vous utilisez des différences, essayez d'augmenter l'intervalle de l'histogramme de dates.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\n\nExemple : visualiser la modification des octets reçus au fil du temps :\n`differences(sum(bytes))`\n ", + "lensFormulaDocs.lastValue.documentation.markdown": "\nRenvoie la valeur d'un champ du dernier document, triée par le champ d'heure par défaut de la vue de données.\n\nCette fonction permet de récupérer le dernier état d'une entité.\n\nExemple : obtenir le statut actuel du serveur A :\n`last_value(server.status, kql='server.name=\"A\"')`\n ", + "lensFormulaDocs.metric.documentation.markdown": "\nRenvoie l'indicateur {metric} d'un champ. Cette fonction fonctionne uniquement pour les champs numériques.\n\nExemple : obtenir l'indicateur {metric} d'un prix :\n\"{metric}(price)\"\n\nExemple : obtenir l'indicateur {metric} d'un prix pour des commandes du Royaume-Uni :\n\"{metric}(price, kql='location:UK')\"\n ", + "lensFormulaDocs.movingAverage.documentation.markdown": "\nCalcule la moyenne mobile d'un indicateur au fil du temps, en prenant la moyenne des n dernières valeurs pour calculer la valeur actuelle. Pour utiliser cette fonction, vous devez également configurer une dimension de l'histogramme de dates.\nLa valeur de fenêtre par défaut est {defaultValue}.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\n\nPrend un paramètre nommé \"window\" qui spécifie le nombre de dernières valeurs à inclure dans le calcul de la moyenne de la valeur actuelle.\n\nExemple : lisser une ligne de mesures :\n`moving_average(sum(bytes), window=5)`\n ", + "lensFormulaDocs.overall_average.documentation.markdown": "\nCalcule la moyenne d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, \"overall_average\" calcule la moyenne pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : écart par rapport à la moyenne :\n\"sum(bytes) - overall_average(sum(bytes))\"\n ", + "lensFormulaDocs.overall_max.documentation.markdown": "\nCalcule la valeur maximale d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, \"overall_max\" calcule la valeur maximale pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : pourcentage de plage\n\"(sum(bytes) - overall_min(sum(bytes))) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))\"\n ", + "lensFormulaDocs.overall_min.documentation.markdown": "\nCalcule la valeur minimale d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, \"overall_min\" calcule la valeur minimale pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : pourcentage de plage\n\"(sum(bytes) - overall_min(sum(bytes)) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))\"\n ", + "lensFormulaDocs.overall_sum.documentation.markdown": "\nCalcule la somme d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, \"overall_sum\" calcule la somme pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : pourcentage de total\n\"sum(bytes) / overall_sum(sum(bytes))\"\n ", + "lensFormulaDocs.percentile.documentation.markdown": "\nRenvoie le centile spécifié des valeurs d'un champ. Il s'agit de la valeur de n pour cent des valeurs présentes dans les documents.\n\nExemple : obtenir le nombre d'octets supérieurs à 95 % des valeurs :\n`percentile(bytes, percentile=95)`\n ", + "lensFormulaDocs.percentileRanks.documentation.markdown": "\nRetourne le pourcentage de valeurs qui sont en dessous d'une certaine valeur. Par exemple, si une valeur est supérieure à 95 % des valeurs observées, elle est placée au 95e rang centile.\n\nExemple : Obtenir le pourcentage de valeurs qui sont en dessous de 100 :\n\"percentile_rank(bytes, value=100)\"\n ", + "lensFormulaDocs.standardDeviation.documentation.markdown": "\nRetourne la taille de la variation ou de la dispersion du champ. Cette fonction ne s’applique qu’aux champs numériques.\n\n#### Exemples\n\nPour obtenir l'écart type d'un prix, utilisez standard_deviation(price).\n\nPour obtenir la variance du prix des commandes passées au Royaume-Uni, utilisez `square(standard_deviation(price, kql='location:UK'))`.\n ", + "lensFormulaDocs.time_scale.documentation.markdown": "\n\nCette fonction avancée est utile pour normaliser les comptes et les sommes sur un intervalle de temps spécifique. Elle permet l'intégration avec les indicateurs qui sont stockés déjà normalisés sur un intervalle de temps spécifique.\n\nVous pouvez faire appel à cette fonction uniquement si une fonction d'histogramme des dates est utilisée dans le graphique actuel.\n\nExemple : Un rapport comparant un indicateur déjà normalisé à un autre indicateur devant être normalisé.\n\"normalize_by_unit(counter_rate(max(system.diskio.write.bytes)), unit='s') / last_value(apache.status.bytes_per_second)\"\n ", "xpack.lens.AggBasedLabel": "visualisation basée sur l'agrégation", "xpack.lens.app.addToLibrary": "Enregistrer dans la bibliothèque", "xpack.lens.app.cancel": "Annuler", @@ -22149,11 +22149,11 @@ "xpack.lens.fittingFunctionsTitle.lookahead": "Suivant", "xpack.lens.fittingFunctionsTitle.none": "Masquer", "xpack.lens.fittingFunctionsTitle.zero": "Zéro", - "xpack.lens.formula.base": "base", - "xpack.lens.formula.boolean": "booléen", - "xpack.lens.formula.condition": "condition", - "xpack.lens.formula.decimals": "décimales", - "xpack.lens.formula.defaultValue": "par défaut", + "lensFormulaDocs.tinymath.base": "base", + "lensFormulaDocs.boolean": "booléen", + "lensFormulaDocs.tinymath.condition": "condition", + "lensFormulaDocs.tinymath.decimals": "décimales", + "lensFormulaDocs.tinymath.defaultValue": "par défaut", "xpack.lens.formula.disableWordWrapLabel": "Désactiver le renvoi à la ligne des mots", "xpack.lens.formula.editorHelpInlineHideLabel": "Masquer la référence des fonctions", "xpack.lens.formula.editorHelpInlineHideToolTip": "Masquer la référence des fonctions", @@ -22161,35 +22161,35 @@ "xpack.lens.formula.fullScreenEnterLabel": "Développer", "xpack.lens.formula.fullScreenExitLabel": "Réduire", "xpack.lens.formula.kqlExtraArguments": "[kql]?: string, [lucene]?: string", - "xpack.lens.formula.left": "gauche", - "xpack.lens.formula.max": "max", - "xpack.lens.formula.min": "min", - "xpack.lens.formula.number": "numéro", + "lensFormulaDocs.tinymath.left": "gauche", + "lensFormulaDocs.tinymath.max": "max", + "lensFormulaDocs.tinymath.min": "min", + "lensFormulaDocs.number": "numéro", "xpack.lens.formula.reducedTimeRangeExtraArguments": "[reducedTimeRange]?: string", "xpack.lens.formula.requiredArgument": "Obligatoire", - "xpack.lens.formula.right": "droite", + "lensFormulaDocs.tinymath.right": "droite", "xpack.lens.formula.shiftExtraArguments": "[shift]?: string", - "xpack.lens.formula.string": "chaîne", - "xpack.lens.formula.value": "valeur", - "xpack.lens.formulaCommonFormulaDocumentation": "Les formules les plus courantes divisent deux valeurs pour produire un pourcentage. Pour obtenir un affichage correct, définissez \"Format de valeur\" sur \"pourcent\".", - "xpack.lens.formulaDocumentation.columnCalculationSection": "Calculs de colonnes", - "xpack.lens.formulaDocumentation.columnCalculationSectionDescription": "Ces fonctions sont exécutées pour chaque ligne, mais elles sont fournies avec la colonne entière comme contexte. Elles sont également appelées fonctions de fenêtre.", - "xpack.lens.formulaDocumentation.comparisonSection": "Comparaison", - "xpack.lens.formulaDocumentation.comparisonSectionDescription": "Ces fonctions sont utilisées pour effectuer une comparaison de valeurs.", - "xpack.lens.formulaDocumentation.constantsSection": "Contexte Kibana", - "xpack.lens.formulaDocumentation.constantsSectionDescription": "Ces fonctions sont utilisées pour récupérer des variables de contexte Kibana, c’est-à-dire l’histogramme de date \"interval\", le \"now\" actuel et le \"time_range\" sélectionné, et pour vous aider à faire des opérations mathématiques de dates.", - "xpack.lens.formulaDocumentation.elasticsearchSection": "Elasticsearch", - "xpack.lens.formulaDocumentation.elasticsearchSectionDescription": "Ces fonctions seront exécutées sur les documents bruts pour chaque ligne du tableau résultant, en agrégeant tous les documents correspondant aux dimensions de répartition en une seule valeur.", - "xpack.lens.formulaDocumentation.filterRatio": "Rapport de filtre", - "xpack.lens.formulaDocumentation.mathSection": "Mathématique", - "xpack.lens.formulaDocumentation.mathSectionDescription": "Ces fonctions seront exécutées pour chaque ligne du tableau résultant en utilisant des valeurs uniques de la même ligne calculées à l'aide d'autres fonctions.", - "xpack.lens.formulaDocumentation.percentOfTotal": "Pourcentage du total", - "xpack.lens.formulaDocumentation.recentChange": "Modification récente", - "xpack.lens.formulaDocumentation.weekOverWeek": "Semaine après semaine", + "lensFormulaDocs.string": "chaîne", + "lensFormulaDocs.tinymath.value": "valeur", + "lensFormulaDocs.CommonFormulaDocumentation": "Les formules les plus courantes divisent deux valeurs pour produire un pourcentage. Pour obtenir un affichage correct, définissez \"Format de valeur\" sur \"pourcent\".", + "lensFormulaDocs.documentation.columnCalculationSection": "Calculs de colonnes", + "lensFormulaDocs.documentation.columnCalculationSectionDescription": "Ces fonctions sont exécutées pour chaque ligne, mais elles sont fournies avec la colonne entière comme contexte. Elles sont également appelées fonctions de fenêtre.", + "lensFormulaDocs.documentation.comparisonSection": "Comparaison", + "lensFormulaDocs.documentation.comparisonSectionDescription": "Ces fonctions sont utilisées pour effectuer une comparaison de valeurs.", + "lensFormulaDocs.documentation.constantsSection": "Contexte Kibana", + "lensFormulaDocs.documentation.constantsSectionDescription": "Ces fonctions sont utilisées pour récupérer des variables de contexte Kibana, c’est-à-dire l’histogramme de date \"interval\", le \"now\" actuel et le \"time_range\" sélectionné, et pour vous aider à faire des opérations mathématiques de dates.", + "lensFormulaDocs.documentation.elasticsearchSection": "Elasticsearch", + "lensFormulaDocs.documentation.elasticsearchSectionDescription": "Ces fonctions seront exécutées sur les documents bruts pour chaque ligne du tableau résultant, en agrégeant tous les documents correspondant aux dimensions de répartition en une seule valeur.", + "lensFormulaDocs.documentation.filterRatio": "Rapport de filtre", + "lensFormulaDocs.documentation.mathSection": "Mathématique", + "lensFormulaDocs.documentation.mathSectionDescription": "Ces fonctions seront exécutées pour chaque ligne du tableau résultant en utilisant des valeurs uniques de la même ligne calculées à l'aide d'autres fonctions.", + "lensFormulaDocs.documentation.percentOfTotal": "Pourcentage du total", + "lensFormulaDocs.documentation.recentChange": "Modification récente", + "lensFormulaDocs.documentation.weekOverWeek": "Semaine après semaine", "xpack.lens.formulaDocumentationHeading": "Fonctionnement", "xpack.lens.formulaEnableWordWrapLabel": "Activer le renvoi à la ligne des mots", "xpack.lens.formulaExampleMarkdown": "Exemples", - "xpack.lens.formulaFrequentlyUsedHeading": "Formules courantes", + "lensFormulaDocs.frequentlyUsedHeading": "Formules courantes", "xpack.lens.formulaPlaceholderText": "Saisissez une formule en combinant des fonctions avec la fonction mathématique, telle que :", "xpack.lens.fullExtent.niceValues": "Arrondir aux valeurs de \"gentillesse\"", "xpack.lens.functions.collapse.args.byHelpText": "Colonnes selon lesquelles effectuer le regroupement - ces colonnes sont conservées telles quelles", @@ -22248,29 +22248,29 @@ "xpack.lens.indexPattern.allFieldsLabelHelp": "Glissez-déposez les champs disponibles dans l’espace de travail et créez des visualisations. Pour modifier les champs disponibles, sélectionnez une vue de données différente, modifiez vos requêtes ou utilisez une plage temporelle différente. Certains types de champ ne peuvent pas être visualisés dans Lens, y compris les champ de texte intégral et champs géographiques.", "xpack.lens.indexPattern.ascendingCountPrecisionErrorWarning.link": "veuillez consulter la documentation", "xpack.lens.indexPattern.availableFieldsLabel": "Champs disponibles", - "xpack.lens.indexPattern.avg": "Moyenne", + "lensFormulaDocs.avg": "Moyenne", "xpack.lens.indexPattern.avg.description": "Agrégation d'indicateurs à valeur unique qui calcule la moyenne des valeurs numériques extraites des documents agrégés", "xpack.lens.indexPattern.avg.quickFunctionDescription": "Valeur moyenne d'un ensemble de champs de nombres.", "xpack.lens.indexPattern.bitsFormatLabel": "Bits (1000)", "xpack.lens.indexPattern.bytesFormatLabel": "Octets (1024)", - "xpack.lens.indexPattern.cardinality": "Compte unique", + "lensFormulaDocs.cardinality": "Compte unique", "xpack.lens.indexPattern.cardinality.documentation.quick": "\nNombre de valeurs uniques pour un champ spécifié de nombre, de chaîne, de date ou booléen.\n ", - "xpack.lens.indexPattern.cardinality.signature": "champ : chaîne", + "lensFormulaDocs.cardinality.signature": "champ : chaîne", "xpack.lens.indexPattern.changeDataViewTitle": "Vue de données", "xpack.lens.indexPattern.chooseField": "Champ", "xpack.lens.indexPattern.chooseFieldLabel": "Pour utiliser cette fonction, sélectionnez un champ.", "xpack.lens.indexPattern.chooseSubFunction": "Choisir une sous-fonction", "xpack.lens.indexPattern.columnFormatLabel": "Format de valeur", "xpack.lens.indexPattern.compactLabel": "Valeurs compactes", - "xpack.lens.indexPattern.count": "Décompte", + "lensFormulaDocs.count": "Décompte", "xpack.lens.indexPattern.count.documentation.quick": "\nNombre total de documents. Lorsque vous fournissez un champ, le nombre total de valeurs de champ est compté. Lorsque vous utilisez la fonction de décompte pour les champs qui comportent plusieurs valeurs dans un même document, toutes les valeurs sont comptées.\n ", - "xpack.lens.indexPattern.count.signature": "[champ : chaîne]", + "lensFormulaDocs.count.signature": "[champ : chaîne]", "xpack.lens.indexPattern.counterRate": "Taux de compteur", "xpack.lens.indexPattern.counterRate.documentation.quick": "\n Taux de modification sur la durée d'un indicateur de série temporelle qui augmente sans cesse.\n ", - "xpack.lens.indexPattern.counterRate.signature": "indicateur : nombre", + "lensFormulaDocs.counterRate.signature": "indicateur : nombre", "xpack.lens.indexPattern.countOf": "Nombre d'enregistrements", - "xpack.lens.indexPattern.cumulative_sum.signature": "indicateur : nombre", - "xpack.lens.indexPattern.cumulativeSum": "Somme cumulée", + "lensFormulaDocs.cumulative_sum.signature": "indicateur : nombre", + "lensFormulaDocs.cumulativeSum": "Somme cumulée", "xpack.lens.indexPattern.cumulativeSum.documentation.quick": "\n Somme de toutes les valeurs au fur et à mesure de leur croissance.\n ", "xpack.lens.indexPattern.custom.externalDoc": "Syntaxe de format numérique", "xpack.lens.indexPattern.custom.patternLabel": "Format", @@ -22300,9 +22300,9 @@ "xpack.lens.indexPattern.dateRange.noTimeRange": "L’intervalle de plage temporelle actuel n’est pas disponible", "xpack.lens.indexPattern.decimalPlacesLabel": "Décimales", "xpack.lens.indexPattern.defaultFormatLabel": "Par défaut", - "xpack.lens.indexPattern.derivative": "Différences", + "lensFormulaDocs.derivative": "Différences", "xpack.lens.indexPattern.differences.documentation.quick": "\n Variation entre les valeurs des intervalles suivants.\n ", - "xpack.lens.indexPattern.differences.signature": "indicateur : nombre", + "lensFormulaDocs.differences.signature": "indicateur : nombre", "xpack.lens.indexPattern.dimensionEditor.headingAppearance": "Apparence", "xpack.lens.indexPattern.dimensionEditor.headingData": "Données", "xpack.lens.indexPattern.dimensionEditor.headingFormula": "Formule", @@ -22355,30 +22355,30 @@ "xpack.lens.indexPattern.invalidOperationLabel": "Ce champ ne fonctionne pas avec la fonction sélectionnée.", "xpack.lens.indexPattern.invalidReducedTimeRange": "Plage temporelle réduite non valide. Entrez un entier positif suivi par l'une des unités suivantes : s, m, h, d, w, M, y. Par exemple, 3h pour 3 heures", "xpack.lens.indexPattern.invalidTimeShift": "Décalage non valide. Entrez un entier positif suivi par l'une des unités suivantes : s, m, h, d, w, M, y. Par exemple, 3h pour 3 heures", - "xpack.lens.indexPattern.lastValue": "Dernière valeur", + "lensFormulaDocs.lastValue": "Dernière valeur", "xpack.lens.indexPattern.lastValue.disabled": "Cette fonction requiert la présence d'un champ de date dans la vue de données.", "xpack.lens.indexPattern.lastValue.documentation.quick": "\nValeur d'un champ du dernier document, triée par le champ d'heure par défaut de la vue de données.\n ", "xpack.lens.indexPattern.lastValue.showArrayValues": "Afficher les valeurs de tableau", "xpack.lens.indexPattern.lastValue.showArrayValuesExplanation": "Affiche toutes les valeurs associées à ce champ dans chaque dernier document.", "xpack.lens.indexPattern.lastValue.showArrayValuesWithTopValuesWarning": "Lorsque vous affichez les valeurs de tableau, vous ne pouvez pas utiliser ce champ pour classer les valeurs les plus élevées.", - "xpack.lens.indexPattern.lastValue.signature": "champ : chaîne", + "lensFormulaDocs.lastValue.signature": "champ : chaîne", "xpack.lens.indexPattern.lastValue.sortField": "Trier par le champ de date", "xpack.lens.indexPattern.lastValue.sortFieldPlaceholder": "Champ de tri", - "xpack.lens.indexPattern.max": "Maximum", + "lensFormulaDocs.max": "Maximum", "xpack.lens.indexPattern.max.description": "Agrégation d'indicateurs à valeur unique qui renvoie la valeur maximale des valeurs numériques extraites des documents agrégés.", "xpack.lens.indexPattern.max.quickFunctionDescription": "Valeur maximale d'un champ de nombre.", - "xpack.lens.indexPattern.median": "Médiane", + "lensFormulaDocs.median": "Médiane", "xpack.lens.indexPattern.median.description": "Agrégation d'indicateurs à valeur unique qui calcule la valeur médiane des valeurs numériques extraites des documents agrégés.", "xpack.lens.indexPattern.median.quickFunctionDescription": "Valeur médiane d'un champ de nombre.", "xpack.lens.indexPattern.metaFieldsLabel": "Champs méta", - "xpack.lens.indexPattern.metric.signature": "champ : chaîne", - "xpack.lens.indexPattern.min": "Minimum", + "lensFormulaDocs.metric.signature": "champ : chaîne", + "lensFormulaDocs.min": "Minimum", "xpack.lens.indexPattern.min.description": "Agrégation d'indicateurs à valeur unique qui renvoie la valeur minimale des valeurs numériques extraites des documents agrégés.", "xpack.lens.indexPattern.min.quickFunctionDescription": "Valeur minimale d'un champ de nombre.", "xpack.lens.indexPattern.missingFieldLabel": "Champ manquant", "xpack.lens.indexPattern.moveToWorkspaceNotAvailable": "Pour visualiser ce champ, veuillez l'ajouter directement au calque souhaité. L'ajout de ce champ à l'espace de travail n'est pas pris en charge avec votre configuration actuelle.", - "xpack.lens.indexPattern.moving_average.signature": "indicateur : nombre, [window] : nombre", - "xpack.lens.indexPattern.movingAverage": "Moyenne mobile", + "lensFormulaDocs.moving_average.signature": "indicateur : nombre, [window] : nombre", + "lensFormulaDocs.movingAverage": "Moyenne mobile", "xpack.lens.indexPattern.movingAverage.basicExplanation": "La moyenne mobile fait glisser une fenêtre sur les données et affiche la valeur moyenne. La moyenne mobile est prise en charge uniquement par les histogrammes des dates.", "xpack.lens.indexPattern.movingAverage.documentation.quick": "\n Moyenne d'une fenêtre mobile de valeurs sur la durée.\n ", "xpack.lens.indexPattern.movingAverage.limitations": "La première valeur de moyenne mobile commence au deuxième élément.", @@ -22394,20 +22394,20 @@ "xpack.lens.indexPattern.noRealMetricError": "Un calque uniquement doté de valeurs statiques n’affichera pas de résultats ; utilisez au moins un indicateur dynamique.", "xpack.lens.indexPattern.notAbsoluteTimeShift": "Décalage non valide.", "xpack.lens.indexPattern.numberFormatLabel": "Nombre", - "xpack.lens.indexPattern.overall_metric": "indicateur : nombre", - "xpack.lens.indexPattern.overallMax": "Max général", - "xpack.lens.indexPattern.overallMin": "Min général", - "xpack.lens.indexPattern.overallSum": "Somme générale", + "lensFormulaDocs.overall_metric": "indicateur : nombre", + "lensFormulaDocs.overallMax": "Max général", + "lensFormulaDocs.overallMin": "Min général", + "lensFormulaDocs.overallSum": "Somme générale", "xpack.lens.indexPattern.percentFormatLabel": "Pourcent", - "xpack.lens.indexPattern.percentile": "Centile", + "lensFormulaDocs.percentile": "Centile", "xpack.lens.indexPattern.percentile.documentation.quick": "\n La plus grande valeur qui est inférieure à n pour cent des valeurs présentes dans tous les documents.\n ", "xpack.lens.indexPattern.percentile.percentileRanksValue": "Valeur des rangs centiles", "xpack.lens.indexPattern.percentile.percentileValue": "Centile", - "xpack.lens.indexPattern.percentile.signature": "champ : chaîne, [percentile] : nombre", - "xpack.lens.indexPattern.percentileRank": "Rang centile", + "lensFormulaDocs.percentile.signature": "champ : chaîne, [percentile] : nombre", + "lensFormulaDocs.percentileRank": "Rang centile", "xpack.lens.indexPattern.percentileRanks.documentation.quick": "\nPourcentage des valeurs inférieures à une valeur spécifique. Par exemple, lorsqu'une valeur est supérieure ou égale à 95 % des valeurs calculées, elle est placée au 95e rang centile.\n ", "xpack.lens.indexPattern.percentileRanks.errorMessage": "La valeur des rangs centiles doit être un nombre", - "xpack.lens.indexPattern.percentileRanks.signature": "champ : chaîne, [valeur] : nombre", + "lensFormulaDocs.percentileRanks.signature": "champ : chaîne, [valeur] : nombre", "xpack.lens.indexPattern.precisionErrorWarning.accuracyDisabled.shortMessage": "Il peut s'agit d'une approximation. Pour obtenir des résultats plus fins, vous pouvez activer le mode de précision, mais ce mode augmente la charge sur le cluster Elasticsearch.", "xpack.lens.indexPattern.precisionErrorWarning.accuracyEnabled.shortMessage": "Il peut s'agit d'une approximation. Pour obtenir des résultats plus fins, utilisez les filtres ou augmentez le nombre défini pour Valeurs les plus élevées.", "xpack.lens.indexPattern.precisionErrorWarning.ascendingCountPrecisionErrorWarning.shortMessage": "Il peut s'agir d'une valeur approximative selon la façon dont les données sont indexées. Pour obtenir des résultats plus fins, effectuez un tri par rareté.", @@ -22457,7 +22457,7 @@ "xpack.lens.indexPattern.samplingPerLayer.fallbackLayerName": "Calque de données", "xpack.lens.indexPattern.settingsSamplingUnsupported": "La sélection de cette fonction a pour effet de changer l'échantillonnage de ce calque à 100 % afin de garantir un fonctionnement correct.", "xpack.lens.indexPattern.sortField.invalid": "Champ non valide. Vérifiez votre vue de données ou choisissez un autre champ.", - "xpack.lens.indexPattern.standardDeviation": "Écart-type", + "lensFormulaDocs.standardDeviation": "Écart-type", "xpack.lens.indexPattern.standardDeviation.description": "Agrégation d'indicateurs à valeur unique qui calcule l’écart-type des valeurs numériques extraites des documents agrégés", "xpack.lens.indexPattern.standardDeviation.quickFunctionDescription": "Écart-type des valeurs d'un champ de nombre qui représente la quantité d'écart des valeurs des champs.", "xpack.lens.indexPattern.staticValue.label": "Valeur de la ligne de référence", @@ -22467,7 +22467,7 @@ "xpack.lens.indexPattern.staticValueWarningText": "Pour écraser la valeur statique, sélectionnez une fonction rapide.", "xpack.lens.indexPattern.suffixLabel": "Suffixe", "xpack.lens.indexpattern.suggestions.overTimeLabel": "Sur la durée", - "xpack.lens.indexPattern.sum": "Somme", + "lensFormulaDocs.sum": "Somme", "xpack.lens.indexPattern.sum.description": "Agrégation d'indicateurs à valeur unique qui récapitule les valeurs numériques extraites des documents agrégés.", "xpack.lens.indexPattern.sum.quickFunctionDescription": "Total des valeurs d'un champ de nombre.", "xpack.lens.indexPattern.switchToRare": "Classer par rareté", @@ -22505,8 +22505,8 @@ "xpack.lens.indexPattern.terms.size": "Nombre de valeurs", "xpack.lens.indexPattern.termsWithMultipleShifts": "Dans un seul calque, il est impossible de combiner des indicateurs avec des décalages temporels différents et des valeurs dynamiques les plus élevées. Utilisez la même valeur de décalage pour tous les indicateurs, ou utilisez des filtres à la place des valeurs les plus élevées.", "xpack.lens.indexPattern.termsWithMultipleShiftsFixActionLabel": "Utiliser des filtres", - "xpack.lens.indexPattern.time_scale": "indicateur : nombre, unité : s|m|h|d|w|M|y", - "xpack.lens.indexPattern.timeScale": "Normaliser par unité", + "lensFormulaDocs.time_scale": "indicateur : nombre, unité : s|m|h|d|w|M|y", + "lensFormulaDocs.timeScale": "Normaliser par unité", "xpack.lens.indexPattern.timeScale.label": "Normaliser par unité", "xpack.lens.indexPattern.timeScale.missingUnit": "Aucune unité spécifiée pour Normaliser par unité.", "xpack.lens.indexPattern.timeScale.tooltip": "Normalisez les valeurs pour qu'elles soient toujours affichées en tant que taux par unité de temps spécifiée, indépendamment de l'intervalle de dates sous-jacent.", @@ -40376,7 +40376,6 @@ "xpack.transform.transformSettingsValidations.numberOfRetriesInvalidErrorMessage": "Le nombre de tentatives doit être compris entre 0 et 100, ou égal à -1 pour des tentatives infinies.", "xpack.transform.transformSettingValidations.maxPageSearchSizeInvalidMessage": "La taille maximum de la recherche de pages doit être un nombre entier compris entre 10 et 65 536.", "xpack.transform.transformSettingValidations.numberGreaterThanOrEqualToNegativeOneNotValidErrorMessage": "Le nombre de tentatives doit être compris entre 0 et 100, ou égal à -1 pour des tentatives infinies.", - "xpack.transform.transformSettingValidations.numberRange10To10000NotValidErrorMessage": "La valeur doit être un entier compris entre 10 et 10 000.", "xpack.transform.transformSettingValidations.retentionPolicyMaxAgeInvalidMessage": "Format d'âge maximal non valide. Le minimum requis est de 60 s.", "xpack.transform.transformsTitle": "Transformations", "xpack.transform.transformsWizard.cloneTransformTitle": "Cloner la transformation", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index af1f51321cb60..5adebd5547e3f 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -21939,54 +21939,54 @@ "xpack.lens.xyVisualization.dataTypeFailureXShort": "{axis}のデータ型が正しくありません。", "xpack.lens.xyVisualization.dataTypeFailureYLong": "{axis}のディメンション{label}のデータ型が正しくありません。数値が想定されていますが、{dataType}です", "xpack.lens.xyVisualization.dataTypeFailureYShort": "{axis}のデータ型が正しくありません。", - "xpack.lens.formula.absFunction.markdown": "\n絶対値を計算します。負の値は-1で乗算されます。正の値は同じままです。\n\n例:海水位までの平均距離を計算します `abs(average(altitude))`\n ", - "xpack.lens.formula.addFunction.markdown": "\n2つの数値を加算します。\n+記号も使用できます。\n\n例:2つのフィールドの合計を計算します\n\n`sum(price) + sum(tax)`\n\n例:固定値でカウントをオフセットします\n\n`add(count(), 5)`\n ", - "xpack.lens.formula.cbrtFunction.markdown": "\n値の立方根。\n\n例:体積から側面の長さを計算します\n`cbrt(last_value(volume))`\n ", - "xpack.lens.formula.ceilFunction.markdown": "\n値の上限(切り上げ)。\n\n例:価格を次のドル単位まで切り上げます\n`ceil(sum(price))`\n ", - "xpack.lens.formula.clampFunction.markdown": "\n最小値から最大値までの値を制限します。\n\n例:確実に異常値を特定します\n```\nclamp(\n average(bytes),\n percentile(bytes, percentile=5),\n percentile(bytes, percentile=95)\n)\n```\n", - "xpack.lens.formula.cubeFunction.markdown": "\n数値の三乗を計算します。\n\n例:側面の長さから体積を計算します\n`cube(last_value(length))`\n ", - "xpack.lens.formula.defaultFunction.markdown": "\n値がヌルのときにデフォルトの数値を返します。\n\n例:フィールドにデータがない場合は、-1を返します\n`defaults(average(bytes), -1)`\n", - "xpack.lens.formula.divideFunction.markdown": "\n1番目の数値を2番目の数値で除算します。\n/記号も使用できます\n\n例:利益率を計算します\n`sum(profit) / sum(revenue)`\n\n例:`divide(sum(bytes), 2)`\n ", - "xpack.lens.formula.eqFunction.markdown": "\n2つの値で等価性の比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n==記号も使用できます。\n\n例:バイトの平均が平均メモリーと同じ量の場合は、trueを返します。\n`average(bytes) == average(memory)`\n\n例: `eq(sum(bytes), 1000000)`\n ", - "xpack.lens.formula.expFunction.markdown": "\n*e*をn乗します。\n\n例:自然指数関数を計算します\n\n`exp(last_value(duration))`\n ", - "xpack.lens.formula.fixFunction.markdown": "\n正の値の場合は、下限を取ります。負の値の場合は、上限を取ります。\n\n例:ゼロに向かって端数処理します\n`fix(sum(profit))`\n ", - "xpack.lens.formula.floorFunction.markdown": "\n最も近い整数値まで切り捨てます\n\n例:価格を切り捨てます\n`floor(sum(price))`\n ", - "xpack.lens.formula.gteFunction.markdown": "\n2つの値で大なりの比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n>=記号も使用できます。\n\n例:バイトの平均がメモリーの平均量以上である場合は、trueを返します\n`average(bytes) >= average(memory)`\n\n例: `gte(average(bytes), 1000)`\n ", - "xpack.lens.formula.gtFunction.markdown": "\n2つの値で大なりの比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n>記号も使用できます。\n\n例:バイトの平均がメモリーの平均量より大きい場合は、trueを返します\n`average(bytes) > average(memory)`\n\n例: `gt(average(bytes), 1000)`\n ", - "xpack.lens.formula.ifElseFunction.markdown": "\n条件の要素がtrueかfalseかに応じて、値を返します。\n\n例:顧客ごとの平均収益。ただし、場合によっては、顧客IDが提供されないことがあり、その場合は別の顧客としてカウントされます\n`sum(total)/(unique_count(customer_id) + ifelse( count() > count(kql='customer_id:*'), 1, 0))`\n ", - "xpack.lens.formula.logFunction.markdown": "\nオプションで底をとる対数。デフォルトでは自然対数の底*e*を使用します。\n\n例:値を格納するために必要なビット数を計算します\n```\nlog(sum(bytes))\nlog(sum(bytes), 2)\n```\n ", - "xpack.lens.formula.lteFunction.markdown": "\n2つの値で小なりイコールの比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n<=記号も使用できます。\n\n例:バイトの平均がメモリーの平均量以下である場合は、trueを返します\n`average(bytes) <= average(memory)`\n\n例: `lte(average(bytes), 1000)`\n ", - "xpack.lens.formula.ltFunction.markdown": "\n2つの値で小なりの比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n<記号も使用できます。\n\n例:バイトの平均がメモリーの平均量より少ない場合は、trueを返します\n`average(bytes) <= average(memory)`\n\n例: `lt(average(bytes), 1000)`\n ", - "xpack.lens.formula.maxFunction.markdown": "\n2つの数値の間の最大値が検出されます。\n\n例:2つのフィールドの平均の最大値が検出されます。\n`pick_max(average(bytes), average(memory))`\n ", - "xpack.lens.formula.minFunction.markdown": "\n2つの数値の間の最小値が検出されます。\n\n例:2つのフィールドの平均の最小値が検索されます。\n`pick_min(average(bytes), average(memory))`\n ", - "xpack.lens.formula.modFunction.markdown": "\n関数を数値で除算した後の余り\n\n例:値の最後の3ビットを計算します\n`mod(sum(price), 1000)`\n ", - "xpack.lens.formula.multiplyFunction.markdown": "\n2つの数値を乗算します。\n*記号も使用できます。\n\n例:現在の税率を入れた価格を計算します\n`sum(bytes) * last_value(tax_rate)`\n\n例:一定の税率を入れた価格を計算します\n`multiply(sum(price), 1.2)`\n ", - "xpack.lens.formula.powFunction.markdown": "\n値を特定の乗数で累乗します。2番目の引数は必須です\n\n例:側面の長さに基づいて体積を計算します\n`pow(last_value(length), 3)`\n ", - "xpack.lens.formula.roundFunction.markdown": "\n特定の小数位に四捨五入します。デフォルトは0です。\n\n例:セントに四捨五入します\n```\nround(sum(bytes))\nround(sum(bytes), 2)\n```\n ", - "xpack.lens.formula.sqrtFunction.markdown": "\n正の値のみの平方根\n\n例:面積に基づいて側面の長さを計算します\n`sqrt(last_value(area))`\n ", - "xpack.lens.formula.squareFunction.markdown": "\n値を2乗します\n\n例:側面の長さに基づいて面積を計算します\n`square(last_value(length))`\n ", - "xpack.lens.formula.subtractFunction.markdown": "\n2番目の数値から1番目の数値を減算します。\n-記号も使用できます。\n\n例:フィールドの範囲を計算します\n`subtract(max(bytes), min(bytes))`\n ", - "xpack.lens.formulaDocumentation.filterRatioDescription.markdown": "### フィルター比率:\n\n`kql=''`を使用すると、1つのセットのドキュメントをフィルターして、同じグループの他のドキュメントと比較します。\n例:経時的なエラー率の変化を表示する\n\n```\ncount(kql='response.status_code > 400') / count()\n```\n ", - "xpack.lens.formulaDocumentation.markdown": "## 仕組み\n\nLens式では、Elasticsearchの集計および数学関数を使用して演算を実行できます\n。主に次の3種類の関数があります。\n\n* `sum(bytes)`などのElasticsearchメトリック\n* 時系列関数は`cumulative_sum()`などのElasticsearchメトリックを入力として使用します\n* `round()`などの数学関数\n\nこれらのすべての関数を使用する式の例:\n\n```\nround(100 * moving_average(\naverage(cpu.load.pct),\nwindow=10,\nkql='datacenter.name: east*'\n))\n```\n\nElasticsearchの関数はフィールド名を取り、フィールドは引用符で囲むこともできます。`sum(bytes)`は\nas `sum('bytes')`.\n\n一部の関数は、`moving_average(count(), window=5)`のような名前付き引数を取ります。\n\nElasticsearchメトリックはKQLまたはLucene構文を使用してフィルターできます。フィルターを追加するには、名前付き\nparameter `kql='field: value'` or `lucene=''`.KQLまたはLuceneクエリを作成するときには、必ず引用符を使用してください\n。検索が引用符で囲まれている場合は、`kql='Women's''のようにバックスラッシュでエスケープします。\n\n数学関数は位置引数を取ることができます。たとえば、pow(count(), 3)はcount() * count() * count()と同じです。\n\n+、-、/、*記号を使用して、基本演算を実行できます。\n ", - "xpack.lens.formulaDocumentation.percentOfTotalDescription.markdown": "### 合計の割合\n\nすべてのグループで式は`overall_sum`を計算できます。\nこれは各グループを合計の割合に変換できます。\n\n```\nsum(products.base_price) / overall_sum(sum(products.base_price))\n```\n ", - "xpack.lens.formulaDocumentation.recentChangeDescription.markdown": "### 最近の変更\n\n「reducedTimeRange='30m'」を使用して、グローバル時間範囲の最後と一致するメトリックの時間範囲で、フィルターを追加しました。これにより、どのくらいの値が最近変更されたのかを計算できます。\n\n```\nmax(system.network.in.bytes, reducedTimeRange=\"30m\")\n - min(system.network.in.bytes, reducedTimeRange=\"30m\")\n```\n ", - "xpack.lens.formulaDocumentation.weekOverWeekDescription.markdown": "### 週単位:\n\n`shift='1w'`を使用すると、前の週から各グループの値を取得します\n。時間シフトは*Top values*関数と使用しないでください。\n\n```\npercentile(system.network.in.bytes, percentile=99) /\npercentile(system.network.in.bytes, percentile=99, shift='1w')\n```\n ", - "xpack.lens.indexPattern.cardinality.documentation.markdown": "\n指定されたフィールドの一意の値の数を計算します。数値、文字列、日付、ブール値で機能します。\n\n例:異なる製品の数を計算します。\n`unique_count(product.name)`\n\n例:「clothes」グループから異なる製品の数を計算します。\n`unique_count(product.name, kql='product.group=clothes')`\n ", - "xpack.lens.indexPattern.count.documentation.markdown": "\nドキュメントの総数。フィールドを入力すると、フィールド値の合計数がカウントされます。1つのドキュメントに複数の値があるフィールドでCount関数を使用すると、すべての値がカウントされます。\n\n#### 例\n\nドキュメントの合計数を計算するには、count()を使用します。\n\nすべての注文書の製品数を計算するには、count(products.id)を使用します。\n\n特定のフィルターと一致するドキュメントの数を計算するには、count(kql='price > 500')を使用します。\n ", - "xpack.lens.indexPattern.counterRate.documentation.markdown": "\n増加し続けるカウンターのレートを計算します。この関数は、経時的に単調に増加する種類の測定を含むカウンターメトリックフィールドでのみ結果を生成します。\n値が小さくなる場合は、カウンターリセットであると解釈されます。最も正確な結果を得るには、フィールドの「max`」で「counter_rate」を計算してください。\n\nこの計算はフィルターで定義された別の系列または上位値のディメンションに対して個別に実行されます。\n式で使用されるときには、現在の間隔を使用します。\n\n例:Memcachedサーバーで経時的に受信されたバイトの比率を可視化します。\n`counter_rate(max(memcached.stats.read.bytes))`\n ", - "xpack.lens.indexPattern.cumulativeSum.documentation.markdown": "\n経時的なメトリックの累計値を計算し、系列のすべての前の値を各値に追加します。この関数を使用するには、日付ヒストグラムディメンションも構成する必要があります。\n\nこの計算はフィルターで定義された別の系列または上位値のディメンションに対して個別に実行されます。\n\n例:経時的に累積された受信バイト数を可視化します。\n`cumulative_sum(sum(bytes))`\n ", - "xpack.lens.indexPattern.differences.documentation.markdown": "\n経時的にメトリックの最後の値に対する差異を計算します。この関数を使用するには、日付ヒストグラムディメンションも構成する必要があります。\n差異ではデータが連続する必要があります。差異を使用するときにデータが空の場合は、データヒストグラム間隔を大きくしてみてください。\n\nこの計算はフィルターで定義された別の系列または上位値のディメンションに対して個別に実行されます。\n\n例:経時的に受信したバイト数の変化を可視化します。\n`differences(sum(bytes))`\n ", - "xpack.lens.indexPattern.lastValue.documentation.markdown": "\n最後のドキュメントからフィールドの値を返し、データビューのデフォルト時刻フィールドで並べ替えます。\n\nこの関数はエンティティの最新の状態を取得する際に役立ちます。\n\n例:サーバーAの現在のステータスを取得:\n`last_value(server.status, kql='server.name=\"A\"')`\n ", - "xpack.lens.indexPattern.metric.documentation.markdown": "\nフィールドの{metric}を返します。この関数は数値フィールドでのみ動作します。\n\n例:価格の{metric}を取得:\n`{metric}(price)`\n\n例:英国からの注文の価格の{metric}を取得:\n`{metric}(price, kql='location:UK')`\n ", - "xpack.lens.indexPattern.movingAverage.documentation.markdown": "\n経時的なメトリックの移動平均を計算します。最後のn番目の値を平均化し、現在の値を計算します。この関数を使用するには、日付ヒストグラムディメンションも構成する必要があります。\nデフォルトウィンドウ値は{defaultValue}です\n\nこの計算はフィルターで定義された別の系列または上位値のディメンションに対して個別に実行されます。\n\n指名パラメーター「window」を取ります。これは現在値の平均計算に含める最後の値の数を指定します。\n\n例:測定の線を平滑化:\n`moving_average(sum(bytes), window=5)`\n ", - "xpack.lens.indexPattern.overall_average.documentation.markdown": "\n現在のグラフの系列のすべてのデータポイントのメトリックの平均を計算します。系列は日付ヒストグラムまたは間隔関数を使用してディメンションによって定義されます。\n上位の値やフィルターなどのデータを分解する他のディメンションは別の系列として処理されます。\n\n日付ヒストグラムまたは間隔関数が現在のグラフで使用されている場合、使用されている関数に関係なく、「overall_average」はすべてのディメンションで平均値を計算します。\n\n例:平均からの収束:\n`sum(bytes) - overall_average(sum(bytes))`\n ", - "xpack.lens.indexPattern.overall_max.documentation.markdown": "\n現在のグラフの系列のすべてのデータポイントのメトリックの最大値を計算します。系列は日付ヒストグラムまたは間隔関数を使用してディメンションによって定義されます。\n上位の値やフィルターなどのデータを分解する他のディメンションは別の系列として処理されます。\n\n日付ヒストグラムまたは間隔関数が現在のグラフで使用されている場合、使用されている関数に関係なく、「overall_max」はすべてのディメンションで最大値を計算します。\n\n例:範囲の割合\n`(sum(bytes) - overall_min(sum(bytes))) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n ", - "xpack.lens.indexPattern.overall_min.documentation.markdown": "\n現在のグラフの系列のすべてのデータポイントのメトリックの最小値を計算します。系列は日付ヒストグラムまたは間隔関数を使用してディメンションによって定義されます。\n上位の値やフィルターなどのデータを分解する他のディメンションは別の系列として処理されます。\n\n日付ヒストグラムまたは間隔関数が現在のグラフで使用されている場合、使用されている関数に関係なく、「overall_min」はすべてのディメンションで最小値を計算します。\n\n例:範囲の割合\n`(sum(bytes) - overall_min(sum(bytes)) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n ", - "xpack.lens.indexPattern.overall_sum.documentation.markdown": "\n現在のグラフの系列のすべてのデータポイントのメトリックの合計を計算します。系列は日付ヒストグラムまたは間隔関数を使用してディメンションによって定義されます。\n上位の値やフィルターなどのデータを分解する他のディメンションは別の系列として処理されます。\n\n日付ヒストグラムまたは間隔関数が現在のグラフで使用されている場合、使用されている関数に関係なく、「overall_sum」はすべてのディメンションで合計値を計算します。\n\n例:合計の割合\n`sum(bytes) / overall_sum(sum(bytes))`\n ", - "xpack.lens.indexPattern.percentile.documentation.markdown": "\nフィールドの値の指定された百分位数を返します。これはドキュメントに出現する値のnパーセントが小さい値です。\n\n例:値の95 %より大きいバイト数を取得:\n`percentile(bytes, percentile=95)`\n ", - "xpack.lens.indexPattern.percentileRanks.documentation.markdown": "\n特定の値未満の値の割合が返されます。たとえば、値が観察された値の95%以上の場合、95パーセンタイルランクであるとされます。\n\n例:100未満の値のパーセンタイルを取得します。\n`percentile_rank(bytes, value=100)`\n ", - "xpack.lens.indexPattern.standardDeviation.documentation.markdown": "\nフィールドの分散または散布度が返されます。この関数は数値フィールドでのみ動作します。\n\n#### 例\n\n価格の標準偏差を取得するには、standard_deviation(price)を使用します。\n\n英国からの注文書の価格の分散を取得するには、square(standard_deviation(price, kql='location:UK'))を使用します。\n ", - "xpack.lens.indexPattern.time_scale.documentation.markdown": "\n\nこの高度な機能は、特定の期間に対してカウントと合計を正規化する際に役立ちます。すでに特定の期間に対して正規化され、保存されたメトリックとの統合が可能です。\n\nこの機能は、現在のグラフで日付ヒストグラム関数が使用されている場合にのみ使用できます。\n\n例:すでに正規化されているメトリックを、正規化が必要な別のメトリックと比較した比率。\n`normalize_by_unit(counter_rate(max(system.diskio.write.bytes)), unit='s') / last_value(apache.status.bytes_per_second)`\n ", + "lensFormulaDocs.tinymath.absFunction.markdown": "\n絶対値を計算します。負の値は-1で乗算されます。正の値は同じままです。\n\n例:海水位までの平均距離を計算します `abs(average(altitude))`\n ", + "lensFormulaDocs.tinymath.addFunction.markdown": "\n2つの数値を加算します。\n+記号も使用できます。\n\n例:2つのフィールドの合計を計算します\n\n`sum(price) + sum(tax)`\n\n例:固定値でカウントをオフセットします\n\n`add(count(), 5)`\n ", + "lensFormulaDocs.tinymath.cbrtFunction.markdown": "\n値の立方根。\n\n例:体積から側面の長さを計算します\n`cbrt(last_value(volume))`\n ", + "lensFormulaDocs.tinymath.ceilFunction.markdown": "\n値の上限(切り上げ)。\n\n例:価格を次のドル単位まで切り上げます\n`ceil(sum(price))`\n ", + "lensFormulaDocs.tinymath.clampFunction.markdown": "\n最小値から最大値までの値を制限します。\n\n例:確実に異常値を特定します\n```\nclamp(\n average(bytes),\n percentile(bytes, percentile=5),\n percentile(bytes, percentile=95)\n)\n```\n", + "lensFormulaDocs.tinymath.cubeFunction.markdown": "\n数値の三乗を計算します。\n\n例:側面の長さから体積を計算します\n`cube(last_value(length))`\n ", + "lensFormulaDocs.tinymath.defaultFunction.markdown": "\n値がヌルのときにデフォルトの数値を返します。\n\n例:フィールドにデータがない場合は、-1を返します\n`defaults(average(bytes), -1)`\n", + "lensFormulaDocs.tinymath.divideFunction.markdown": "\n1番目の数値を2番目の数値で除算します。\n/記号も使用できます\n\n例:利益率を計算します\n`sum(profit) / sum(revenue)`\n\n例:`divide(sum(bytes), 2)`\n ", + "lensFormulaDocs.tinymath.eqFunction.markdown": "\n2つの値で等価性の比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n==記号も使用できます。\n\n例:バイトの平均が平均メモリーと同じ量の場合は、trueを返します。\n`average(bytes) == average(memory)`\n\n例: `eq(sum(bytes), 1000000)`\n ", + "lensFormulaDocs.tinymath.expFunction.markdown": "\n*e*をn乗します。\n\n例:自然指数関数を計算します\n\n`exp(last_value(duration))`\n ", + "lensFormulaDocs.tinymath.fixFunction.markdown": "\n正の値の場合は、下限を取ります。負の値の場合は、上限を取ります。\n\n例:ゼロに向かって端数処理します\n`fix(sum(profit))`\n ", + "lensFormulaDocs.tinymath.floorFunction.markdown": "\n最も近い整数値まで切り捨てます\n\n例:価格を切り捨てます\n`floor(sum(price))`\n ", + "lensFormulaDocs.tinymath.gteFunction.markdown": "\n2つの値で大なりの比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n>=記号も使用できます。\n\n例:バイトの平均がメモリーの平均量以上である場合は、trueを返します\n`average(bytes) >= average(memory)`\n\n例: `gte(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.gtFunction.markdown": "\n2つの値で大なりの比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n>記号も使用できます。\n\n例:バイトの平均がメモリーの平均量より大きい場合は、trueを返します\n`average(bytes) > average(memory)`\n\n例: `gt(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.ifElseFunction.markdown": "\n条件の要素がtrueかfalseかに応じて、値を返します。\n\n例:顧客ごとの平均収益。ただし、場合によっては、顧客IDが提供されないことがあり、その場合は別の顧客としてカウントされます\n`sum(total)/(unique_count(customer_id) + ifelse( count() > count(kql='customer_id:*'), 1, 0))`\n ", + "lensFormulaDocs.tinymath.logFunction.markdown": "\nオプションで底をとる対数。デフォルトでは自然対数の底*e*を使用します。\n\n例:値を格納するために必要なビット数を計算します\n```\nlog(sum(bytes))\nlog(sum(bytes), 2)\n```\n ", + "lensFormulaDocs.tinymath.lteFunction.markdown": "\n2つの値で小なりイコールの比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n<=記号も使用できます。\n\n例:バイトの平均がメモリーの平均量以下である場合は、trueを返します\n`average(bytes) <= average(memory)`\n\n例: `lte(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.ltFunction.markdown": "\n2つの値で小なりの比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n<記号も使用できます。\n\n例:バイトの平均がメモリーの平均量より少ない場合は、trueを返します\n`average(bytes) <= average(memory)`\n\n例: `lt(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.maxFunction.markdown": "\n2つの数値の間の最大値が検出されます。\n\n例:2つのフィールドの平均の最大値が検出されます。\n`pick_max(average(bytes), average(memory))`\n ", + "lensFormulaDocs.tinymath.minFunction.markdown": "\n2つの数値の間の最小値が検出されます。\n\n例:2つのフィールドの平均の最小値が検索されます。\n`pick_min(average(bytes), average(memory))`\n ", + "lensFormulaDocs.tinymath.modFunction.markdown": "\n関数を数値で除算した後の余り\n\n例:値の最後の3ビットを計算します\n`mod(sum(price), 1000)`\n ", + "lensFormulaDocs.tinymath.multiplyFunction.markdown": "\n2つの数値を乗算します。\n*記号も使用できます。\n\n例:現在の税率を入れた価格を計算します\n`sum(bytes) * last_value(tax_rate)`\n\n例:一定の税率を入れた価格を計算します\n`multiply(sum(price), 1.2)`\n ", + "lensFormulaDocs.tinymath.powFunction.markdown": "\n値を特定の乗数で累乗します。2番目の引数は必須です\n\n例:側面の長さに基づいて体積を計算します\n`pow(last_value(length), 3)`\n ", + "lensFormulaDocs.tinymath.roundFunction.markdown": "\n特定の小数位に四捨五入します。デフォルトは0です。\n\n例:セントに四捨五入します\n```\nround(sum(bytes))\nround(sum(bytes), 2)\n```\n ", + "lensFormulaDocs.tinymath.sqrtFunction.markdown": "\n正の値のみの平方根\n\n例:面積に基づいて側面の長さを計算します\n`sqrt(last_value(area))`\n ", + "lensFormulaDocs.tinymath.squareFunction.markdown": "\n値を2乗します\n\n例:側面の長さに基づいて面積を計算します\n`square(last_value(length))`\n ", + "lensFormulaDocs.tinymath.subtractFunction.markdown": "\n2番目の数値から1番目の数値を減算します。\n-記号も使用できます。\n\n例:フィールドの範囲を計算します\n`subtract(max(bytes), min(bytes))`\n ", + "lensFormulaDocs.documentation.filterRatioDescription.markdown": "### フィルター比率:\n\n`kql=''`を使用すると、1つのセットのドキュメントをフィルターして、同じグループの他のドキュメントと比較します。\n例:経時的なエラー率の変化を表示する\n\n```\ncount(kql='response.status_code > 400') / count()\n```\n ", + "lensFormulaDocs.documentation.markdown": "## 仕組み\n\nLens式では、Elasticsearchの集計および数学関数を使用して演算を実行できます\n。主に次の3種類の関数があります。\n\n* `sum(bytes)`などのElasticsearchメトリック\n* 時系列関数は`cumulative_sum()`などのElasticsearchメトリックを入力として使用します\n* `round()`などの数学関数\n\nこれらのすべての関数を使用する式の例:\n\n```\nround(100 * moving_average(\naverage(cpu.load.pct),\nwindow=10,\nkql='datacenter.name: east*'\n))\n```\n\nElasticsearchの関数はフィールド名を取り、フィールドは引用符で囲むこともできます。`sum(bytes)`は\nas `sum('bytes')`.\n\n一部の関数は、`moving_average(count(), window=5)`のような名前付き引数を取ります。\n\nElasticsearchメトリックはKQLまたはLucene構文を使用してフィルターできます。フィルターを追加するには、名前付き\nparameter `kql='field: value'` or `lucene=''`.KQLまたはLuceneクエリを作成するときには、必ず引用符を使用してください\n。検索が引用符で囲まれている場合は、`kql='Women's''のようにバックスラッシュでエスケープします。\n\n数学関数は位置引数を取ることができます。たとえば、pow(count(), 3)はcount() * count() * count()と同じです。\n\n+、-、/、*記号を使用して、基本演算を実行できます。\n ", + "lensFormulaDocs.documentation.percentOfTotalDescription.markdown": "### 合計の割合\n\nすべてのグループで式は`overall_sum`を計算できます。\nこれは各グループを合計の割合に変換できます。\n\n```\nsum(products.base_price) / overall_sum(sum(products.base_price))\n```\n ", + "lensFormulaDocs.documentation.recentChangeDescription.markdown": "### 最近の変更\n\n「reducedTimeRange='30m'」を使用して、グローバル時間範囲の最後と一致するメトリックの時間範囲で、フィルターを追加しました。これにより、どのくらいの値が最近変更されたのかを計算できます。\n\n```\nmax(system.network.in.bytes, reducedTimeRange=\"30m\")\n - min(system.network.in.bytes, reducedTimeRange=\"30m\")\n```\n ", + "lensFormulaDocs.documentation.weekOverWeekDescription.markdown": "### 週単位:\n\n`shift='1w'`を使用すると、前の週から各グループの値を取得します\n。時間シフトは*Top values*関数と使用しないでください。\n\n```\npercentile(system.network.in.bytes, percentile=99) /\npercentile(system.network.in.bytes, percentile=99, shift='1w')\n```\n ", + "lensFormulaDocs.cardinality.documentation.markdown": "\n指定されたフィールドの一意の値の数を計算します。数値、文字列、日付、ブール値で機能します。\n\n例:異なる製品の数を計算します。\n`unique_count(product.name)`\n\n例:「clothes」グループから異なる製品の数を計算します。\n`unique_count(product.name, kql='product.group=clothes')`\n ", + "lensFormulaDocs.count.documentation.markdown": "\nドキュメントの総数。フィールドを入力すると、フィールド値の合計数がカウントされます。1つのドキュメントに複数の値があるフィールドでCount関数を使用すると、すべての値がカウントされます。\n\n#### 例\n\nドキュメントの合計数を計算するには、count()を使用します。\n\nすべての注文書の製品数を計算するには、count(products.id)を使用します。\n\n特定のフィルターと一致するドキュメントの数を計算するには、count(kql='price > 500')を使用します。\n ", + "lensFormulaDocs.counterRate.documentation.markdown": "\n増加し続けるカウンターのレートを計算します。この関数は、経時的に単調に増加する種類の測定を含むカウンターメトリックフィールドでのみ結果を生成します。\n値が小さくなる場合は、カウンターリセットであると解釈されます。最も正確な結果を得るには、フィールドの「max`」で「counter_rate」を計算してください。\n\nこの計算はフィルターで定義された別の系列または上位値のディメンションに対して個別に実行されます。\n式で使用されるときには、現在の間隔を使用します。\n\n例:Memcachedサーバーで経時的に受信されたバイトの比率を可視化します。\n`counter_rate(max(memcached.stats.read.bytes))`\n ", + "lensFormulaDocs.cumulativeSum.documentation.markdown": "\n経時的なメトリックの累計値を計算し、系列のすべての前の値を各値に追加します。この関数を使用するには、日付ヒストグラムディメンションも構成する必要があります。\n\nこの計算はフィルターで定義された別の系列または上位値のディメンションに対して個別に実行されます。\n\n例:経時的に累積された受信バイト数を可視化します。\n`cumulative_sum(sum(bytes))`\n ", + "lensFormulaDocs.differences.documentation.markdown": "\n経時的にメトリックの最後の値に対する差異を計算します。この関数を使用するには、日付ヒストグラムディメンションも構成する必要があります。\n差異ではデータが連続する必要があります。差異を使用するときにデータが空の場合は、データヒストグラム間隔を大きくしてみてください。\n\nこの計算はフィルターで定義された別の系列または上位値のディメンションに対して個別に実行されます。\n\n例:経時的に受信したバイト数の変化を可視化します。\n`differences(sum(bytes))`\n ", + "lensFormulaDocs.lastValue.documentation.markdown": "\n最後のドキュメントからフィールドの値を返し、データビューのデフォルト時刻フィールドで並べ替えます。\n\nこの関数はエンティティの最新の状態を取得する際に役立ちます。\n\n例:サーバーAの現在のステータスを取得:\n`last_value(server.status, kql='server.name=\"A\"')`\n ", + "lensFormulaDocs.metric.documentation.markdown": "\nフィールドの{metric}を返します。この関数は数値フィールドでのみ動作します。\n\n例:価格の{metric}を取得:\n`{metric}(price)`\n\n例:英国からの注文の価格の{metric}を取得:\n`{metric}(price, kql='location:UK')`\n ", + "lensFormulaDocs.movingAverage.documentation.markdown": "\n経時的なメトリックの移動平均を計算します。最後のn番目の値を平均化し、現在の値を計算します。この関数を使用するには、日付ヒストグラムディメンションも構成する必要があります。\nデフォルトウィンドウ値は{defaultValue}です\n\nこの計算はフィルターで定義された別の系列または上位値のディメンションに対して個別に実行されます。\n\n指名パラメーター「window」を取ります。これは現在値の平均計算に含める最後の値の数を指定します。\n\n例:測定の線を平滑化:\n`moving_average(sum(bytes), window=5)`\n ", + "lensFormulaDocs.overall_average.documentation.markdown": "\n現在のグラフの系列のすべてのデータポイントのメトリックの平均を計算します。系列は日付ヒストグラムまたは間隔関数を使用してディメンションによって定義されます。\n上位の値やフィルターなどのデータを分解する他のディメンションは別の系列として処理されます。\n\n日付ヒストグラムまたは間隔関数が現在のグラフで使用されている場合、使用されている関数に関係なく、「overall_average」はすべてのディメンションで平均値を計算します。\n\n例:平均からの収束:\n`sum(bytes) - overall_average(sum(bytes))`\n ", + "lensFormulaDocs.overall_max.documentation.markdown": "\n現在のグラフの系列のすべてのデータポイントのメトリックの最大値を計算します。系列は日付ヒストグラムまたは間隔関数を使用してディメンションによって定義されます。\n上位の値やフィルターなどのデータを分解する他のディメンションは別の系列として処理されます。\n\n日付ヒストグラムまたは間隔関数が現在のグラフで使用されている場合、使用されている関数に関係なく、「overall_max」はすべてのディメンションで最大値を計算します。\n\n例:範囲の割合\n`(sum(bytes) - overall_min(sum(bytes))) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n ", + "lensFormulaDocs.overall_min.documentation.markdown": "\n現在のグラフの系列のすべてのデータポイントのメトリックの最小値を計算します。系列は日付ヒストグラムまたは間隔関数を使用してディメンションによって定義されます。\n上位の値やフィルターなどのデータを分解する他のディメンションは別の系列として処理されます。\n\n日付ヒストグラムまたは間隔関数が現在のグラフで使用されている場合、使用されている関数に関係なく、「overall_min」はすべてのディメンションで最小値を計算します。\n\n例:範囲の割合\n`(sum(bytes) - overall_min(sum(bytes)) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n ", + "lensFormulaDocs.overall_sum.documentation.markdown": "\n現在のグラフの系列のすべてのデータポイントのメトリックの合計を計算します。系列は日付ヒストグラムまたは間隔関数を使用してディメンションによって定義されます。\n上位の値やフィルターなどのデータを分解する他のディメンションは別の系列として処理されます。\n\n日付ヒストグラムまたは間隔関数が現在のグラフで使用されている場合、使用されている関数に関係なく、「overall_sum」はすべてのディメンションで合計値を計算します。\n\n例:合計の割合\n`sum(bytes) / overall_sum(sum(bytes))`\n ", + "lensFormulaDocs.percentile.documentation.markdown": "\nフィールドの値の指定された百分位数を返します。これはドキュメントに出現する値のnパーセントが小さい値です。\n\n例:値の95 %より大きいバイト数を取得:\n`percentile(bytes, percentile=95)`\n ", + "lensFormulaDocs.percentileRanks.documentation.markdown": "\n特定の値未満の値の割合が返されます。たとえば、値が観察された値の95%以上の場合、95パーセンタイルランクであるとされます。\n\n例:100未満の値のパーセンタイルを取得します。\n`percentile_rank(bytes, value=100)`\n ", + "lensFormulaDocs.standardDeviation.documentation.markdown": "\nフィールドの分散または散布度が返されます。この関数は数値フィールドでのみ動作します。\n\n#### 例\n\n価格の標準偏差を取得するには、standard_deviation(price)を使用します。\n\n英国からの注文書の価格の分散を取得するには、square(standard_deviation(price, kql='location:UK'))を使用します。\n ", + "lensFormulaDocs.time_scale.documentation.markdown": "\n\nこの高度な機能は、特定の期間に対してカウントと合計を正規化する際に役立ちます。すでに特定の期間に対して正規化され、保存されたメトリックとの統合が可能です。\n\nこの機能は、現在のグラフで日付ヒストグラム関数が使用されている場合にのみ使用できます。\n\n例:すでに正規化されているメトリックを、正規化が必要な別のメトリックと比較した比率。\n`normalize_by_unit(counter_rate(max(system.diskio.write.bytes)), unit='s') / last_value(apache.status.bytes_per_second)`\n ", "xpack.lens.AggBasedLabel": "集約に基づく可視化", "xpack.lens.app.addToLibrary": "ライブラリに保存", "xpack.lens.app.cancel": "キャンセル", @@ -22164,11 +22164,11 @@ "xpack.lens.fittingFunctionsTitle.lookahead": "次へ", "xpack.lens.fittingFunctionsTitle.none": "非表示", "xpack.lens.fittingFunctionsTitle.zero": "ゼロ", - "xpack.lens.formula.base": "基数", - "xpack.lens.formula.boolean": "ブール", - "xpack.lens.formula.condition": "条件", - "xpack.lens.formula.decimals": "小数点以下", - "xpack.lens.formula.defaultValue": "デフォルト", + "lensFormulaDocs.tinymath.base": "基数", + "lensFormulaDocs.boolean": "ブール", + "lensFormulaDocs.tinymath.condition": "条件", + "lensFormulaDocs.tinymath.decimals": "小数点以下", + "lensFormulaDocs.tinymath.defaultValue": "デフォルト", "xpack.lens.formula.disableWordWrapLabel": "単語の折り返しを無効にする", "xpack.lens.formula.editorHelpInlineHideLabel": "関数リファレンスを非表示", "xpack.lens.formula.editorHelpInlineHideToolTip": "関数リファレンスを非表示", @@ -22176,35 +22176,35 @@ "xpack.lens.formula.fullScreenEnterLabel": "拡張", "xpack.lens.formula.fullScreenExitLabel": "縮小", "xpack.lens.formula.kqlExtraArguments": "[kql]?:文字列、[lucene]?:文字列", - "xpack.lens.formula.left": "左", - "xpack.lens.formula.max": "最高", - "xpack.lens.formula.min": "分", - "xpack.lens.formula.number": "数字", + "lensFormulaDocs.tinymath.left": "左", + "lensFormulaDocs.tinymath.max": "最高", + "lensFormulaDocs.tinymath.min": "分", + "lensFormulaDocs.number": "数字", "xpack.lens.formula.reducedTimeRangeExtraArguments": "[reducedTimeRange]?: string", "xpack.lens.formula.requiredArgument": "必須", - "xpack.lens.formula.right": "右", + "lensFormulaDocs.tinymath.right": "右", "xpack.lens.formula.shiftExtraArguments": "[shift]?:文字列", - "xpack.lens.formula.string": "文字列", - "xpack.lens.formula.value": "値", - "xpack.lens.formulaCommonFormulaDocumentation": "最も一般的な式は2つの値を分割して割合を生成します。正確に表示するには、[値形式]を[割合]に設定します。", - "xpack.lens.formulaDocumentation.columnCalculationSection": "列計算", - "xpack.lens.formulaDocumentation.columnCalculationSectionDescription": "各行でこれらの関数が実行されますが、コンテキストとして列全体が提供されます。これはウィンドウ関数とも呼ばれます。", - "xpack.lens.formulaDocumentation.comparisonSection": "比較", - "xpack.lens.formulaDocumentation.comparisonSectionDescription": "これらの関数は値を比較するために使用されます。", - "xpack.lens.formulaDocumentation.constantsSection": "Kibanaコンテキスト", - "xpack.lens.formulaDocumentation.constantsSectionDescription": "これらの関数は、Kibanaのコンテキスト変数(日付ヒストグラムの「interval」、現在の「now」、選択した「time_range」)を取得するために使用され、日付の計算処理を行うのに役立ちます。", - "xpack.lens.formulaDocumentation.elasticsearchSection": "Elasticsearch", - "xpack.lens.formulaDocumentation.elasticsearchSectionDescription": "これらの関数は結果テーブルの各行の未加工ドキュメントで実行され、内訳ディメンションと一致するすべてのドキュメントを単一の値に集約します。", - "xpack.lens.formulaDocumentation.filterRatio": "フィルター比率", - "xpack.lens.formulaDocumentation.mathSection": "数学処理", - "xpack.lens.formulaDocumentation.mathSectionDescription": "これらの関数は、他の関数で計算された同じ行の単一の値を使用して、結果テーブルの各行で実行されます。", - "xpack.lens.formulaDocumentation.percentOfTotal": "合計の割合", - "xpack.lens.formulaDocumentation.recentChange": "最近の変更", - "xpack.lens.formulaDocumentation.weekOverWeek": "週単位", + "lensFormulaDocs.string": "文字列", + "lensFormulaDocs.tinymath.value": "値", + "lensFormulaDocs.CommonFormulaDocumentation": "最も一般的な式は2つの値を分割して割合を生成します。正確に表示するには、[値形式]を[割合]に設定します。", + "lensFormulaDocs.documentation.columnCalculationSection": "列計算", + "lensFormulaDocs.documentation.columnCalculationSectionDescription": "各行でこれらの関数が実行されますが、コンテキストとして列全体が提供されます。これはウィンドウ関数とも呼ばれます。", + "lensFormulaDocs.documentation.comparisonSection": "比較", + "lensFormulaDocs.documentation.comparisonSectionDescription": "これらの関数は値を比較するために使用されます。", + "lensFormulaDocs.documentation.constantsSection": "Kibanaコンテキスト", + "lensFormulaDocs.documentation.constantsSectionDescription": "これらの関数は、Kibanaのコンテキスト変数(日付ヒストグラムの「interval」、現在の「now」、選択した「time_range」)を取得するために使用され、日付の計算処理を行うのに役立ちます。", + "lensFormulaDocs.documentation.elasticsearchSection": "Elasticsearch", + "lensFormulaDocs.documentation.elasticsearchSectionDescription": "これらの関数は結果テーブルの各行の未加工ドキュメントで実行され、内訳ディメンションと一致するすべてのドキュメントを単一の値に集約します。", + "lensFormulaDocs.documentation.filterRatio": "フィルター比率", + "lensFormulaDocs.documentation.mathSection": "数学処理", + "lensFormulaDocs.documentation.mathSectionDescription": "これらの関数は、他の関数で計算された同じ行の単一の値を使用して、結果テーブルの各行で実行されます。", + "lensFormulaDocs.documentation.percentOfTotal": "合計の割合", + "lensFormulaDocs.documentation.recentChange": "最近の変更", + "lensFormulaDocs.documentation.weekOverWeek": "週単位", "xpack.lens.formulaDocumentationHeading": "仕組み", "xpack.lens.formulaEnableWordWrapLabel": "単語の折り返しを有効にする", "xpack.lens.formulaExampleMarkdown": "例", - "xpack.lens.formulaFrequentlyUsedHeading": "一般的な式", + "lensFormulaDocs.frequentlyUsedHeading": "一般的な式", "xpack.lens.formulaPlaceholderText": "関数を演算と組み合わせて式を入力します。例:", "xpack.lens.fullExtent.niceValues": "切りの良い値に端数処理", "xpack.lens.functions.collapse.args.byHelpText": "グループ化の基準となる列。この列はそのまま保持されます", @@ -22263,29 +22263,29 @@ "xpack.lens.indexPattern.allFieldsLabelHelp": "使用可能なフィールドをワークスペースまでドラッグし、ビジュアライゼーションを作成します。使用可能なフィールドを変更するには、別のデータビューを選択するか、クエリを編集するか、別の時間範囲を使用します。一部のフィールドタイプは、完全なテキストおよびグラフィックフィールドを含む Lens では、ビジュアライゼーションできません。", "xpack.lens.indexPattern.ascendingCountPrecisionErrorWarning.link": "ドキュメントをご覧ください", "xpack.lens.indexPattern.availableFieldsLabel": "利用可能なフィールド", - "xpack.lens.indexPattern.avg": "平均", + "lensFormulaDocs.avg": "平均", "xpack.lens.indexPattern.avg.description": "集約されたドキュメントから抽出された数値の平均値を計算する単一値メトリック集約", "xpack.lens.indexPattern.avg.quickFunctionDescription": "数値フィールドの集合の平均値。", "xpack.lens.indexPattern.bitsFormatLabel": "ビット(1000)", "xpack.lens.indexPattern.bytesFormatLabel": "バイト(1024)", - "xpack.lens.indexPattern.cardinality": "ユニークカウント", + "lensFormulaDocs.cardinality": "ユニークカウント", "xpack.lens.indexPattern.cardinality.documentation.quick": "\n指定した数値、文字列、日付、ブール値フィールドの一意の値の数。\n ", - "xpack.lens.indexPattern.cardinality.signature": "フィールド:文字列", + "lensFormulaDocs.cardinality.signature": "フィールド:文字列", "xpack.lens.indexPattern.changeDataViewTitle": "データビュー", "xpack.lens.indexPattern.chooseField": "フィールド", "xpack.lens.indexPattern.chooseFieldLabel": "この関数を使用するには、フィールドを選択してください。", "xpack.lens.indexPattern.chooseSubFunction": "サブ関数を選択", "xpack.lens.indexPattern.columnFormatLabel": "値の形式", "xpack.lens.indexPattern.compactLabel": "値の圧縮", - "xpack.lens.indexPattern.count": "カウント", + "lensFormulaDocs.count": "カウント", "xpack.lens.indexPattern.count.documentation.quick": "\nドキュメントの総数。フィールドを入力すると、フィールド値の合計数がカウントされます。1つのドキュメントに複数の値があるフィールドでCount関数を使用すると、すべての値がカウントされます。\n ", - "xpack.lens.indexPattern.count.signature": "[field: string]", - "xpack.lens.indexPattern.counterRate": "カウンターレート", + "lensFormulaDocs.count.signature": "[field: string]", + "lensFormulaDocs.counterRate": "カウンターレート", "xpack.lens.indexPattern.counterRate.documentation.quick": "\n 増加を続ける時系列メトリックの経時的な変化率。\n ", - "xpack.lens.indexPattern.counterRate.signature": "メトリック:数値", + "lensFormulaDocs.counterRate.signature": "メトリック:数値", "xpack.lens.indexPattern.countOf": "レコード数", - "xpack.lens.indexPattern.cumulative_sum.signature": "メトリック:数値", - "xpack.lens.indexPattern.cumulativeSum": "累積和", + "lensFormulaDocs.cumulative_sum.signature": "メトリック:数値", + "lensFormulaDocs.cumulativeSum": "累積和", "xpack.lens.indexPattern.cumulativeSum.documentation.quick": "\n 経時的に増加するすべての値の合計。\n ", "xpack.lens.indexPattern.custom.externalDoc": "数値書式構文", "xpack.lens.indexPattern.custom.patternLabel": "フォーマット", @@ -22315,9 +22315,9 @@ "xpack.lens.indexPattern.dateRange.noTimeRange": "現在の時間範囲がありません", "xpack.lens.indexPattern.decimalPlacesLabel": "小数点以下", "xpack.lens.indexPattern.defaultFormatLabel": "デフォルト", - "xpack.lens.indexPattern.derivative": "差異", + "lensFormulaDocs.derivative": "差異", "xpack.lens.indexPattern.differences.documentation.quick": "\n 後続の間隔の値の変化。\n ", - "xpack.lens.indexPattern.differences.signature": "メトリック:数値", + "lensFormulaDocs.differences.signature": "メトリック:数値", "xpack.lens.indexPattern.dimensionEditor.headingAppearance": "見た目", "xpack.lens.indexPattern.dimensionEditor.headingData": "データ", "xpack.lens.indexPattern.dimensionEditor.headingFormula": "式", @@ -22370,30 +22370,30 @@ "xpack.lens.indexPattern.invalidOperationLabel": "選択した関数はこのフィールドで動作しません。", "xpack.lens.indexPattern.invalidReducedTimeRange": "縮小された時間範囲が無効です。正の整数の後に単位s、m、h、d、w、M、yのいずれかを入力します。例:3時間は3hです", "xpack.lens.indexPattern.invalidTimeShift": "無効な時間シフトです。正の整数の後に単位s、m、h、d、w、M、yのいずれかを入力します。例:3時間は3hです", - "xpack.lens.indexPattern.lastValue": "最終値", + "lensFormulaDocs.lastValue": "最終値", "xpack.lens.indexPattern.lastValue.disabled": "この関数には、データビューの日付フィールドが必要です", "xpack.lens.indexPattern.lastValue.documentation.quick": "\n最後のドキュメントのフィールドの値。データビューのデフォルト時刻フィールドで並べ替えられます。\n ", "xpack.lens.indexPattern.lastValue.showArrayValues": "ゼロ値を表示", "xpack.lens.indexPattern.lastValue.showArrayValuesExplanation": "各最後のドキュメントのこのフィールドに関連付けられたすべての値を表示します。", "xpack.lens.indexPattern.lastValue.showArrayValuesWithTopValuesWarning": "配列値を表示するときには、このフィールドを使用して上位の値をランク付けできません。", - "xpack.lens.indexPattern.lastValue.signature": "フィールド:文字列", + "lensFormulaDocs.lastValue.signature": "フィールド:文字列", "xpack.lens.indexPattern.lastValue.sortField": "日付フィールドで並べ替え", "xpack.lens.indexPattern.lastValue.sortFieldPlaceholder": "並べ替えフィールド", - "xpack.lens.indexPattern.max": "最高", + "lensFormulaDocs.max": "最高", "xpack.lens.indexPattern.max.description": "集約されたドキュメントから抽出された数値の最大値を返す単一値メトリック集約。", "xpack.lens.indexPattern.max.quickFunctionDescription": "数値フィールドの最大値。", - "xpack.lens.indexPattern.median": "中央", + "lensFormulaDocs.median": "中央", "xpack.lens.indexPattern.median.description": "集約されたドキュメントから抽出された中央値を計算する単一値メトリック集約。", "xpack.lens.indexPattern.median.quickFunctionDescription": "数値フィールドの中央値。", "xpack.lens.indexPattern.metaFieldsLabel": "メタフィールド", - "xpack.lens.indexPattern.metric.signature": "フィールド:文字列", - "xpack.lens.indexPattern.min": "最低", + "lensFormulaDocs.metric.signature": "フィールド:文字列", + "lensFormulaDocs.min": "最低", "xpack.lens.indexPattern.min.description": "集約されたドキュメントから抽出された数値の最小値を返す単一値メトリック集約。", "xpack.lens.indexPattern.min.quickFunctionDescription": "数値フィールドの最小値。", "xpack.lens.indexPattern.missingFieldLabel": "見つからないフィールド", "xpack.lens.indexPattern.moveToWorkspaceNotAvailable": "このフィールドを可視化するには、直接任意のレイヤーに追加してください。現在の設定では、このフィールドをワークスペースに追加することはサポートされていません。", - "xpack.lens.indexPattern.moving_average.signature": "メトリック:数値、[window]:数値", - "xpack.lens.indexPattern.movingAverage": "移動平均", + "lensFormulaDocs.moving_average.signature": "メトリック:数値、[window]:数値", + "lensFormulaDocs.movingAverage": "移動平均", "xpack.lens.indexPattern.movingAverage.basicExplanation": "移動平均はデータ全体でウィンドウをスライドし、平均値を表示します。移動平均は日付ヒストグラムでのみサポートされています。", "xpack.lens.indexPattern.movingAverage.documentation.quick": "\n 経時的な値の移動範囲の平均。\n ", "xpack.lens.indexPattern.movingAverage.limitations": "最初の移動平均値は2番目の項目から開始します。", @@ -22409,20 +22409,20 @@ "xpack.lens.indexPattern.noRealMetricError": "静的値のみのレイヤーには結果が表示されません。1つ以上の動的メトリックを使用してください", "xpack.lens.indexPattern.notAbsoluteTimeShift": "無効な時間シフトです。", "xpack.lens.indexPattern.numberFormatLabel": "数字", - "xpack.lens.indexPattern.overall_metric": "メトリック:数値", - "xpack.lens.indexPattern.overallMax": "全体最高", - "xpack.lens.indexPattern.overallMin": "全体最低", - "xpack.lens.indexPattern.overallSum": "全体合計", + "lensFormulaDocs.overall_metric": "メトリック:数値", + "lensFormulaDocs.overallMax": "全体最高", + "lensFormulaDocs.overallMin": "全体最低", + "lensFormulaDocs.overallSum": "全体合計", "xpack.lens.indexPattern.percentFormatLabel": "割合(%)", - "xpack.lens.indexPattern.percentile": "パーセンタイル", + "lensFormulaDocs.percentile": "パーセンタイル", "xpack.lens.indexPattern.percentile.documentation.quick": "\n すべてのドキュメントで発生する値のnパーセントよりも小さい最大値。\n ", "xpack.lens.indexPattern.percentile.percentileRanksValue": "パーセンタイル順位値", "xpack.lens.indexPattern.percentile.percentileValue": "パーセンタイル", - "xpack.lens.indexPattern.percentile.signature": "フィールド:文字列、[percentile]:数値", - "xpack.lens.indexPattern.percentileRank": "パーセンタイル順位", + "lensFormulaDocs.percentile.signature": "フィールド:文字列、[percentile]:数値", + "lensFormulaDocs.percentileRank": "パーセンタイル順位", "xpack.lens.indexPattern.percentileRanks.documentation.quick": "\n特定の値未満の値の割合。たとえば、値が計算された値の95%以上の場合、95パーセンタイル順位です。\n ", "xpack.lens.indexPattern.percentileRanks.errorMessage": "パーセンタイル順位値は数値でなければなりません", - "xpack.lens.indexPattern.percentileRanks.signature": "フィールド: 文字列, [value]: 数値", + "lensFormulaDocs.percentileRanks.signature": "フィールド: 文字列, [value]: 数値", "xpack.lens.indexPattern.precisionErrorWarning.accuracyDisabled.shortMessage": "これは近似値の可能性があります。より正確な結果を得るために精度モードを有効にできますが、Elasticsearchクラスターの負荷が大きくなります。", "xpack.lens.indexPattern.precisionErrorWarning.accuracyEnabled.shortMessage": "これは近似値の可能性があります。より正確な結果を得るには、フィルターを使用するか、上位の値の数を増やしてください。", "xpack.lens.indexPattern.precisionErrorWarning.ascendingCountPrecisionErrorWarning.shortMessage": "データのインデックスの作成方法により、近似される場合があります。より正確な結果を得るには、希少性でソートしてください。", @@ -22472,7 +22472,7 @@ "xpack.lens.indexPattern.samplingPerLayer.fallbackLayerName": "データレイヤー", "xpack.lens.indexPattern.settingsSamplingUnsupported": "この関数を選択すると、関数が正常に機能するように、このレイヤーのサンプリングが100%に変更されます。", "xpack.lens.indexPattern.sortField.invalid": "無効なフィールドです。データビューを確認するか、別のフィールドを選択してください。", - "xpack.lens.indexPattern.standardDeviation": "標準偏差", + "lensFormulaDocs.standardDeviation": "標準偏差", "xpack.lens.indexPattern.standardDeviation.description": "集約されたドキュメントから抽出された数値の標準偏差を計算する単一値メトリック集約", "xpack.lens.indexPattern.standardDeviation.quickFunctionDescription": "フィールド値の変動量である数値フィールドの値の標準偏差。", "xpack.lens.indexPattern.staticValue.label": "基準線値", @@ -22482,7 +22482,7 @@ "xpack.lens.indexPattern.staticValueWarningText": "固定値を上書きするには、クイック関数を選択します", "xpack.lens.indexPattern.suffixLabel": "接尾辞", "xpack.lens.indexpattern.suggestions.overTimeLabel": "一定時間", - "xpack.lens.indexPattern.sum": "合計", + "lensFormulaDocs.sum": "合計", "xpack.lens.indexPattern.sum.description": "集約されたドキュメントから抽出された数値を合計する単一値メトリック集約。", "xpack.lens.indexPattern.sum.quickFunctionDescription": "数値フィールドの値の合計量。", "xpack.lens.indexPattern.switchToRare": "希少性でランク", @@ -22520,8 +22520,8 @@ "xpack.lens.indexPattern.terms.size": "値の数", "xpack.lens.indexPattern.termsWithMultipleShifts": "単一のレイヤーでは、メトリックを異なる時間シフトと動的な上位の値と組み合わせることができません。すべてのメトリックで同じ時間シフト値を使用するか、上位の値ではなくフィルターを使用します。", "xpack.lens.indexPattern.termsWithMultipleShiftsFixActionLabel": "フィルターを使用", - "xpack.lens.indexPattern.time_scale": "メトリック:数値、単位:s|m|h|d|w|M|y", - "xpack.lens.indexPattern.timeScale": "単位で正規化", + "lensFormulaDocs.time_scale": "メトリック:数値、単位:s|m|h|d|w|M|y", + "lensFormulaDocs.timeScale": "単位で正規化", "xpack.lens.indexPattern.timeScale.label": "単位で正規化", "xpack.lens.indexPattern.timeScale.missingUnit": "単位による正規化の単位が指定されていません。", "xpack.lens.indexPattern.timeScale.tooltip": "基本の日付間隔に関係なく、常に指定された時間単位のレートとして表示されるように値を正規化します。", @@ -40375,7 +40375,6 @@ "xpack.transform.transformSettingsValidations.numberOfRetriesInvalidErrorMessage": "再試行回数は0~100の範囲でなければなりません。-1を指定すると、再試行回数が無制限に設定されます。", "xpack.transform.transformSettingValidations.maxPageSearchSizeInvalidMessage": "最大ページ検索サイズは10~65536の範囲の整数でなければなりません。", "xpack.transform.transformSettingValidations.numberGreaterThanOrEqualToNegativeOneNotValidErrorMessage": "再試行回数は0~100の範囲でなければなりません。-1を指定すると、再試行回数が無制限に設定されます。", - "xpack.transform.transformSettingValidations.numberRange10To10000NotValidErrorMessage": "値は10~10000の範囲の整数でなければなりません。", "xpack.transform.transformSettingValidations.retentionPolicyMaxAgeInvalidMessage": "無効な最大年齢形式です。60秒以上が必要です。", "xpack.transform.transformsTitle": "トランスフォーム", "xpack.transform.transformsWizard.cloneTransformTitle": "クローントランスフォーム", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 53b6da3e5fd08..4c063a0848db7 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -4833,6 +4833,73 @@ "languageDocumentationPopover.header": "{language} 参考", "languageDocumentationPopover.tooltip": "{lang} 参考", "languageDocumentationPopover.searchPlaceholder": "搜索", + "lensFormulaDocs.avg": "平均值", + "lensFormulaDocs.cardinality": "唯一计数", + "lensFormulaDocs.count": "计数", + "lensFormulaDocs.counterRate": "计数率", + "lensFormulaDocs.cumulativeSum": "累计和", + "lensFormulaDocs.derivative": "差异", + "lensFormulaDocs.lastValue": "最后值", + "lensFormulaDocs.max": "最大值", + "lensFormulaDocs.median": "中值", + "lensFormulaDocs.min": "最小值", + "lensFormulaDocs.movingAverage": "移动平均值", + "lensFormulaDocs.overallMax": "总体最大值", + "lensFormulaDocs.overallMin": "总体最小值", + "lensFormulaDocs.overallSum": "总和", + "lensFormulaDocs.percentile": "百分位数", + "lensFormulaDocs.percentileRank": "百分位等级", + "lensFormulaDocs.standardDeviation": "标准偏差", + "lensFormulaDocs.sum": "求和", + "lensFormulaDocs.timeScale": "按单位标准化", + "lensFormulaDocs.tinymath.absFunction.markdown": "\n计算绝对值。负值乘以 -1,正值保持不变。\n\n例如:计算平均海拔高度 `abs(average(altitude))`\n ", + "lensFormulaDocs.tinymath.addFunction.markdown": "\n将两个数值相加。\n还可以使用 `+` 符号。\n\n例如:计算两个字段的和\n\n`sum(price) + sum(tax)`\n\n例如:使计数偏移静态值\n\n`add(count(), 5)`\n ", + "lensFormulaDocs.tinymath.cbrtFunction.markdown": "\n值的立方根。\n\n例如:从体积计算边长\n`cbrt(last_value(volume))`\n ", + "lensFormulaDocs.tinymath.ceilFunction.markdown": "\n值的上限,向上舍入。\n\n例如:向上舍入价格\n`ceil(sum(price))`\n ", + "lensFormulaDocs.tinymath.clampFunction.markdown": "\n将值限制在最小值到最大值之间。\n\n例如:确保捕获离群值\n```\nclamp(\n average(bytes),\n percentile(bytes, percentile=5),\n percentile(bytes, percentile=95)\n)\n```\n", + "lensFormulaDocs.tinymath.cubeFunction.markdown": "\n计算数值的立方。\n\n例如:从边长计算体积\n`cube(last_value(length))`\n ", + "lensFormulaDocs.tinymath.defaultFunction.markdown": "\n值为 Null 时返回默认数值。\n\n例如:字段不包含数据时返回 -1\n`defaults(average(bytes), -1)`\n", + "lensFormulaDocs.tinymath.divideFunction.markdown": "\n将第一个数字除以第二个数字。\n还可以使用 `/` 符号\n\n例如:计算利润率\n`sum(profit) / sum(revenue)`\n\n例如:`divide(sum(bytes), 2)`\n ", + "lensFormulaDocs.tinymath.eqFunction.markdown": "\n在两个值之间执行相等比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `==` 符号。\n\n例如:如果平均字节数与平均内存容量完全相同,则返回 true\n`average(bytes) == average(memory)`\n\n示例:`eq(sum(bytes), 1000000)`\n ", + "lensFormulaDocs.tinymath.expFunction.markdown": "\n计算 *e* 的 n 次幂。\n\n例如:计算自然指数函数\n\n`exp(last_value(duration))`\n ", + "lensFormulaDocs.tinymath.fixFunction.markdown": "\n对于正值,取下限。对于负值,取上限。\n\n例如:正在向零舍入\n`fix(sum(profit))`\n ", + "lensFormulaDocs.tinymath.floorFunction.markdown": "\n向下舍入到最近整数值\n\n例如:向下舍入价格\n`floor(sum(price))`\n ", + "lensFormulaDocs.tinymath.gteFunction.markdown": "\n在两个值之间执行大于比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `>=` 符号。\n\n例如:如果平均字节数大于或等于平均内存容量,则返回 true\n`average(bytes) >= average(memory)`\n\n示例:`gte(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.gtFunction.markdown": "\n在两个值之间执行大于比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `>` 符号。\n\n例如:如果平均字节数大于平均内存容量,则返回 true\n`average(bytes) > average(memory)`\n\n示例:`gt(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.ifElseFunction.markdown": "\n返回某个值,取决于条件的元素是 true 还是 false。\n\n例如:每名客户的平均收入,但在某些情况下不提供客户 ID,这会计数为其他客户\n`sum(total)/(unique_count(customer_id) + ifelse( count() > count(kql='customer_id:*'), 1, 0))`\n ", + "lensFormulaDocs.tinymath.logFunction.markdown": "\n底数可选的对数。自然底数 *e* 用作默认值。\n\n例如:计算存储值所需的位数\n```\nlog(sum(bytes))\nlog(sum(bytes), 2)\n```\n ", + "lensFormulaDocs.tinymath.lteFunction.markdown": "\n在两个值之间执行小于或等于比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `<=` 符号。\n\n例如:如果平均字节数小于或等于平均内存容量,则返回 true\n`average(bytes) <= average(memory)`\n\n示例:`lte(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.ltFunction.markdown": "\n在两个值之间执行小于比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `<` 符号。\n\n例如:如果平均字节数小于平均内存容量,则返回 true\n`average(bytes) <= average(memory)`\n\n示例:`lt(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.maxFunction.markdown": "\n查找两个数字间的最大值。\n\n例如:查找两个字段平均值间的最大值\n`pick_max(average(bytes), average(memory))`\n ", + "lensFormulaDocs.tinymath.minFunction.markdown": "\n查找两个数字间的最小值。\n\n例如:查找两个字段平均值间的最小值\n`pick_min(average(bytes), average(memory))`\n ", + "lensFormulaDocs.tinymath.modFunction.markdown": "\n将函数除以数值后的余数\n\n例如:计算值的后三位数\n`mod(sum(price), 1000)`\n ", + "lensFormulaDocs.tinymath.multiplyFunction.markdown": "\n将两个数值相乘。\n还可以使用 `*` 符号。\n\n例如:计算现行税率后的价格\n`sum(bytes) * last_value(tax_rate)`\n\n例如:计算固定税率后的价格\n`multiply(sum(price), 1.2)`\n ", + "lensFormulaDocs.tinymath.powFunction.markdown": "\n计算该值的特定次幂。第二个参数必填\n\n例如:基于边长计算体积\n`pow(last_value(length), 3)`\n ", + "lensFormulaDocs.tinymath.roundFunction.markdown": "\n舍入到特定数目的小数位,默认为 0\n\n示例:舍入到百分\n```\nround(sum(bytes))\nround(sum(bytes), 2)\n```\n ", + "lensFormulaDocs.tinymath.sqrtFunction.markdown": "\n仅正值的平方根\n\n例如:基于面积计算边长\n`sqrt(last_value(area))`\n ", + "lensFormulaDocs.tinymath.squareFunction.markdown": "\n计算该值的 2 次幂\n\n例如:基于边长计算面积\n`square(last_value(length))`\n ", + "lensFormulaDocs.tinymath.subtractFunction.markdown": "\n从第二个数值减去第一个数值。\n还可以使用 `-` 符号。\n\n例如:计算字段的范围\n`subtract(max(bytes), min(bytes))`\n ", + "lensFormulaDocs.documentation.filterRatioDescription.markdown": "### 筛选比:\n\n使用 `kql=''` 筛选一个文档集,然后将其与相同分组中的其他文档进行比较。\n例如,要查看错误率随时间的推移如何变化:\n\n```\ncount(kql='response.status_code > 400') / count()\n```\n ", + "lensFormulaDocs.documentation.markdown": "## 工作原理\n\nLens 公式允许您使用 Elasticsearch 聚合和\n数学函数的组合进行数学计算。主要有三种类型的函数:\n\n* Elasticsearch 指标,如 `sum(bytes)`\n* 时间序列函数使用 Elasticsearch 指标作为输入,如 `cumulative_sum()`\n* 数学函数,如 `round()`\n\n使用所有这些函数的公式示例:\n\n```\nround(100 * moving_average(\naverage(cpu.load.pct),\nwindow=10,\nkql='datacenter.name: east*'\n))\n```\n\nElasticsearch 函数取可以用引号引起的字段名称。`sum(bytes)` 同于\nas `sum('bytes')`.\n\n一些函数取已命名参数,如 `moving_average(count(), window=5)`。\n\nElasticsearch 指标可以使用 KQL 或 Lucene 语法筛选。要添加筛选,请使用已命名\n参数 `kql='field: value'` 或 `lucene=''`。编写 KQL 或 Lucene 查询时,应始终使用\n单引号。如果您的搜索包含单引号,请使用反斜杠转义,如:`kql='Women's''\n\n数学函数可以取位置参数,如 pow(count(), 3) 与 count() * count() * count() 相同\n\n使用符号 +、-、/ 和 * 执行基本数学运算。\n ", + "lensFormulaDocs.documentation.percentOfTotalDescription.markdown": "### 总计的百分比\n\n公式可以计算所有分组的 `overall_sum`,\n其允许您将每个分组转成总计的百分比:\n\n```\nsum(products.base_price) / overall_sum(sum(products.base_price))\n```\n ", + "lensFormulaDocs.documentation.recentChangeDescription.markdown": "### 最近更改\n\n使用 `reducedTimeRange='30m'` 在与全局时间范围末尾相一致的指标时间范围上添加其他筛选。这可用于计算某个值在最近更改的幅度。\n\n```\nmax(system.network.in.bytes, reducedTimeRange=\"30m\")\n - min(system.network.in.bytes, reducedTimeRange=\"30m\")\n```\n ", + "lensFormulaDocs.documentation.weekOverWeekDescription.markdown": "### 周环比:\n\n使用 `shift='1w'` 以获取上一周每个分组\n的值。时间偏移不应与*排名最前值*函数一起使用。\n\n```\npercentile(system.network.in.bytes, percentile=99) /\npercentile(system.network.in.bytes, percentile=99, shift='1w')\n```\n ", + "lensFormulaDocs.cardinality.documentation.markdown": "\n计算指定字段的唯一值数目。适用于数字、字符串、日期和布尔值。\n\n例如:计算不同产品的数目:\n`unique_count(product.name)`\n\n例如:计算“clothes”组中不同产品的数目:\n`unique_count(product.name, kql='product.group=clothes')`\n ", + "lensFormulaDocs.count.documentation.markdown": "\n文档总数。提供字段时,将计算字段值的总数。将计数函数用于单个文档中具有多个值的字段时,将对所有值计数。\n\n#### 示例\n\n要计算文档总数,请使用 `count()`。\n\n要计算所有订单中产品的数量,请使用 `count(products.id)`。\n\n要计算与特定筛选匹配的文档数量,请使用 `count(kql='price > 500')`。\n ", + "lensFormulaDocs.counterRate.documentation.markdown": "\n计算不断增大的计数器的速率。此函数将仅基于计数器指标字段生成有帮助的结果,包括随着时间的推移度量某种单调递增。\n如果值确实变小,则其将此解析为计数器重置。要获取很精确的结果,应基于字段的 `max`计算 `counter_rate`。\n\n筛选或排名最前值维度定义的不同序列将分别执行此计算。\n用于公式中时,其使用当前时间间隔。\n\n例如:可视化随着时间的推移 Memcached 服务器接收的字节速率:\n`counter_rate(max(memcached.stats.read.bytes))`\n ", + "lensFormulaDocs.cumulativeSum.documentation.markdown": "\n计算随着时间的推移指标的累计和,即序列的所有以前值相加得出每个值。要使用此函数,您还需要配置 Date Histogram 维度。\n\n筛选或排名最前值维度定义的不同序列将分别执行此计算。\n\n例如:可视化随着时间的推移累计接收的字节:\n`cumulative_sum(sum(bytes))`\n ", + "lensFormulaDocs.differences.documentation.markdown": "\n计算随着时间的推移与指标最后一个值的差异。要使用此函数,您还需要配置 Date Histogram 维度。\n差异需要数据是顺序的。如果使用差异时数据为空,请尝试增加 Date Histogram 时间间隔。\n\n筛选或排名最前值维度定义的不同序列将分别执行此计算。\n\n例如:可视化随着时间的推移接收的字节的变化:\n`differences(sum(bytes))`\n ", + "lensFormulaDocs.lastValue.documentation.markdown": "\n返回最后一个文档的字段值,按数据视图的默认时间字段排序。\n\n此函数用于检索实体的最新状态。\n\n例如:获取服务器 A 的当前状态:\n`last_value(server.status, kql='server.name=\"A\"')`\n ", + "lensFormulaDocs.metric.documentation.markdown": "\n返回字段的 {metric}。此函数仅适用于数字字段。\n\n例如:获取价格的 {metric}:\n`{metric}(price)`\n\n例如:获取英国订单价格的 {metric}:\n`{metric}(price, kql='location:UK')`\n ", + "lensFormulaDocs.movingAverage.documentation.markdown": "\n计算随着时间的推移指标的移动平均值,即计算最后 n 个值的平均值以得出当前值。要使用此函数,您还需要配置 Date Histogram 维度。\n默认窗口值为 {defaultValue}。\n\n筛选或排名最前值维度定义的不同序列将分别执行此计算。\n\n取已命名参数 `window`,其指定当前值的平均计算中要包括过去多少个值。\n\n例如:平滑度量线:\n`moving_average(sum(bytes), window=5)`\n ", + "lensFormulaDocs.overall_average.documentation.markdown": "\n为当前图表中序列的所有数据点计算指标的平均值。序列由维度使用 Date Histogram 或时间间隔函数定义。\n分解数据的其他维度,如排名最前值或筛选,将被视为不同的序列。\n\n如果当前图表未使用 Date Histogram 或时间间隔函数,则无论使用什么函数,`overall_average` 都将计算所有维度的平均值\n\n例如:与平均值的偏离:\n`sum(bytes) - overall_average(sum(bytes))`\n ", + "lensFormulaDocs.overall_max.documentation.markdown": "\n为当前图表中序列的所有数据点计算指标的最大值。序列由维度使用 Date Histogram 或时间间隔函数定义。\n分解数据的其他维度,如排名最前值或筛选,将被视为不同的序列。\n\n如果当前图表未使用 Date Histogram 或内部函数,则无论使用什么函数,`overall_max` 都将计算所有维度的最大值\n\n例如:范围的百分比\n`(sum(bytes) - overall_min(sum(bytes))) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n ", + "lensFormulaDocs.overall_min.documentation.markdown": "\n为当前图表中序列的所有数据点计算指标的最小值。序列由维度使用 Date Histogram 或时间间隔函数定义。\n分解数据的其他维度,如排名最前值或筛选,将被视为不同的序列。\n\n如果当前图表未使用 Date Histogram 或时间间隔函数,则无论使用什么函数,`overall_min` 都将计算所有维度的最小值\n\n例如:范围的百分比\n`(sum(bytes) - overall_min(sum(bytes)) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n ", + "lensFormulaDocs.overall_sum.documentation.markdown": "\n计算当前图表中序列所有数据点的指标的和。序列由维度使用 Date Histogram 或时间间隔函数定义。\n分解数据的其他维度,如排名最前值或筛选,将被视为不同的序列。\n\n如果当前图表未使用 Date Histogram 或时间间隔函数,则无论使用什么函数,`overall_sum` 都将计算所有维度的和。\n\n例如:总计的百分比\n`sum(bytes) / overall_sum(sum(bytes))`\n ", + "lensFormulaDocs.percentile.documentation.markdown": "\n返回字段的值的指定百分位数。文档中百分之 n 的值比此值小。\n\n例如:获取大于 95 % 的值的字节数:\n`percentile(bytes, percentile=95)`\n ", + "lensFormulaDocs.percentileRanks.documentation.markdown": "\n返回小于某个值的值的百分比。例如,如果某个值大于或等于 95% 的观察值,则称它处于第 95 个百分位等级\n\n例如:获取小于 100 的值的百分比:\n`percentile_rank(bytes, value=100)`\n ", + "lensFormulaDocs.standardDeviation.documentation.markdown": "\n返回字段的变量或差量数量。此函数仅适用于数字字段。\n\n#### 示例\n\n要获取价格的标准偏差,请使用 `standard_deviation(price)`。\n\n要获取来自英国的订单的价格方差,请使用 `square(standard_deviation(price, kql='location:UK'))`。\n ", + "lensFormulaDocs.time_scale.documentation.markdown": "\n\n此高级函数用于将计数和总和标准化为特定时间间隔。它允许集成所存储的已标准化为特定时间间隔的指标。\n\n此函数只能在当前图表中使用了日期直方图函数时使用。\n\n例如:将已标准化指标与其他需要标准化的指标进行比较的比率。\n`normalize_by_unit(counter_rate(max(system.diskio.write.bytes)), unit='s') / last_value(apache.status.bytes_per_second)`\n ", "links.contentManagement.saveModalTitle": "将 {contentId} 面板保存到库", "links.externalLink.editor.urlFormatError": "格式无效。示例:{exampleUrl}", "links.dashboardLink.description": "前往仪表板", @@ -21938,54 +22005,6 @@ "xpack.lens.xyVisualization.dataTypeFailureXShort": "{axis} 的数据类型错误。", "xpack.lens.xyVisualization.dataTypeFailureYLong": "为 {axis} 提供的维度 {label} 具有错误的数据类型。应为数字,但却为 {dataType}", "xpack.lens.xyVisualization.dataTypeFailureYShort": "{axis} 的数据类型错误。", - "xpack.lens.formula.absFunction.markdown": "\n计算绝对值。负值乘以 -1,正值保持不变。\n\n例如:计算平均海拔高度 `abs(average(altitude))`\n ", - "xpack.lens.formula.addFunction.markdown": "\n将两个数值相加。\n还可以使用 `+` 符号。\n\n例如:计算两个字段的和\n\n`sum(price) + sum(tax)`\n\n例如:使计数偏移静态值\n\n`add(count(), 5)`\n ", - "xpack.lens.formula.cbrtFunction.markdown": "\n值的立方根。\n\n例如:从体积计算边长\n`cbrt(last_value(volume))`\n ", - "xpack.lens.formula.ceilFunction.markdown": "\n值的上限,向上舍入。\n\n例如:向上舍入价格\n`ceil(sum(price))`\n ", - "xpack.lens.formula.clampFunction.markdown": "\n将值限制在最小值到最大值之间。\n\n例如:确保捕获离群值\n```\nclamp(\n average(bytes),\n percentile(bytes, percentile=5),\n percentile(bytes, percentile=95)\n)\n```\n", - "xpack.lens.formula.cubeFunction.markdown": "\n计算数值的立方。\n\n例如:从边长计算体积\n`cube(last_value(length))`\n ", - "xpack.lens.formula.defaultFunction.markdown": "\n值为 Null 时返回默认数值。\n\n例如:字段不包含数据时返回 -1\n`defaults(average(bytes), -1)`\n", - "xpack.lens.formula.divideFunction.markdown": "\n将第一个数字除以第二个数字。\n还可以使用 `/` 符号\n\n例如:计算利润率\n`sum(profit) / sum(revenue)`\n\n例如:`divide(sum(bytes), 2)`\n ", - "xpack.lens.formula.eqFunction.markdown": "\n在两个值之间执行相等比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `==` 符号。\n\n例如:如果平均字节数与平均内存容量完全相同,则返回 true\n`average(bytes) == average(memory)`\n\n示例:`eq(sum(bytes), 1000000)`\n ", - "xpack.lens.formula.expFunction.markdown": "\n计算 *e* 的 n 次幂。\n\n例如:计算自然指数函数\n\n`exp(last_value(duration))`\n ", - "xpack.lens.formula.fixFunction.markdown": "\n对于正值,取下限。对于负值,取上限。\n\n例如:正在向零舍入\n`fix(sum(profit))`\n ", - "xpack.lens.formula.floorFunction.markdown": "\n向下舍入到最近整数值\n\n例如:向下舍入价格\n`floor(sum(price))`\n ", - "xpack.lens.formula.gteFunction.markdown": "\n在两个值之间执行大于比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `>=` 符号。\n\n例如:如果平均字节数大于或等于平均内存容量,则返回 true\n`average(bytes) >= average(memory)`\n\n示例:`gte(average(bytes), 1000)`\n ", - "xpack.lens.formula.gtFunction.markdown": "\n在两个值之间执行大于比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `>` 符号。\n\n例如:如果平均字节数大于平均内存容量,则返回 true\n`average(bytes) > average(memory)`\n\n示例:`gt(average(bytes), 1000)`\n ", - "xpack.lens.formula.ifElseFunction.markdown": "\n返回某个值,取决于条件的元素是 true 还是 false。\n\n例如:每名客户的平均收入,但在某些情况下不提供客户 ID,这会计数为其他客户\n`sum(total)/(unique_count(customer_id) + ifelse( count() > count(kql='customer_id:*'), 1, 0))`\n ", - "xpack.lens.formula.logFunction.markdown": "\n底数可选的对数。自然底数 *e* 用作默认值。\n\n例如:计算存储值所需的位数\n```\nlog(sum(bytes))\nlog(sum(bytes), 2)\n```\n ", - "xpack.lens.formula.lteFunction.markdown": "\n在两个值之间执行小于或等于比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `<=` 符号。\n\n例如:如果平均字节数小于或等于平均内存容量,则返回 true\n`average(bytes) <= average(memory)`\n\n示例:`lte(average(bytes), 1000)`\n ", - "xpack.lens.formula.ltFunction.markdown": "\n在两个值之间执行小于比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `<` 符号。\n\n例如:如果平均字节数小于平均内存容量,则返回 true\n`average(bytes) <= average(memory)`\n\n示例:`lt(average(bytes), 1000)`\n ", - "xpack.lens.formula.maxFunction.markdown": "\n查找两个数字间的最大值。\n\n例如:查找两个字段平均值间的最大值\n`pick_max(average(bytes), average(memory))`\n ", - "xpack.lens.formula.minFunction.markdown": "\n查找两个数字间的最小值。\n\n例如:查找两个字段平均值间的最小值\n`pick_min(average(bytes), average(memory))`\n ", - "xpack.lens.formula.modFunction.markdown": "\n将函数除以数值后的余数\n\n例如:计算值的后三位数\n`mod(sum(price), 1000)`\n ", - "xpack.lens.formula.multiplyFunction.markdown": "\n将两个数值相乘。\n还可以使用 `*` 符号。\n\n例如:计算现行税率后的价格\n`sum(bytes) * last_value(tax_rate)`\n\n例如:计算固定税率后的价格\n`multiply(sum(price), 1.2)`\n ", - "xpack.lens.formula.powFunction.markdown": "\n计算该值的特定次幂。第二个参数必填\n\n例如:基于边长计算体积\n`pow(last_value(length), 3)`\n ", - "xpack.lens.formula.roundFunction.markdown": "\n舍入到特定数目的小数位,默认为 0\n\n示例:舍入到百分\n```\nround(sum(bytes))\nround(sum(bytes), 2)\n```\n ", - "xpack.lens.formula.sqrtFunction.markdown": "\n仅正值的平方根\n\n例如:基于面积计算边长\n`sqrt(last_value(area))`\n ", - "xpack.lens.formula.squareFunction.markdown": "\n计算该值的 2 次幂\n\n例如:基于边长计算面积\n`square(last_value(length))`\n ", - "xpack.lens.formula.subtractFunction.markdown": "\n从第二个数值减去第一个数值。\n还可以使用 `-` 符号。\n\n例如:计算字段的范围\n`subtract(max(bytes), min(bytes))`\n ", - "xpack.lens.formulaDocumentation.filterRatioDescription.markdown": "### 筛选比:\n\n使用 `kql=''` 筛选一个文档集,然后将其与相同分组中的其他文档进行比较。\n例如,要查看错误率随时间的推移如何变化:\n\n```\ncount(kql='response.status_code > 400') / count()\n```\n ", - "xpack.lens.formulaDocumentation.markdown": "## 工作原理\n\nLens 公式允许您使用 Elasticsearch 聚合和\n数学函数的组合进行数学计算。主要有三种类型的函数:\n\n* Elasticsearch 指标,如 `sum(bytes)`\n* 时间序列函数使用 Elasticsearch 指标作为输入,如 `cumulative_sum()`\n* 数学函数,如 `round()`\n\n使用所有这些函数的公式示例:\n\n```\nround(100 * moving_average(\naverage(cpu.load.pct),\nwindow=10,\nkql='datacenter.name: east*'\n))\n```\n\nElasticsearch 函数取可以用引号引起的字段名称。`sum(bytes)` 同于\nas `sum('bytes')`.\n\n一些函数取已命名参数,如 `moving_average(count(), window=5)`。\n\nElasticsearch 指标可以使用 KQL 或 Lucene 语法筛选。要添加筛选,请使用已命名\n参数 `kql='field: value'` 或 `lucene=''`。编写 KQL 或 Lucene 查询时,应始终使用\n单引号。如果您的搜索包含单引号,请使用反斜杠转义,如:`kql='Women's''\n\n数学函数可以取位置参数,如 pow(count(), 3) 与 count() * count() * count() 相同\n\n使用符号 +、-、/ 和 * 执行基本数学运算。\n ", - "xpack.lens.formulaDocumentation.percentOfTotalDescription.markdown": "### 总计的百分比\n\n公式可以计算所有分组的 `overall_sum`,\n其允许您将每个分组转成总计的百分比:\n\n```\nsum(products.base_price) / overall_sum(sum(products.base_price))\n```\n ", - "xpack.lens.formulaDocumentation.recentChangeDescription.markdown": "### 最近更改\n\n使用 `reducedTimeRange='30m'` 在与全局时间范围末尾相一致的指标时间范围上添加其他筛选。这可用于计算某个值在最近更改的幅度。\n\n```\nmax(system.network.in.bytes, reducedTimeRange=\"30m\")\n - min(system.network.in.bytes, reducedTimeRange=\"30m\")\n```\n ", - "xpack.lens.formulaDocumentation.weekOverWeekDescription.markdown": "### 周环比:\n\n使用 `shift='1w'` 以获取上一周每个分组\n的值。时间偏移不应与*排名最前值*函数一起使用。\n\n```\npercentile(system.network.in.bytes, percentile=99) /\npercentile(system.network.in.bytes, percentile=99, shift='1w')\n```\n ", - "xpack.lens.indexPattern.cardinality.documentation.markdown": "\n计算指定字段的唯一值数目。适用于数字、字符串、日期和布尔值。\n\n例如:计算不同产品的数目:\n`unique_count(product.name)`\n\n例如:计算“clothes”组中不同产品的数目:\n`unique_count(product.name, kql='product.group=clothes')`\n ", - "xpack.lens.indexPattern.count.documentation.markdown": "\n文档总数。提供字段时,将计算字段值的总数。将计数函数用于单个文档中具有多个值的字段时,将对所有值计数。\n\n#### 示例\n\n要计算文档总数,请使用 `count()`。\n\n要计算所有订单中产品的数量,请使用 `count(products.id)`。\n\n要计算与特定筛选匹配的文档数量,请使用 `count(kql='price > 500')`。\n ", - "xpack.lens.indexPattern.counterRate.documentation.markdown": "\n计算不断增大的计数器的速率。此函数将仅基于计数器指标字段生成有帮助的结果,包括随着时间的推移度量某种单调递增。\n如果值确实变小,则其将此解析为计数器重置。要获取很精确的结果,应基于字段的 `max`计算 `counter_rate`。\n\n筛选或排名最前值维度定义的不同序列将分别执行此计算。\n用于公式中时,其使用当前时间间隔。\n\n例如:可视化随着时间的推移 Memcached 服务器接收的字节速率:\n`counter_rate(max(memcached.stats.read.bytes))`\n ", - "xpack.lens.indexPattern.cumulativeSum.documentation.markdown": "\n计算随着时间的推移指标的累计和,即序列的所有以前值相加得出每个值。要使用此函数,您还需要配置 Date Histogram 维度。\n\n筛选或排名最前值维度定义的不同序列将分别执行此计算。\n\n例如:可视化随着时间的推移累计接收的字节:\n`cumulative_sum(sum(bytes))`\n ", - "xpack.lens.indexPattern.differences.documentation.markdown": "\n计算随着时间的推移与指标最后一个值的差异。要使用此函数,您还需要配置 Date Histogram 维度。\n差异需要数据是顺序的。如果使用差异时数据为空,请尝试增加 Date Histogram 时间间隔。\n\n筛选或排名最前值维度定义的不同序列将分别执行此计算。\n\n例如:可视化随着时间的推移接收的字节的变化:\n`differences(sum(bytes))`\n ", - "xpack.lens.indexPattern.lastValue.documentation.markdown": "\n返回最后一个文档的字段值,按数据视图的默认时间字段排序。\n\n此函数用于检索实体的最新状态。\n\n例如:获取服务器 A 的当前状态:\n`last_value(server.status, kql='server.name=\"A\"')`\n ", - "xpack.lens.indexPattern.metric.documentation.markdown": "\n返回字段的 {metric}。此函数仅适用于数字字段。\n\n例如:获取价格的 {metric}:\n`{metric}(price)`\n\n例如:获取英国订单价格的 {metric}:\n`{metric}(price, kql='location:UK')`\n ", - "xpack.lens.indexPattern.movingAverage.documentation.markdown": "\n计算随着时间的推移指标的移动平均值,即计算最后 n 个值的平均值以得出当前值。要使用此函数,您还需要配置 Date Histogram 维度。\n默认窗口值为 {defaultValue}。\n\n筛选或排名最前值维度定义的不同序列将分别执行此计算。\n\n取已命名参数 `window`,其指定当前值的平均计算中要包括过去多少个值。\n\n例如:平滑度量线:\n`moving_average(sum(bytes), window=5)`\n ", - "xpack.lens.indexPattern.overall_average.documentation.markdown": "\n为当前图表中序列的所有数据点计算指标的平均值。序列由维度使用 Date Histogram 或时间间隔函数定义。\n分解数据的其他维度,如排名最前值或筛选,将被视为不同的序列。\n\n如果当前图表未使用 Date Histogram 或时间间隔函数,则无论使用什么函数,`overall_average` 都将计算所有维度的平均值\n\n例如:与平均值的偏离:\n`sum(bytes) - overall_average(sum(bytes))`\n ", - "xpack.lens.indexPattern.overall_max.documentation.markdown": "\n为当前图表中序列的所有数据点计算指标的最大值。序列由维度使用 Date Histogram 或时间间隔函数定义。\n分解数据的其他维度,如排名最前值或筛选,将被视为不同的序列。\n\n如果当前图表未使用 Date Histogram 或内部函数,则无论使用什么函数,`overall_max` 都将计算所有维度的最大值\n\n例如:范围的百分比\n`(sum(bytes) - overall_min(sum(bytes))) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n ", - "xpack.lens.indexPattern.overall_min.documentation.markdown": "\n为当前图表中序列的所有数据点计算指标的最小值。序列由维度使用 Date Histogram 或时间间隔函数定义。\n分解数据的其他维度,如排名最前值或筛选,将被视为不同的序列。\n\n如果当前图表未使用 Date Histogram 或时间间隔函数,则无论使用什么函数,`overall_min` 都将计算所有维度的最小值\n\n例如:范围的百分比\n`(sum(bytes) - overall_min(sum(bytes)) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n ", - "xpack.lens.indexPattern.overall_sum.documentation.markdown": "\n计算当前图表中序列所有数据点的指标的和。序列由维度使用 Date Histogram 或时间间隔函数定义。\n分解数据的其他维度,如排名最前值或筛选,将被视为不同的序列。\n\n如果当前图表未使用 Date Histogram 或时间间隔函数,则无论使用什么函数,`overall_sum` 都将计算所有维度的和。\n\n例如:总计的百分比\n`sum(bytes) / overall_sum(sum(bytes))`\n ", - "xpack.lens.indexPattern.percentile.documentation.markdown": "\n返回字段的值的指定百分位数。文档中百分之 n 的值比此值小。\n\n例如:获取大于 95 % 的值的字节数:\n`percentile(bytes, percentile=95)`\n ", - "xpack.lens.indexPattern.percentileRanks.documentation.markdown": "\n返回小于某个值的值的百分比。例如,如果某个值大于或等于 95% 的观察值,则称它处于第 95 个百分位等级\n\n例如:获取小于 100 的值的百分比:\n`percentile_rank(bytes, value=100)`\n ", - "xpack.lens.indexPattern.standardDeviation.documentation.markdown": "\n返回字段的变量或差量数量。此函数仅适用于数字字段。\n\n#### 示例\n\n要获取价格的标准偏差,请使用 `standard_deviation(price)`。\n\n要获取来自英国的订单的价格方差,请使用 `square(standard_deviation(price, kql='location:UK'))`。\n ", - "xpack.lens.indexPattern.time_scale.documentation.markdown": "\n\n此高级函数用于将计数和总和标准化为特定时间间隔。它允许集成所存储的已标准化为特定时间间隔的指标。\n\n此函数只能在当前图表中使用了日期直方图函数时使用。\n\n例如:将已标准化指标与其他需要标准化的指标进行比较的比率。\n`normalize_by_unit(counter_rate(max(system.diskio.write.bytes)), unit='s') / last_value(apache.status.bytes_per_second)`\n ", "xpack.lens.AggBasedLabel": "基于聚合的可视化", "xpack.lens.app.addToLibrary": "保存到库", "xpack.lens.app.cancel": "取消", @@ -22163,11 +22182,11 @@ "xpack.lens.fittingFunctionsTitle.lookahead": "下一个", "xpack.lens.fittingFunctionsTitle.none": "隐藏", "xpack.lens.fittingFunctionsTitle.zero": "零", - "xpack.lens.formula.base": "底数", - "xpack.lens.formula.boolean": "布尔值", - "xpack.lens.formula.condition": "条件", - "xpack.lens.formula.decimals": "小数", - "xpack.lens.formula.defaultValue": "默认值", + "lensFormulaDocs.tinymath.base": "底数", + "lensFormulaDocs.boolean": "布尔值", + "lensFormulaDocs.tinymath.condition": "条件", + "lensFormulaDocs.tinymath.decimals": "小数", + "lensFormulaDocs.tinymath.defaultValue": "默认值", "xpack.lens.formula.disableWordWrapLabel": "禁用自动换行", "xpack.lens.formula.editorHelpInlineHideLabel": "隐藏函数引用", "xpack.lens.formula.editorHelpInlineHideToolTip": "隐藏函数引用", @@ -22175,35 +22194,22 @@ "xpack.lens.formula.fullScreenEnterLabel": "展开", "xpack.lens.formula.fullScreenExitLabel": "折叠", "xpack.lens.formula.kqlExtraArguments": "[kql]?: string, [lucene]?: string", - "xpack.lens.formula.left": "左", - "xpack.lens.formula.max": "最大值", - "xpack.lens.formula.min": "最小值", - "xpack.lens.formula.number": "数字", + "lensFormulaDocs.tinymath.left": "左", "xpack.lens.formula.reducedTimeRangeExtraArguments": "[reducedTimeRange]?: 字符串", "xpack.lens.formula.requiredArgument": "必需", - "xpack.lens.formula.right": "右", + "lensFormulaDocs.tinymath.right": "右", "xpack.lens.formula.shiftExtraArguments": "[shift]?: string", - "xpack.lens.formula.string": "字符串", - "xpack.lens.formula.value": "值", - "xpack.lens.formulaCommonFormulaDocumentation": "最常见的公式是将两个值相除以得到百分比。要精确显示,请将“value format”设置为“percent”。", - "xpack.lens.formulaDocumentation.columnCalculationSection": "列计算", - "xpack.lens.formulaDocumentation.columnCalculationSectionDescription": "每行都执行这些函数,但系统会为这些函数提供整列作为上下文。这也称作窗口函数。", - "xpack.lens.formulaDocumentation.comparisonSection": "对比", - "xpack.lens.formulaDocumentation.comparisonSectionDescription": "这些函数用于执行值比较。", - "xpack.lens.formulaDocumentation.constantsSection": "Kibana 上下文", - "xpack.lens.formulaDocumentation.constantsSectionDescription": "这些函数用于检索 Kibana 上下文变量,它们包括日期直方图 `interval`、当前 `now` 和选定 `time_range`,并帮助您计算日期数学运算。", - "xpack.lens.formulaDocumentation.elasticsearchSection": "Elasticsearch", - "xpack.lens.formulaDocumentation.elasticsearchSectionDescription": "在原始文档上结果列表的每行都将执行这些函数,从而将匹配分解维度的所有文档聚合成单值。", - "xpack.lens.formulaDocumentation.filterRatio": "筛选比", - "xpack.lens.formulaDocumentation.mathSection": "数学", - "xpack.lens.formulaDocumentation.mathSectionDescription": "结果表的每行使用相同行中使用其他函数计算的单值执行这些函数。", - "xpack.lens.formulaDocumentation.percentOfTotal": "总计的百分比", - "xpack.lens.formulaDocumentation.recentChange": "最近更改", - "xpack.lens.formulaDocumentation.weekOverWeek": "周环比", + "lensFormulaDocs.tinymath.value": "值", + "lensFormulaDocs.documentation.filterRatio": "筛选比", + "lensFormulaDocs.documentation.mathSection": "数学", + "lensFormulaDocs.documentation.mathSectionDescription": "结果表的每行使用相同行中使用其他函数计算的单值执行这些函数。", + "lensFormulaDocs.documentation.percentOfTotal": "总计的百分比", + "lensFormulaDocs.documentation.recentChange": "最近更改", + "lensFormulaDocs.documentation.weekOverWeek": "周环比", "xpack.lens.formulaDocumentationHeading": "运作方式", "xpack.lens.formulaEnableWordWrapLabel": "启用自动换行", "xpack.lens.formulaExampleMarkdown": "示例", - "xpack.lens.formulaFrequentlyUsedHeading": "常用公式", + "lensFormulaDocs.frequentlyUsedHeading": "常用公式", "xpack.lens.formulaPlaceholderText": "通过将函数与数学表达式组合来键入公式,如:", "xpack.lens.fullExtent.niceValues": "舍入到优先值", "xpack.lens.functions.collapse.args.byHelpText": "要作为分组依据的列 - 这些列将保持原样", @@ -22262,29 +22268,24 @@ "xpack.lens.indexPattern.allFieldsLabelHelp": "将可用字段拖放到工作区并创建可视化。要更改可用字段,请选择不同数据视图,编辑您的查询或使用不同时间范围。一些字段类型无法在 Lens 中可视化,包括全文本字段和地理字段。", "xpack.lens.indexPattern.ascendingCountPrecisionErrorWarning.link": "访问文档", "xpack.lens.indexPattern.availableFieldsLabel": "可用字段", - "xpack.lens.indexPattern.avg": "平均值", "xpack.lens.indexPattern.avg.description": "单值指标聚合,计算从聚合文档提取的数值的平均值", "xpack.lens.indexPattern.avg.quickFunctionDescription": "一组数字字段的平均值。", "xpack.lens.indexPattern.bitsFormatLabel": "位 (1000)", "xpack.lens.indexPattern.bytesFormatLabel": "字节 (1024)", - "xpack.lens.indexPattern.cardinality": "唯一计数", "xpack.lens.indexPattern.cardinality.documentation.quick": "\n指定数字、字符串、日期或布尔值字段的唯一值的数目。\n ", - "xpack.lens.indexPattern.cardinality.signature": "field: string", + "lensFormulaDocs.cardinality.signature": "field: string", "xpack.lens.indexPattern.changeDataViewTitle": "数据视图", "xpack.lens.indexPattern.chooseField": "字段", "xpack.lens.indexPattern.chooseFieldLabel": "要使用此函数,请选择字段。", "xpack.lens.indexPattern.chooseSubFunction": "选择子函数", "xpack.lens.indexPattern.columnFormatLabel": "值格式", "xpack.lens.indexPattern.compactLabel": "紧凑值", - "xpack.lens.indexPattern.count": "计数", "xpack.lens.indexPattern.count.documentation.quick": "\n文档总数。提供字段时,将计算字段值的总数。将计数函数用于单个文档中具有多个值的字段时,将对所有值计数。\n ", - "xpack.lens.indexPattern.count.signature": "[字段:字符串]", - "xpack.lens.indexPattern.counterRate": "计数率", + "lensFormulaDocs.count.signature": "[字段:字符串]", "xpack.lens.indexPattern.counterRate.documentation.quick": "\n 不断增长的时间序列指标一段时间的更改速率。\n ", - "xpack.lens.indexPattern.counterRate.signature": "指标:数字", + "lensFormulaDocs.counterRate.signature": "指标:数字", "xpack.lens.indexPattern.countOf": "记录计数", - "xpack.lens.indexPattern.cumulative_sum.signature": "指标:数字", - "xpack.lens.indexPattern.cumulativeSum": "累计和", + "lensFormulaDocs.cumulative_sum.signature": "指标:数字", "xpack.lens.indexPattern.cumulativeSum.documentation.quick": "\n 随时间增长的所有值的总和。\n ", "xpack.lens.indexPattern.custom.externalDoc": "数字格式语法", "xpack.lens.indexPattern.custom.patternLabel": "格式", @@ -22314,9 +22315,8 @@ "xpack.lens.indexPattern.dateRange.noTimeRange": "当前时间范围时间间隔不可用", "xpack.lens.indexPattern.decimalPlacesLabel": "小数", "xpack.lens.indexPattern.defaultFormatLabel": "默认", - "xpack.lens.indexPattern.derivative": "差异", "xpack.lens.indexPattern.differences.documentation.quick": "\n 后续时间间隔中的值之间的更改情况。\n ", - "xpack.lens.indexPattern.differences.signature": "指标:数字", + "lensFormulaDocs.differences.signature": "指标:数字", "xpack.lens.indexPattern.dimensionEditor.headingAppearance": "外观", "xpack.lens.indexPattern.dimensionEditor.headingData": "数据", "xpack.lens.indexPattern.dimensionEditor.headingFormula": "公式", @@ -22369,30 +22369,25 @@ "xpack.lens.indexPattern.invalidOperationLabel": "此字段不适用于选定函数。", "xpack.lens.indexPattern.invalidReducedTimeRange": "缩小的时间范围无效。输入正整数数量,后跟以下单位之一:s、m、h、d、w、M、y。例如,3h 表示 3 小时", "xpack.lens.indexPattern.invalidTimeShift": "时间偏移无效。输入正整数数量,后跟以下单位之一:s、m、h、d、w、M、y。例如,3h 表示 3 小时", - "xpack.lens.indexPattern.lastValue": "最后值", "xpack.lens.indexPattern.lastValue.disabled": "此功能要求数据视图中存在日期字段", "xpack.lens.indexPattern.lastValue.documentation.quick": "\n最后一个文档的字段值,按数据视图的默认时间字段排序。\n ", "xpack.lens.indexPattern.lastValue.showArrayValues": "显示数组值", "xpack.lens.indexPattern.lastValue.showArrayValuesExplanation": "显示与最后每个文档中的此字段关联的所有值。", "xpack.lens.indexPattern.lastValue.showArrayValuesWithTopValuesWarning": "显示数组值时,无法使用此字段对排名最前值排名。", - "xpack.lens.indexPattern.lastValue.signature": "field: string", + "lensFormulaDocs.lastValue.signature": "field: string", "xpack.lens.indexPattern.lastValue.sortField": "按日期字段排序", "xpack.lens.indexPattern.lastValue.sortFieldPlaceholder": "排序字段", - "xpack.lens.indexPattern.max": "最大值", "xpack.lens.indexPattern.max.description": "单值指标聚合,返回从聚合文档提取的数值中的最大值。", "xpack.lens.indexPattern.max.quickFunctionDescription": "数字字段的最大值。", - "xpack.lens.indexPattern.median": "中值", "xpack.lens.indexPattern.median.description": "单值指标聚合,计算从聚合文档提取的中值。", "xpack.lens.indexPattern.median.quickFunctionDescription": "数字字段的中值。", "xpack.lens.indexPattern.metaFieldsLabel": "元字段", - "xpack.lens.indexPattern.metric.signature": "field: string", - "xpack.lens.indexPattern.min": "最小值", + "lensFormulaDocs.metric.signature": "field: string", "xpack.lens.indexPattern.min.description": "单值指标聚合,返回从聚合文档提取的数值中的最小值。", "xpack.lens.indexPattern.min.quickFunctionDescription": "数字字段的最小值。", "xpack.lens.indexPattern.missingFieldLabel": "缺失字段", "xpack.lens.indexPattern.moveToWorkspaceNotAvailable": "要可视化此字段,请直接将其添加到所需图层。根据您当前的配置,不支持将此字段添加到工作区。", - "xpack.lens.indexPattern.moving_average.signature": "指标:数字,[window]:数字", - "xpack.lens.indexPattern.movingAverage": "移动平均值", + "lensFormulaDocs.moving_average.signature": "指标:数字,[window]:数字", "xpack.lens.indexPattern.movingAverage.basicExplanation": "移动平均值在数据上滑动时间窗并显示平均值。仅日期直方图支持移动平均值。", "xpack.lens.indexPattern.movingAverage.documentation.quick": "\n 一段时间中移动窗口值的平均值。\n ", "xpack.lens.indexPattern.movingAverage.limitations": "第一个移动平均值开始于第二项。", @@ -22408,20 +22403,15 @@ "xpack.lens.indexPattern.noRealMetricError": "仅包含静态值的图层将不显示结果,请至少使用一个动态指标", "xpack.lens.indexPattern.notAbsoluteTimeShift": "时间偏移无效。", "xpack.lens.indexPattern.numberFormatLabel": "数字", - "xpack.lens.indexPattern.overall_metric": "指标:数字", - "xpack.lens.indexPattern.overallMax": "总体最大值", - "xpack.lens.indexPattern.overallMin": "总体最小值", - "xpack.lens.indexPattern.overallSum": "总和", + "lensFormulaDocs.overall_metric": "指标:数字", "xpack.lens.indexPattern.percentFormatLabel": "百分比", - "xpack.lens.indexPattern.percentile": "百分位数", "xpack.lens.indexPattern.percentile.documentation.quick": "\n 小于所有文档中出现值的 n% 的最大值。\n ", "xpack.lens.indexPattern.percentile.percentileRanksValue": "百分位等级值", "xpack.lens.indexPattern.percentile.percentileValue": "百分位数", - "xpack.lens.indexPattern.percentile.signature": "field: string, [percentile]: number", - "xpack.lens.indexPattern.percentileRank": "百分位等级", + "lensFormulaDocs.percentile.signature": "field: string, [percentile]: number", "xpack.lens.indexPattern.percentileRanks.documentation.quick": "\n小于特定值的值的百分比。例如,如果某个值大于或等于 95% 的计算值,则该值处于第 95 个百分位等级。\n ", "xpack.lens.indexPattern.percentileRanks.errorMessage": "百分位等级值必须为数字", - "xpack.lens.indexPattern.percentileRanks.signature": "字段:字符串,[值]:数字", + "lensFormulaDocs.percentileRanks.signature": "字段:字符串,[值]:数字", "xpack.lens.indexPattern.precisionErrorWarning.accuracyDisabled.shortMessage": "这可能为近似值。要获得更精确的结果,可以启用准确性模式,但这会增加 Elasticsearch 集群的负载。", "xpack.lens.indexPattern.precisionErrorWarning.accuracyEnabled.shortMessage": "这可能为近似值。要获得更精确的结果,请使用筛选或增加排名最前值的数量。", "xpack.lens.indexPattern.precisionErrorWarning.ascendingCountPrecisionErrorWarning.shortMessage": "这可能为近似值,具体取决于如何索引数据。要获得更精确的结果,请按稀有度排序。", @@ -22471,7 +22461,6 @@ "xpack.lens.indexPattern.samplingPerLayer.fallbackLayerName": "数据图层", "xpack.lens.indexPattern.settingsSamplingUnsupported": "选择此函数会将该图层的采样更改为 100% 以便正常运行。", "xpack.lens.indexPattern.sortField.invalid": "字段无效。检查数据视图或选取其他字段。", - "xpack.lens.indexPattern.standardDeviation": "标准偏差", "xpack.lens.indexPattern.standardDeviation.description": "单值指标聚合,计算从聚合文档提取的数值的标准偏差", "xpack.lens.indexPattern.standardDeviation.quickFunctionDescription": "数字字段值的标准偏差,即字段值的变动幅度。", "xpack.lens.indexPattern.staticValue.label": "参考线值", @@ -22481,7 +22470,6 @@ "xpack.lens.indexPattern.staticValueWarningText": "要覆盖静态值,请选择快速函数", "xpack.lens.indexPattern.suffixLabel": "后缀", "xpack.lens.indexpattern.suggestions.overTimeLabel": "时移", - "xpack.lens.indexPattern.sum": "求和", "xpack.lens.indexPattern.sum.description": "单值指标聚合,对从聚合文档提取的数值求和。", "xpack.lens.indexPattern.sum.quickFunctionDescription": "数字字段值的总数。", "xpack.lens.indexPattern.switchToRare": "按稀有度排名", @@ -22519,8 +22507,7 @@ "xpack.lens.indexPattern.terms.size": "值数目", "xpack.lens.indexPattern.termsWithMultipleShifts": "在单个图层中,无法将指标与不同时间偏移和动态排名最前值组合。将相同的时间偏移值用于所有指标或使用筛选,而非排名最前值。", "xpack.lens.indexPattern.termsWithMultipleShiftsFixActionLabel": "使用筛选", - "xpack.lens.indexPattern.time_scale": "指标:数字,单位:s|m|h|d|w|M|y", - "xpack.lens.indexPattern.timeScale": "按单位标准化", + "lensFormulaDocs.time_scale": "指标:数字,单位:s|m|h|d|w|M|y", "xpack.lens.indexPattern.timeScale.label": "按单位标准化", "xpack.lens.indexPattern.timeScale.missingUnit": "没有为按单位标准化指定单位。", "xpack.lens.indexPattern.timeScale.tooltip": "将值标准化为始终显示为每指定时间单位速率,无论基础日期时间间隔是多少。", @@ -40368,7 +40355,6 @@ "xpack.transform.transformSettingsValidations.numberOfRetriesInvalidErrorMessage": "重试次数需要介于 0 和 100 之间,或为 -1(表示无限重试)。", "xpack.transform.transformSettingValidations.maxPageSearchSizeInvalidMessage": "最大页面搜索大小需要是介于 10 到 65536 之间的整数。", "xpack.transform.transformSettingValidations.numberGreaterThanOrEqualToNegativeOneNotValidErrorMessage": "重试次数需要介于 0 和 100 之间,或为 -1(表示无限重试)。", - "xpack.transform.transformSettingValidations.numberRange10To10000NotValidErrorMessage": "值必须是介于 10 到 10000 之间的整数。", "xpack.transform.transformSettingValidations.retentionPolicyMaxAgeInvalidMessage": "最大存在时间格式无效。至少需要 60s。", "xpack.transform.transformsTitle": "转换", "xpack.transform.transformsWizard.cloneTransformTitle": "克隆转换", diff --git a/x-pack/test/cloud_security_posture_functional/page_objects/findings_page.ts b/x-pack/test/cloud_security_posture_functional/page_objects/findings_page.ts index c711c2300e1be..eb7ea67560154 100644 --- a/x-pack/test/cloud_security_posture_functional/page_objects/findings_page.ts +++ b/x-pack/test/cloud_security_posture_functional/page_objects/findings_page.ts @@ -220,6 +220,13 @@ export function FindingsPageProvider({ getService, getPageObjects }: FtrProvider const flyoutButton = await table.findAllByTestSubject('docTableExpandToggleColumn'); await flyoutButton[rowIndex].click(); }, + + async toggleEditDataViewFieldsOption(columnId: string) { + const element = await this.getElement(); + const column = await element.findByCssSelector(`[data-gridcell-column-id="${columnId}"]`); + const button = await column.findByCssSelector('.euiDataGridHeaderCell__button'); + return await button.click(); + }, }); const createTableObject = (tableTestSubject: string) => ({ diff --git a/x-pack/test/cloud_security_posture_functional/pages/findings.ts b/x-pack/test/cloud_security_posture_functional/pages/findings.ts index bf45dddebc0b5..5f4520277b2f3 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/findings.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/findings.ts @@ -13,6 +13,7 @@ import type { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getPageObjects, getService }: FtrProviderContext) { const queryBar = getService('queryBar'); const filterBar = getService('filterBar'); + const testSubjects = getService('testSubjects'); const retry = getService('retry'); const pageObjects = getPageObjects(['common', 'findings', 'header']); const chance = new Chance(); @@ -94,7 +95,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const ruleName1 = data[0].rule.name; const ruleName2 = data[1].rule.name; - describe('Findings Page', function () { + describe('Findings Page - DataTable', function () { this.tags(['cloud_security_posture_findings']); let findings: typeof pageObjects.findings; let latestFindingsTable: typeof findings.latestFindingsTable; @@ -209,5 +210,92 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); }); }); + + describe('DataTable features', () => { + it('Edit data view field option is Enabled', async () => { + await latestFindingsTable.toggleEditDataViewFieldsOption('result.evaluation'); + expect(await testSubjects.find('gridEditFieldButton')).to.be.ok(); + await latestFindingsTable.toggleEditDataViewFieldsOption('result.evaluation'); + }); + }); + + describe('Findings - Fields selector', () => { + const CSP_FIELDS_SELECTOR_MODAL = 'cloudSecurityFieldsSelectorModal'; + const CSP_FIELDS_SELECTOR_OPEN_BUTTON = 'cloudSecurityFieldsSelectorOpenButton'; + const CSP_FIELDS_SELECTOR_RESET_BUTTON = 'cloudSecurityFieldsSelectorResetButton'; + const CSP_FIELDS_SELECTOR_CLOSE_BUTTON = 'cloudSecurityFieldsSelectorCloseButton'; + + it('Add fields to the Findings DataTable', async () => { + const fieldsButton = await testSubjects.find(CSP_FIELDS_SELECTOR_OPEN_BUTTON); + await fieldsButton.click(); + await testSubjects.existOrFail(CSP_FIELDS_SELECTOR_MODAL); + + const agentIdCheckbox = await testSubjects.find( + 'cloud-security-fields-selector-item-agent.id' + ); + await agentIdCheckbox.click(); + + const agentNameCheckbox = await testSubjects.find( + 'cloud-security-fields-selector-item-agent.name' + ); + await agentNameCheckbox.click(); + + await testSubjects.existOrFail('dataGridHeaderCell-agent.id'); + await testSubjects.existOrFail('dataGridHeaderCell-agent.name'); + + const closeFieldsButton = await testSubjects.find(CSP_FIELDS_SELECTOR_CLOSE_BUTTON); + await closeFieldsButton.click(); + await testSubjects.missingOrFail(CSP_FIELDS_SELECTOR_MODAL); + }); + + it('Remove fields from the Findings DataTable', async () => { + const fieldsButton = await testSubjects.find(CSP_FIELDS_SELECTOR_OPEN_BUTTON); + await fieldsButton.click(); + + const agentIdCheckbox = await testSubjects.find( + 'cloud-security-fields-selector-item-agent.id' + ); + await agentIdCheckbox.click(); + + const agentNameCheckbox = await testSubjects.find( + 'cloud-security-fields-selector-item-agent.name' + ); + await agentNameCheckbox.click(); + + await testSubjects.missingOrFail('dataGridHeaderCell-agent.id'); + await testSubjects.missingOrFail('dataGridHeaderCell-agent.name'); + + const closeFieldsButton = await testSubjects.find(CSP_FIELDS_SELECTOR_CLOSE_BUTTON); + await closeFieldsButton.click(); + await testSubjects.missingOrFail(CSP_FIELDS_SELECTOR_MODAL); + }); + it('Reset fields to default', async () => { + const fieldsButton = await testSubjects.find(CSP_FIELDS_SELECTOR_OPEN_BUTTON); + await fieldsButton.click(); + + const agentIdCheckbox = await testSubjects.find( + 'cloud-security-fields-selector-item-agent.id' + ); + await agentIdCheckbox.click(); + + const agentNameCheckbox = await testSubjects.find( + 'cloud-security-fields-selector-item-agent.name' + ); + await agentNameCheckbox.click(); + + await testSubjects.existOrFail('dataGridHeaderCell-agent.id'); + await testSubjects.existOrFail('dataGridHeaderCell-agent.name'); + + const resetFieldsButton = await testSubjects.find(CSP_FIELDS_SELECTOR_RESET_BUTTON); + await resetFieldsButton.click(); + + await testSubjects.missingOrFail('dataGridHeaderCell-agent.id'); + await testSubjects.missingOrFail('dataGridHeaderCell-agent.name'); + + const closeFieldsButton = await testSubjects.find(CSP_FIELDS_SELECTOR_CLOSE_BUTTON); + await closeFieldsButton.click(); + await testSubjects.missingOrFail(CSP_FIELDS_SELECTOR_MODAL); + }); + }); }); } diff --git a/x-pack/test/observability_ai_assistant_api_integration/common/create_openai_chunk.ts b/x-pack/test/observability_ai_assistant_api_integration/common/create_openai_chunk.ts index 7e39a7d73ce8b..cc83dac4aa1e4 100644 --- a/x-pack/test/observability_ai_assistant_api_integration/common/create_openai_chunk.ts +++ b/x-pack/test/observability_ai_assistant_api_integration/common/create_openai_chunk.ts @@ -21,6 +21,8 @@ export function createOpenAiChunk( choices: [ { delta: msg, + index: 0, + finish_reason: null, }, ], }; diff --git a/x-pack/test/observability_ai_assistant_api_integration/tests/complete/complete.spec.ts b/x-pack/test/observability_ai_assistant_api_integration/tests/complete/complete.spec.ts index 6601dbc213ab4..ae5fc9946674f 100644 --- a/x-pack/test/observability_ai_assistant_api_integration/tests/complete/complete.spec.ts +++ b/x-pack/test/observability_ai_assistant_api_integration/tests/complete/complete.spec.ts @@ -14,7 +14,7 @@ import { StreamingChatResponseEvent, StreamingChatResponseEventType, } from '@kbn/observability-ai-assistant-plugin/common/conversation_complete'; -import { CreateChatCompletionRequest } from 'openai'; +import type OpenAI from 'openai'; import { createLlmProxy, LlmProxy } from '../../common/create_llm_proxy'; import { createOpenAiChunk } from '../../common/create_openai_chunk'; import { FtrProviderContext } from '../../common/ftr_provider_context'; @@ -145,12 +145,16 @@ export default function ApiTest({ getService }: FtrProviderContext) { before(async () => { const titleInterceptor = proxy.intercept( 'title', - (body) => (JSON.parse(body) as CreateChatCompletionRequest).messages.length === 1 + (body) => + (JSON.parse(body) as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming).messages + .length === 1 ); const conversationInterceptor = proxy.intercept( 'conversation', - (body) => (JSON.parse(body) as CreateChatCompletionRequest).messages.length !== 1 + (body) => + (JSON.parse(body) as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming).messages + .length !== 1 ); const responsePromise = new Promise((resolve, reject) => { diff --git a/x-pack/test/observability_ai_assistant_functional/tests/conversations/index.spec.ts b/x-pack/test/observability_ai_assistant_functional/tests/conversations/index.spec.ts index 2d2f4c3fc8c33..ce9fc050b5e09 100644 --- a/x-pack/test/observability_ai_assistant_functional/tests/conversations/index.spec.ts +++ b/x-pack/test/observability_ai_assistant_functional/tests/conversations/index.spec.ts @@ -6,7 +6,7 @@ */ import expect from '@kbn/expect'; -import { CreateChatCompletionRequest } from 'openai'; +import type OpenAI from 'openai'; import { createLlmProxy, LlmProxy, @@ -147,12 +147,16 @@ export default function ApiTest({ getService, getPageObjects }: FtrProviderConte before(async () => { const titleInterceptor = proxy.intercept( 'title', - (body) => (JSON.parse(body) as CreateChatCompletionRequest).messages.length === 1 + (body) => + (JSON.parse(body) as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming) + .messages.length === 1 ); const conversationInterceptor = proxy.intercept( 'conversation', - (body) => (JSON.parse(body) as CreateChatCompletionRequest).messages.length !== 1 + (body) => + (JSON.parse(body) as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming) + .messages.length !== 1 ); await testSubjects.setValue(ui.pages.conversations.chatInput, 'hello'); diff --git a/x-pack/test/plugin_api_integration/test_suites/task_manager/metrics_route.ts b/x-pack/test/plugin_api_integration/test_suites/task_manager/metrics_route.ts index 187df59c8ea53..fb8ee402fcc88 100644 --- a/x-pack/test/plugin_api_integration/test_suites/task_manager/metrics_route.ts +++ b/x-pack/test/plugin_api_integration/test_suites/task_manager/metrics_route.ts @@ -9,12 +9,14 @@ import expect from '@kbn/expect'; import url from 'url'; import supertest from 'supertest'; import { NodeMetrics } from '@kbn/task-manager-plugin/server/routes/metrics'; +import { ALERTING_CASES_SAVED_OBJECT_INDEX } from '@kbn/core-saved-objects-server'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const config = getService('config'); const retry = getService('retry'); const request = supertest(url.format(config.get('servers.kibana'))); + const es = getService('es'); const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); @@ -194,7 +196,9 @@ export default function ({ getService }: FtrProviderContext) { (metrics) => metrics?.metrics?.task_run?.value.by_type.alerting?.total === 1 && metrics?.metrics?.task_run?.value.by_type.alerting?.not_timed_out === 1 && - metrics?.metrics?.task_run?.value.by_type.alerting?.success === 1 + metrics?.metrics?.task_run?.value.by_type.alerting?.success === 1 && + metrics?.metrics?.task_run?.value.by_type.alerting?.user_errors === 0 && + metrics?.metrics?.task_run?.value.by_type.alerting?.framework_errors === 0 ) ).metrics; expect(initialMetrics).not.to.be(null); @@ -215,7 +219,9 @@ export default function ({ getService }: FtrProviderContext) { (m) => m?.metrics?.task_run?.value.by_type.alerting?.total === i + 2 && m?.metrics?.task_run?.value.by_type.alerting?.not_timed_out === i + 2 && - m?.metrics?.task_run?.value.by_type.alerting?.success === i + 2 + m?.metrics?.task_run?.value.by_type.alerting?.success === i + 2 && + m?.metrics?.task_run?.value.by_type.alerting?.user_errors === 0 && + m?.metrics?.task_run?.value.by_type.alerting?.framework_errors === 0 ) ).metrics; @@ -234,6 +240,76 @@ export default function ({ getService }: FtrProviderContext) { metrics?.metrics?.task_run?.value.by_type.alerting?.success === 0 ); }); + + it('should increment task run framework_error counter', async () => { + // modify the rule to get it fire a decryption error + await es.updateByQuery({ + index: ALERTING_CASES_SAVED_OBJECT_INDEX, + body: { + script: { + lang: 'painless', + source: 'ctx._source.alert.params.foo = "bar"', + }, + query: { ids: { values: [`alert:${ruleId}`] } }, + }, + refresh: true, + conflicts: 'proceed', + }); + + // run the rule and expect counters to increment + await request + .post('/api/sample_tasks/run_soon') + .set('kbn-xsrf', 'xxx') + .send({ task: { id: ruleId } }) + .expect(200); + + const metrics = ( + await getMetrics(true, (m) => m?.metrics?.task_run?.value.overall.framework_errors! === 1) + ).metrics; + + const total = metrics?.task_run?.value.overall.total || 0; + const success = metrics?.task_run?.value.overall.success || 0; + + expect(total - success).to.be(1); + }); + + it('should increment task run user_errors counter', async () => { + // modify the rule to get it fire a validation error + await es.updateByQuery({ + index: ALERTING_CASES_SAVED_OBJECT_INDEX, + body: { + script: { + lang: 'painless', + source: 'ctx._source.alert.params.foo = "bar"', + }, + query: { ids: { values: [`alert:${ruleId}`] } }, + }, + refresh: true, + conflicts: 'proceed', + }); + + // update apiKey to fix decryption error + await request + .post(`/api/alerts/alert/${ruleId}/_update_api_key`) + .set('kbn-xsrf', 'xxx') + .expect(204); + + // run the rule and expect counters to increment + await request + .post('/api/sample_tasks/run_soon') + .set('kbn-xsrf', 'xxx') + .send({ task: { id: ruleId } }) + .expect(200); + + const metrics = ( + await getMetrics(true, (m) => m?.metrics?.task_run?.value.overall.user_errors! === 1) + ).metrics; + + const total = metrics?.task_run?.value.overall.total || 0; + const success = metrics?.task_run?.value.overall.success || 0; + + expect(total - success).to.be(1); + }); }); describe('task overdue', () => { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule_ess.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule_ess.cy.ts index ab0fbb0cf445a..089cfc01ce0bb 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule_ess.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule_ess.cy.ts @@ -20,6 +20,7 @@ import { getDetails, goBackToRulesTable } from '../../../../tasks/rule_details'; import { expectNumberOfRules } from '../../../../tasks/alerts_detection_rules'; import { deleteAlertsAndRules } from '../../../../tasks/api_calls/common'; import { + expandEsqlQueryBar, fillAboutRuleAndContinue, fillDefineEsqlRuleAndContinue, fillScheduleRuleAndContinue, @@ -34,12 +35,22 @@ import { visit } from '../../../../tasks/navigation'; import { CREATE_RULE_URL } from '../../../../urls/navigation'; +// https://github.com/cypress-io/cypress/issues/22113 +// issue is inside monaco editor, used in ES|QL query input +// calling it after visiting page in each tests, seems fixes the issue +// the only other alternative is patching ResizeObserver, which is something I would like to avoid +const workaroundForResizeObserver = () => + cy.on('uncaught:exception', (err) => { + if (err.message.includes('ResizeObserver loop limit exceeded')) { + return false; + } + }); + describe('Detection ES|QL rules, creation', { tags: ['@ess'] }, () => { const rule = getEsqlRule(); const expectedNumberOfRules = 1; - // FLAKY: https://github.com/elastic/kibana/issues/172618 - describe.skip('creation', () => { + describe('creation', () => { beforeEach(() => { deleteAlertsAndRules(); login(); @@ -47,8 +58,10 @@ describe('Detection ES|QL rules, creation', { tags: ['@ess'] }, () => { it('creates an ES|QL rule', function () { visit(CREATE_RULE_URL); + workaroundForResizeObserver(); selectEsqlRuleType(); + expandEsqlQueryBar(); // ensures ES|QL rule in technical preview on create page cy.get(ESQL_TYPE).contains('Technical Preview'); @@ -73,8 +86,10 @@ describe('Detection ES|QL rules, creation', { tags: ['@ess'] }, () => { // this test case is important, since field shown in rule override component are coming from ES|QL query, not data view fields API it('creates an ES|QL rule and overrides its name', function () { visit(CREATE_RULE_URL); + workaroundForResizeObserver(); selectEsqlRuleType(); + expandEsqlQueryBar(); fillDefineEsqlRuleAndContinue(rule); fillAboutSpecificEsqlRuleAndContinue({ ...rule, rule_name_override: 'test_id' }); @@ -86,23 +101,26 @@ describe('Detection ES|QL rules, creation', { tags: ['@ess'] }, () => { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/172881 - describe.skip('ES|QL query validation', () => { + describe('ES|QL query validation', () => { beforeEach(() => { login(); visit(CREATE_RULE_URL); }); it('shows error when ES|QL query is empty', function () { - selectEsqlRuleType(); + workaroundForResizeObserver(); + selectEsqlRuleType(); + expandEsqlQueryBar(); getDefineContinueButton().click(); cy.get(ESQL_QUERY_BAR).contains('ES|QL query is required'); }); it('proceeds further once invalid query is fixed', function () { - selectEsqlRuleType(); + workaroundForResizeObserver(); + selectEsqlRuleType(); + expandEsqlQueryBar(); getDefineContinueButton().click(); cy.get(ESQL_QUERY_BAR).contains('required'); @@ -115,9 +133,11 @@ describe('Detection ES|QL rules, creation', { tags: ['@ess'] }, () => { }); it('shows error when non-aggregating ES|QL query does not [metadata] operator', function () { + workaroundForResizeObserver(); + const invalidNonAggregatingQuery = 'from auditbeat* | limit 5'; selectEsqlRuleType(); - + expandEsqlQueryBar(); fillEsqlQueryBar(invalidNonAggregatingQuery); getDefineContinueButton().click(); @@ -127,11 +147,13 @@ describe('Detection ES|QL rules, creation', { tags: ['@ess'] }, () => { }); it('shows error when non-aggregating ES|QL query does not return _id field', function () { + workaroundForResizeObserver(); + const invalidNonAggregatingQuery = 'from auditbeat* [metadata _id, _version, _index] | keep agent.* | limit 5'; selectEsqlRuleType(); - + expandEsqlQueryBar(); fillEsqlQueryBar(invalidNonAggregatingQuery); getDefineContinueButton().click(); @@ -141,12 +163,13 @@ describe('Detection ES|QL rules, creation', { tags: ['@ess'] }, () => { }); it('shows error when ES|QL query is invalid', function () { + workaroundForResizeObserver(); const invalidEsqlQuery = 'from auditbeat* [metadata _id, _version, _index] | not_existing_operator'; visit(CREATE_RULE_URL); selectEsqlRuleType(); - + expandEsqlQueryBar(); fillEsqlQueryBar(invalidEsqlQuery); getDefineContinueButton().click(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/esql_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/esql_rule.cy.ts index 50980e0add4f8..265263ba495c6 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/esql_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/esql_rule.cy.ts @@ -9,7 +9,7 @@ import { getEsqlRule } from '../../../../objects/rule'; import { ESQL_QUERY_DETAILS, RULE_NAME_OVERRIDE_DETAILS } from '../../../../screens/rule_details'; -import { ESQL_QUERY_BAR, ESQL_QUERY_BAR_EXPAND_BTN } from '../../../../screens/create_new_rule'; +import { ESQL_QUERY_BAR } from '../../../../screens/create_new_rule'; import { createRule } from '../../../../tasks/api_calls/rules'; @@ -18,6 +18,7 @@ import { getDetails } from '../../../../tasks/rule_details'; import { deleteAlertsAndRules } from '../../../../tasks/api_calls/common'; import { clearEsqlQueryBar, + expandEsqlQueryBar, fillEsqlQueryBar, fillOverrideEsqlRuleName, goToAboutStepTab, @@ -44,8 +45,7 @@ describe('Detection ES|QL rules, edit', { tags: ['@ess'] }, () => { it('edits ES|QL rule and checks details page', () => { visit(RULES_MANAGEMENT_URL); editFirstRule(); - // expands query bar, so query is not obscured on narrow screens - cy.get(ESQL_QUERY_BAR_EXPAND_BTN).click(); + expandEsqlQueryBar(); // ensure once edit form opened, correct query is displayed in ES|QL input cy.get(ESQL_QUERY_BAR).contains(rule.query); @@ -78,8 +78,7 @@ describe('Detection ES|QL rules, edit', { tags: ['@ess'] }, () => { visit(RULES_MANAGEMENT_URL); editFirstRule(); - // expands query bar, so query is not obscured on narrow screens - cy.get(ESQL_QUERY_BAR_EXPAND_BTN).click(); + expandEsqlQueryBar(); // ensure once edit form opened, correct query is displayed in ES|QL input cy.get(ESQL_QUERY_BAR).contains(rule.query); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/asset_criticality/host_flyout.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/asset_criticality/host_flyout.cy.ts index 2ec2e40cb72ac..d7b94f914b75a 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/asset_criticality/host_flyout.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/asset_criticality/host_flyout.cy.ts @@ -29,7 +29,7 @@ import { ALERTS_URL } from '../../../urls/navigation'; describe( 'Host details flyout', { - tags: ['@ess', '@serverless'], + tags: ['@ess'], env: { ftrConfig: { kbnServerArgs: [ diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/create_new_rule.ts b/x-pack/test/security_solution_cypress/cypress/tasks/create_new_rule.ts index a5f411670ad38..1089834384374 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/create_new_rule.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/create_new_rule.ts @@ -55,6 +55,7 @@ import { EQL_TYPE, ESQL_TYPE, ESQL_QUERY_BAR, + ESQL_QUERY_BAR_EXPAND_BTN, ESQL_QUERY_BAR_INPUT_AREA, FALSE_POSITIVES_INPUT, IMPORT_QUERY_FROM_SAVED_TIMELINE_LINK, @@ -537,6 +538,14 @@ export const fillEsqlQueryBar = (query: string) => { cy.get(ESQL_QUERY_BAR_INPUT_AREA).type(query); }; +/** + * expands query bar, so query is not obscured on narrow screens + * and validation message is not covered by input menu tooltip + */ +export const expandEsqlQueryBar = () => { + cy.get(ESQL_QUERY_BAR_EXPAND_BTN).click(); +}; + export const fillDefineEsqlRuleAndContinue = (rule: EsqlRuleCreateProps) => { cy.get(ESQL_QUERY_BAR).contains('ES|QL query'); fillEsqlQueryBar(rule.query); diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover_histogram.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover_histogram.ts index becf81ab3da9f..ccba699ffa710 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover_histogram.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover_histogram.ts @@ -42,6 +42,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ); await security.testUser.setRoles(['kibana_admin', 'long_window_logstash']); await kibanaServer.uiSettings.replace(defaultSettings); + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); await PageObjects.common.navigateToApp('discover'); }); after(async () => { @@ -64,13 +65,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should modify the time range when the histogram is brushed', async function () { await PageObjects.common.navigateToApp('discover'); await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.timePicker.setDefaultAbsoluteRange(); - await PageObjects.discover.waitUntilSearchingHasFinished(); // this is the number of renderings of the histogram needed when new data is fetched let renderingCountInc = 1; const prevRenderingCount = await elasticChart.getVisualizationRenderingCount(); - await PageObjects.timePicker.setDefaultAbsoluteRange(); - await PageObjects.discover.waitUntilSearchingHasFinished(); + await queryBar.submitQuery(); await retry.waitFor('chart rendering complete', async () => { const actualCount = await elasticChart.getVisualizationRenderingCount(); const expectedCount = prevRenderingCount + renderingCountInc; @@ -108,8 +106,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should update correctly when switching data views and brushing the histogram', async () => { await PageObjects.common.navigateToApp('discover'); await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.timePicker.setDefaultAbsoluteRange(); - await PageObjects.discover.waitUntilSearchingHasFinished(); await PageObjects.discover.selectIndexPattern('logstash-*'); await PageObjects.discover.waitUntilSearchingHasFinished(); await PageObjects.discover.selectIndexPattern('long-window-logstash-*'); @@ -118,7 +114,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.discover.waitUntilSearchingHasFinished(); // TODO: The Serverless sidebar causes `PageObjects.discover.brushHistogram()` // to brush a different range in the histogram, resulting in a different count - expect(await PageObjects.discover.getHitCount()).to.be('12'); + expect(await PageObjects.discover.getHitCount()).to.be('10'); }); it('should update the histogram timerange when the query is resubmitted', async function () { @@ -284,7 +280,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should recover from broken query search when clearing the query bar', async () => { await PageObjects.common.navigateToApp('discover'); await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.timePicker.setDefaultAbsoluteRange(); // Make sure the chart is visible await testSubjects.click('unifiedHistogramChartOptionsToggle'); await testSubjects.click('unifiedHistogramChartToggle'); diff --git a/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/existing_fields.ts b/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/existing_fields.ts index d9721c09ecd3b..6dd1542bbea39 100644 --- a/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/existing_fields.ts +++ b/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/existing_fields.ts @@ -57,8 +57,7 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => { await PageObjects.header.waitUntilLoadingHasFinished(); } - // FLAKY: https://github.com/elastic/kibana/issues/172781 - describe.skip('Fields existence info', () => { + describe('Fields existence info', () => { before(async () => { await esArchiver.load( 'test/api_integration/fixtures/es_archiver/index_patterns/constant_keyword' diff --git a/x-pack/test_serverless/functional/test_suites/common/management/data_views/_edit_field.ts b/x-pack/test_serverless/functional/test_suites/common/management/data_views/_edit_field.ts index 6ef2f01618a6c..b14687ad12003 100644 --- a/x-pack/test_serverless/functional/test_suites/common/management/data_views/_edit_field.ts +++ b/x-pack/test_serverless/functional/test_suites/common/management/data_views/_edit_field.ts @@ -34,26 +34,20 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should show preview for fields in _source', async function () { await PageObjects.settings.filterField('extension'); await testSubjects.click('editFieldFormat'); - await testSubjects.find('value'); - let previewText = ''; - await retry.waitForWithTimeout('get preview value', 1000, async () => { - previewText = await testSubjects.getVisibleText('value'); - return previewText !== 'Value not set'; + await retry.tryForTime(5000, async () => { + const previewText = await testSubjects.getVisibleText('fieldPreviewItem > value'); + expect(previewText).to.be('css'); }); - expect(previewText).to.be('css'); await PageObjects.settings.closeIndexPatternFieldEditor(); }); it('should show preview for fields not in _source', async function () { await PageObjects.settings.filterField('extension.raw'); await testSubjects.click('editFieldFormat'); - await testSubjects.find('value'); - let previewText = ''; - await retry.waitForWithTimeout('get preview value', 1000, async () => { - previewText = await testSubjects.getVisibleText('value'); - return previewText !== 'Value not set'; + await retry.tryForTime(5000, async () => { + const previewText = await testSubjects.getVisibleText('fieldPreviewItem > value'); + expect(previewText).to.be('css'); }); - expect(previewText).to.be('css'); await PageObjects.settings.closeIndexPatternFieldEditor(); }); }); diff --git a/yarn.lock b/yarn.lock index 784e60fc139bb..340ae8c920995 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1479,6 +1479,11 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@colors/colors@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -4977,6 +4982,10 @@ version "0.0.0" uid "" +"@kbn/lens-formula-docs@link:packages/kbn-lens-formula-docs": + version "0.0.0" + uid "" + "@kbn/lens-plugin@link:x-pack/plugins/lens": version "0.0.0" uid "" @@ -7344,6 +7353,27 @@ schema-utils "^3.0.0" source-map "^0.7.3" +"@pnpm/config.env-replace@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" + integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== + +"@pnpm/network.ca-file@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" + integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== + dependencies: + graceful-fs "4.2.10" + +"@pnpm/npm-conf@^2.1.0": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" + integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== + dependencies: + "@pnpm/config.env-replace" "^1.1.0" + "@pnpm/network.ca-file" "^1.0.1" + config-chain "^1.1.11" + "@polka/url@^1.0.0-next.20": version "1.0.0-next.21" resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" @@ -7539,16 +7569,16 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - "@sindresorhus/is@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.0.tgz#2ff674e9611b45b528896d820d3d7a812de2f0e4" integrity sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ== +"@sindresorhus/is@^5.2.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" + integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== + "@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0", "@sinonjs/commons@^1.7.0": version "1.7.2" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.2.tgz#505f55c74e0272b43f6c52d81946bed7058fc0e2" @@ -7592,19 +7622,19 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== -"@slack/types@^1.2.1": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@slack/types/-/types-1.9.0.tgz#aa8f90b2f66ac54a77e42606644366f93cff4871" - integrity sha512-RmwgMWqOtzd2JPXdiaD/tyrDD0vtjjRDFdxN1I3tAxwBbg4aryzDUVqFc8na16A+3Xik/UN8X1hvVTw8J4EB9w== +"@slack/types@^2.9.0": + version "2.11.0" + resolved "https://registry.yarnpkg.com/@slack/types/-/types-2.11.0.tgz#948c556081c3db977dfa8433490cc2ff41f47203" + integrity sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ== -"@slack/webhook@^5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@slack/webhook/-/webhook-5.0.4.tgz#5d3e947387c1d0ccb176a153cec68c594edb7060" - integrity sha512-IC1dpVSc2F/pmwCxOb0QzH2xnGKmyT7MofPGhNkeaoiMrLMU+Oc7xV/AxGnz40mURtCtaDchZSM3tDo9c9x6BA== +"@slack/webhook@^7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@slack/webhook/-/webhook-7.0.1.tgz#91d939af249d50ea978a960a52b9f92bb7d2bdda" + integrity sha512-0Uj/GQ1H8nmeAVEx+7zcWb6/q/zsSOrlIaGi6zFnwgMSxjmV6xGsVwv8w6DaAdkUbtqa43v1cirWjySeZaCOIA== dependencies: - "@slack/types" "^1.2.1" - "@types/node" ">=8.9.0" - axios "^0.21.1" + "@slack/types" "^2.9.0" + "@types/node" ">=18.0.0" + axios "^1.6.0" "@smithy/eventstream-codec@^2.0.12": version "2.0.12" @@ -8546,13 +8576,6 @@ regenerator-runtime "^0.13.7" resolve-from "^5.0.0" -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - "@szmarczak/http-timer@^4.0.5": version "4.0.5" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.5.tgz#bfbd50211e9dfa51ba07da58a14cdfd333205152" @@ -8560,6 +8583,13 @@ dependencies: defer-to-connect "^2.0.0" +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + "@tanstack/match-sorter-utils@^8.7.0": version "8.7.0" resolved "https://registry.yarnpkg.com/@tanstack/match-sorter-utils/-/match-sorter-utils-8.7.0.tgz#60b09a6d3d7974d5f86f1318053c1bd5a85fb0be" @@ -9410,6 +9440,11 @@ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== +"@types/http-cache-semantics@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + "@types/http-proxy@^1.17.4", "@types/http-proxy@^1.17.8": version "1.17.9" resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" @@ -9759,10 +9794,12 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@18.18.5", "@types/node@>= 8", "@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@>=8.9.0", "@types/node@^10.1.0", "@types/node@^14.0.10 || ^16.0.0", "@types/node@^14.14.20 || ^16.0.0", "@types/node@^18.11.18", "@types/node@^18.17.5": - version "18.18.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.5.tgz#afc0fd975df946d6e1add5bbf98264225b212244" - integrity sha512-4slmbtwV59ZxitY4ixUZdy1uRLf9eSIvBWPQxNjhHYWEtn0FryfKpyS2cvADYXTayWdKEIsJengncrVvkI4I6A== +"@types/node@*", "@types/node@20.10.5", "@types/node@>= 8", "@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@>=18.0.0", "@types/node@^10.1.0", "@types/node@^14.0.10 || ^16.0.0", "@types/node@^14.14.20 || ^16.0.0", "@types/node@^18.11.18", "@types/node@^18.17.5": + version "20.10.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.5.tgz#47ad460b514096b7ed63a1dae26fad0914ed3ab2" + integrity sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw== + dependencies: + undici-types "~5.26.4" "@types/nodemailer@^6.4.0": version "6.4.0" @@ -11093,7 +11130,7 @@ amdefine@>=0.0.4: resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= -ansi-align@^3.0.0: +ansi-align@^3.0.0, ansi-align@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== @@ -11245,30 +11282,30 @@ anymatch@^3.0.0, anymatch@^3.0.3, anymatch@^3.1.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -apidoc-light@^0.53.1: - version "0.53.1" - resolved "https://registry.yarnpkg.com/apidoc-light/-/apidoc-light-0.53.1.tgz#823821854cc6bc15c597efce0fa6794995a39b37" - integrity sha512-kvCewAGMUHM2I1p+5f0A+4oV2aiyoGHNqSXWyBgQtxGffYHVft+1aBmrKQxF5O8xZMzv2EiQhBlALR/lCJB5jg== +apidoc-light@^0.54.0: + version "0.54.0" + resolved "https://registry.yarnpkg.com/apidoc-light/-/apidoc-light-0.54.0.tgz#8d819bcd893ca96a60d754c59b33dcf5f9255b59" + integrity sha512-sOmzxKO3xeMrLDV0e/qjT/hSG4wvRT2QYwaFLiyVbDiU9lbIfWW83yFby9/N/HfPZP8buvNd+rPGL1iVyP9CDQ== dependencies: - fs-extra "^10.1.0" - glob "^8.0.3" + fs-extra "^11.2.0" + glob "^10.3.10" iconv-lite "^0.6.3" klaw-sync "^6.0.0" lodash "^4.17.21" - markdown-it "^13.0.1" - semver "^7.3.8" - winston "^3.8.2" + markdown-it "^14.0.0" + semver "^7.5.4" + winston "^3.11.0" -apidoc-markdown@^7.2.4: - version "7.2.4" - resolved "https://registry.yarnpkg.com/apidoc-markdown/-/apidoc-markdown-7.2.4.tgz#7363c3aee58037664b15533ec4736501eb319417" - integrity sha512-/yq2xydejDXGc/a2mYqLfDrngs+onAES0dnjvPeX+tZ1XjhqJzqkrDQOPRDHoKoO20S2NY74v/MUt5ha1AkalQ== +apidoc-markdown@^7.3.0: + version "7.3.2" + resolved "https://registry.yarnpkg.com/apidoc-markdown/-/apidoc-markdown-7.3.2.tgz#64c1ad45ba29dd57f376419a900cd59c786624a0" + integrity sha512-0nOfTWSaFfbgJ673ztWiup5CKauuwmhg7hJ0jR7gb0TDK1RX3b0unl6soc8UVhdjYgrvRBRvujMUB/KUF5OG3Q== dependencies: - apidoc-light "^0.53.1" - ejs "^3.1.8" - semver "^7.3.8" - update-notifier "^5.1.0" - yargs "^17.6.0" + apidoc-light "^0.54.0" + ejs "^3.1.9" + semver "^7.5.4" + update-notifier "^7.0.0" + yargs "^17.7.2" app-module-path@^2.2.0: version "2.2.0" @@ -11759,20 +11796,6 @@ axe-core@^4.8.2: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.8.2.tgz#2f6f3cde40935825cf4465e3c1c9e77b240ff6ae" integrity sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g== -axios@^0.21.1: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - -axios@^0.26.0: - version "0.26.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" - integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== - dependencies: - follow-redirects "^1.14.8" - axios@^1.3.4, axios@^1.6.0, axios@^1.6.3: version "1.6.3" resolved "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz#7f50f23b3aa246eff43c54834272346c396613f4" @@ -12275,7 +12298,7 @@ bowser@^1.7.3: resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.9.4.tgz#890c58a2813a9d3243704334fa81b96a5c150c9a" integrity sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ== -boxen@^5.0.0, boxen@^5.1.2: +boxen@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== @@ -12289,6 +12312,20 @@ boxen@^5.0.0, boxen@^5.1.2: widest-line "^3.1.0" wrap-ansi "^7.0.0" +boxen@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.1.1.tgz#f9ba525413c2fec9cdb88987d835c4f7cad9c8f4" + integrity sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog== + dependencies: + ansi-align "^3.0.1" + camelcase "^7.0.1" + chalk "^5.2.0" + cli-boxes "^3.0.0" + string-width "^5.1.2" + type-fest "^2.13.0" + widest-line "^4.0.1" + wrap-ansi "^8.1.0" + bplist-parser@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.1.1.tgz#d60d5dcc20cba6dc7e1f299b35d3e1f95dafbae6" @@ -12672,18 +12709,23 @@ cacheable-lookup@^5.0.3: resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz#049fdc59dffdd4fc285e8f4f82936591bd59fec3" integrity sha512-W+JBqF9SWe18A72XFzN/V/CULFzPm7sBXzzR6ekkE+3tLG72wFZrBiBZhrZuDoYexop4PHJVdFAKb/Nj9+tm9w== -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== +cacheable-lookup@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" + integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== + +cacheable-request@^10.2.8: + version "10.2.14" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" + integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" + "@types/http-cache-semantics" "^4.0.2" + get-stream "^6.0.1" + http-cache-semantics "^4.1.1" + keyv "^4.5.3" + mimic-response "^4.0.0" + normalize-url "^8.0.0" + responselike "^3.0.0" cacheable-request@^7.0.2: version "7.0.2" @@ -12781,6 +12823,11 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" + integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== + camelize@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" @@ -12909,10 +12956,10 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^5.1.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" - integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== +chalk@^5.1.2, chalk@^5.2.0, chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== chance@1.0.18: version "1.0.18" @@ -13121,6 +13168,11 @@ cli-boxes@^2.2.1: resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== + cli-cursor@^2.0.0, cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" @@ -13523,25 +13575,24 @@ concaveman@*: robust-predicates "^2.0.4" tinyqueue "^2.0.3" -config-chain@^1.1.12: - version "1.1.12" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" - integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== +config-chain@^1.1.11, config-chain@^1.1.12: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== dependencies: ini "^1.3.4" proto-list "~1.2.1" -configstore@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" - integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== +configstore@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-6.0.0.tgz#49eca2ebc80983f77e09394a1a56e0aca8235566" + integrity sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA== dependencies: - dot-prop "^5.2.0" - graceful-fs "^4.1.2" - make-dir "^3.0.0" - unique-string "^2.0.0" - write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" + dot-prop "^6.0.1" + graceful-fs "^4.2.6" + unique-string "^3.0.0" + write-file-atomic "^3.0.3" + xdg-basedir "^5.0.1" connect-history-api-fallback@^2.0.0: version "2.0.0" @@ -13884,10 +13935,12 @@ crypto-random-string@^1.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== +crypto-random-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" + integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== + dependencies: + type-fest "^1.0.1" css-box-model@^1.2.1: version "1.2.1" @@ -14625,13 +14678,6 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -14736,12 +14782,7 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -defer-to-connect@^2.0.0: +defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== @@ -15272,10 +15313,10 @@ dot-case@^3.0.3, dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" -dot-prop@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" - integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== dependencies: is-obj "^2.0.0" @@ -15334,11 +15375,6 @@ duplexer2@^0.1.2, duplexer2@~0.1.4: dependencies: readable-stream "^2.0.2" -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -15401,10 +15437,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^3.1.8: - version "3.1.8" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" - integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== +ejs@^3.1.8, ejs@^3.1.9: + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== dependencies: jake "^10.8.5" @@ -15657,11 +15693,6 @@ entities@~2.1.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== -entities@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" - integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== - env-paths@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" @@ -15960,10 +15991,10 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-goat@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" - integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== +escape-goat@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-4.0.0.tgz#9424820331b510b0666b98f7873fe11ac4aa8081" + integrity sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg== escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" @@ -17119,7 +17150,7 @@ folktale@2.3.2: resolved "https://registry.yarnpkg.com/folktale/-/folktale-2.3.2.tgz#38231b039e5ef36989920cbf805bf6b227bf4fd4" integrity sha512-+8GbtQBwEqutP0v3uajDDoN64K2ehmHd0cjlghhxh0WpcfPzAIjPA03e1VvHlxL02FVGR0A6lwXsNQKn3H1RNQ== -follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.14.8, follow-redirects@^1.15.0: +follow-redirects@^1.0.0, follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -17199,6 +17230,11 @@ form-data-encoder@1.7.2: resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040" integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A== +form-data-encoder@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" + integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== + form-data@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -17331,7 +17367,7 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^10.0.0, fs-extra@^10.0.1, fs-extra@^10.1.0: +fs-extra@^10.0.0, fs-extra@^10.0.1: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== @@ -17340,6 +17376,15 @@ fs-extra@^10.0.0, fs-extra@^10.0.1, fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -17565,7 +17610,7 @@ get-stdin@^8.0.0: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== -get-stream@^4.0.0, get-stream@^4.1.0: +get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== @@ -17723,7 +17768,7 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@8.1.0, glob@^8.0.3: +glob@8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== @@ -17925,22 +17970,22 @@ got@^11.8.2: p-cancelable "^2.0.0" responselike "^2.0.0" -got@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" +got@^12.1.0: + version "12.6.1" + resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" + integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== + dependencies: + "@sindresorhus/is" "^5.2.0" + "@szmarczak/http-timer" "^5.0.1" + cacheable-lookup "^7.0.0" + cacheable-request "^10.2.8" + decompress-response "^6.0.0" + form-data-encoder "^2.1.2" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^3.0.0" gpt-tokenizer@^2.1.2: version "2.1.2" @@ -17949,6 +17994,11 @@ gpt-tokenizer@^2.1.2: dependencies: rfc4648 "^1.5.2" +graceful-fs@4.2.10: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + graceful-fs@4.X, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.11, graceful-fs@^4.2.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.8, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" @@ -18148,11 +18198,6 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has-yarn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" - integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== - has@^1.0.0, has@^1.0.1, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -18648,6 +18693,14 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" +http2-wrapper@^2.1.10: + version "2.2.1" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" @@ -18787,11 +18840,6 @@ import-in-the-middle@1.5.0: cjs-module-lexer "^1.2.2" module-details-from-path "^1.0.3" -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= - import-lazy@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" @@ -19279,6 +19327,11 @@ is-hexadecimal@^1.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.1.tgz#6e084bbc92061fbb0971ec58b6ce6d404e24da69" integrity sha1-bghLvJIGH7sJcexYts5tQE4k2mk= +is-in-ci@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-in-ci/-/is-in-ci-0.1.0.tgz#5e07d6a02ec3a8292d3f590973357efa3fceb0d3" + integrity sha512-d9PXLEY0v1iJ64xLiQMJ51J128EYHAaOR4yZqQi8aHGfw6KgifM3/Viw1oZZ1GCVmb3gBuyhLyHj0HgR2DhSXQ== + is-installed-globally@^0.4.0, is-installed-globally@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" @@ -19332,10 +19385,10 @@ is-nil@^1.0.0: resolved "https://registry.yarnpkg.com/is-nil/-/is-nil-1.0.1.tgz#2daba29e0b585063875e7b539d071f5b15937969" integrity sha1-LauingtYUGOHXntTnQcfWxWTeWk= -is-npm@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" - integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== +is-npm@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-6.0.0.tgz#b59e75e8915543ca5d881ecff864077cba095261" + integrity sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ== is-number-object@^1.0.4: version "1.0.4" @@ -19630,11 +19683,6 @@ is-wsl@^2.1.1, is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -is-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== - is2@^2.0.6: version "2.0.9" resolved "https://registry.yarnpkg.com/is2/-/is2-2.0.9.tgz#ff63b441f90de343fa8fac2125ee170da8e8240d" @@ -20541,11 +20589,6 @@ json-bigint@^1.0.0: dependencies: bignumber.js "^9.0.0" -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= - json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -20773,17 +20816,10 @@ kea@^2.6.0: resolved "https://registry.yarnpkg.com/kea/-/kea-2.6.0.tgz#774a82188e0fb52cdb18b72843a875ee857f3807" integrity sha512-+yaLyZx8h2v96aL01XIRZjqA8Qk4fIUziznSKnkjDItUU8YnH75xER6+vMHT5EHC3MJeSScxIx5UuqZl30DBdg== -keyv@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" - integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA== - dependencies: - json-buffer "3.0.0" - -keyv@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.0.tgz#dbce9ade79610b6e641a9a65f2f6499ba06b9bc6" - integrity sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA== +keyv@^4.0.0, keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" @@ -20905,12 +20941,12 @@ language-tags@=1.0.5: dependencies: language-subtag-registry "~0.3.2" -latest-version@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" - integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== +latest-version@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-7.0.0.tgz#843201591ea81a4d404932eeb61240fe04e9e5da" + integrity sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg== dependencies: - package-json "^6.3.0" + package-json "^8.1.0" launchdarkly-eventsource@1.4.4: version "1.4.4" @@ -21060,12 +21096,12 @@ linkify-it@^3.0.1: dependencies: uc.micro "^1.0.1" -linkify-it@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-4.0.1.tgz#01f1d5e508190d06669982ba31a7d9f56a5751ec" - integrity sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw== +linkify-it@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" + integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== dependencies: - uc.micro "^1.0.1" + uc.micro "^2.0.0" listenercount@~1.0.1: version "1.0.1" @@ -21482,16 +21518,16 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - lowercase-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + lowlight@^1.14.0: version "1.17.0" resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.17.0.tgz#a1143b2fba8239df8cd5893f9fe97aaf8465af4a" @@ -21700,16 +21736,17 @@ markdown-it@^12.3.2: mdurl "^1.0.1" uc.micro "^1.0.5" -markdown-it@^13.0.1: - version "13.0.1" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-13.0.1.tgz#c6ecc431cacf1a5da531423fc6a42807814af430" - integrity sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q== +markdown-it@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.0.0.tgz#b4b2ddeb0f925e88d981f84c183b59bac9e3741b" + integrity sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw== dependencies: argparse "^2.0.1" - entities "~3.0.1" - linkify-it "^4.0.1" - mdurl "^1.0.1" - uc.micro "^1.0.5" + entities "^4.4.0" + linkify-it "^5.0.0" + mdurl "^2.0.0" + punycode.js "^2.3.1" + uc.micro "^2.0.0" markdown-table@^2.0.0: version "2.0.0" @@ -21888,6 +21925,11 @@ mdurl@^1.0.0, mdurl@^1.0.1: resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= +mdurl@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" + integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== + measured-core@^1.51.1: version "1.51.1" resolved "https://registry.yarnpkg.com/measured-core/-/measured-core-1.51.1.tgz#98989705c00bfb0d8a20e665a9f8d6e246a40518" @@ -22161,7 +22203,7 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^1.0.0, mimic-response@^1.0.1: +mimic-response@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== @@ -22171,6 +22213,11 @@ mimic-response@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== +mimic-response@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" + integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== + min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" @@ -23055,16 +23102,16 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - normalize-url@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== +normalize-url@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.0.tgz#593dbd284f743e8dcf6a5ddf8fadff149c82701a" + integrity sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw== + now-and-later@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-3.0.0.tgz#cdc045dc5b894b35793cf276cc3206077bb7302d" @@ -23396,18 +23443,10 @@ open@^8.0.9, open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" -openai@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/openai/-/openai-3.3.0.tgz#a6408016ad0945738e1febf43f2fccca83a3f532" - integrity sha512-uqxI/Au+aPRnsaQRe8CojU0eCR7I0mBiKjD3sNMzY6DaC1ZVrc85u98mtJW6voDug8fgGN+DIZmTDxTthxb7dQ== - dependencies: - axios "^0.26.0" - form-data "^4.0.0" - -openai@^4.17.0: - version "4.17.5" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.17.5.tgz#096655741965656ec969731e97d4bce880112d66" - integrity sha512-SDgA933/QOjISCgWRc/JQhY1HweYZ6FOie3bWrCpj09FA5xIlaomldbyzICHNjtkh7SWEmGYFjRHIDtuwr+eTw== +openai@^4.17.0, openai@^4.24.1: + version "4.24.1" + resolved "https://registry.yarnpkg.com/openai/-/openai-4.24.1.tgz#3759001eca835228289fcf18c1bd8d35dae538ba" + integrity sha512-ezm/O3eiZMnyBqirUnWm9N6INJU1WhNtz+nK/Zj/2oyKvRz9pgpViDxa5wYOtyGYXPn1sIKBV0I/S4BDhtydqw== dependencies: "@types/node" "^18.11.18" "@types/node-fetch" "^2.6.4" @@ -23573,16 +23612,16 @@ p-all@^2.1.0: dependencies: p-map "^2.0.0" -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - p-cancelable@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e" integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg== +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== + p-event@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.1.0.tgz#e92bb866d7e8e5b732293b1c8269d38e9982bf8e" @@ -23737,15 +23776,15 @@ package-hash@^4.0.0: lodash.flattendeep "^4.4.0" release-zalgo "^1.0.0" -package-json@^6.3.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== +package-json@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" + integrity sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA== dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.0" + got "^12.1.0" + registry-auth-token "^5.0.1" + registry-url "^6.0.0" + semver "^7.3.7" pako@^0.2.5: version "0.2.9" @@ -24667,11 +24706,6 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= - prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -25025,6 +25059,11 @@ pumpify@^1.3.3: inherits "^2.0.3" pump "^2.0.0" +punycode.js@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" + integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -25040,12 +25079,12 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -pupa@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" - integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== +pupa@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-3.1.0.tgz#f15610274376bbcc70c9a3aa8b505ea23f41c579" + integrity sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug== dependencies: - escape-goat "^2.0.0" + escape-goat "^4.0.0" puppeteer-core@21.5.2: version "21.5.2" @@ -25263,7 +25302,7 @@ rc-pagination@^1.20.1: prop-types "^15.5.7" react-lifecycles-compat "^3.0.4" -rc@^1.2.7, rc@^1.2.8: +rc@1.2.8, rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -26187,19 +26226,19 @@ regexpu-core@^5.3.1: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" -registry-auth-token@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.1.1.tgz#40a33be1e82539460f94328b0f7f0f84c16d9479" - integrity sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA== +registry-auth-token@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" + integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== dependencies: - rc "^1.2.8" + "@pnpm/npm-conf" "^2.1.0" -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== +registry-url@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-6.0.1.tgz#056d9343680f2f64400032b1e199faa692286c58" + integrity sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q== dependencies: - rc "^1.2.8" + rc "1.2.8" regjsparser@^0.9.1: version "0.9.1" @@ -26520,7 +26559,7 @@ resize-observer-polyfill@^1.5.1: resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== -resolve-alpn@^1.0.0: +resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== @@ -26599,13 +26638,6 @@ resolve@^2.0.0-next.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= - dependencies: - lowercase-keys "^1.0.0" - responselike@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" @@ -26613,6 +26645,13 @@ responselike@^2.0.0: dependencies: lowercase-keys "^2.0.0" +responselike@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" + integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== + dependencies: + lowercase-keys "^3.0.0" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -27058,12 +27097,12 @@ selfsigned@^2.0.1: dependencies: node-forge "^1" -semver-diff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" - integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== +semver-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-4.0.0.tgz#3afcf5ed6d62259f5c72d0d5d50dffbdc9680df5" + integrity sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA== dependencies: - semver "^6.3.0" + semver "^7.3.5" "semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.7.2" @@ -27082,7 +27121,7 @@ semver@7.5.4, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: +semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== @@ -28962,11 +29001,6 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" @@ -29295,6 +29329,16 @@ type-fest@^0.8.0, type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^1.0.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + +type-fest@^2.13.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -29410,6 +29454,11 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg== +uc.micro@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.0.0.tgz#84b3c335c12b1497fd9e80fcd3bfa7634c363ff1" + integrity sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig== + uglify-js@^3.1.4: version "3.17.4" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" @@ -29438,6 +29487,11 @@ unc-path-regex@^0.1.2: resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + undici@^5.21.2, undici@^5.22.1: version "5.26.3" resolved "https://registry.yarnpkg.com/undici/-/undici-5.26.3.tgz#ab3527b3d5bb25b12f898dfd22165d472dd71b79" @@ -29586,12 +29640,12 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== +unique-string@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" + integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== dependencies: - crypto-random-string "^2.0.0" + crypto-random-string "^4.0.0" unist-builder@2.0.3, unist-builder@^2.0.0: version "2.0.3" @@ -29746,25 +29800,23 @@ update-browserslist-db@^1.0.13: escalade "^3.1.1" picocolors "^1.0.0" -update-notifier@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" - integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== +update-notifier@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-7.0.0.tgz#295aa782dadab784ed4073f7ffaea1fb2123031c" + integrity sha512-Hv25Bh+eAbOLlsjJreVPOs4vd51rrtCrmhyOJtbpAojro34jS4KQaEp4/EvlHJX7jSO42VvEFpkastVyXyIsdQ== dependencies: - boxen "^5.0.0" - chalk "^4.1.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" + boxen "^7.1.1" + chalk "^5.3.0" + configstore "^6.0.0" + import-lazy "^4.0.0" + is-in-ci "^0.1.0" is-installed-globally "^0.4.0" - is-npm "^5.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.1.0" - pupa "^2.1.1" - semver "^7.3.4" - semver-diff "^3.1.1" - xdg-basedir "^4.0.0" + is-npm "^6.0.0" + latest-version "^7.0.0" + pupa "^3.1.0" + semver "^7.5.4" + semver-diff "^4.0.0" + xdg-basedir "^5.1.0" uri-js@^4.2.2: version "4.2.2" @@ -29796,13 +29848,6 @@ url-loader@^4.1.1: mime-types "^2.1.27" schema-utils "^3.0.0" -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= - dependencies: - prepend-http "^2.0.0" - url-parse@^1.5.10, url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" @@ -30953,6 +30998,13 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" +widest-line@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" + integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== + dependencies: + string-width "^5.0.1" + wildcard@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" @@ -30979,12 +31031,12 @@ winston-transport@^4.5.0: readable-stream "^3.6.0" triple-beam "^1.3.0" -winston@^3.8.2: - version "3.8.2" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.8.2.tgz#56e16b34022eb4cff2638196d9646d7430fdad50" - integrity sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew== +winston@^3.11.0, winston@^3.8.2: + version "3.11.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.11.0.tgz#2d50b0a695a2758bb1c95279f0a88e858163ed91" + integrity sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g== dependencies: - "@colors/colors" "1.5.0" + "@colors/colors" "^1.6.0" "@dabh/diagnostics" "^2.0.2" async "^3.2.3" is-stream "^2.0.0" @@ -31078,7 +31130,7 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^3.0.0: +write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== @@ -31113,10 +31165,10 @@ x-default-browser@^0.4.0: optionalDependencies: default-browser-id "^1.0.4" -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== +xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" + integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== xml-crypto@^5.0.0: version "5.0.0" @@ -31280,7 +31332,7 @@ yargs@16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@17.7.2, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.4.0, yargs@^17.6.0, yargs@^17.7.1, yargs@^17.7.2: +yargs@17.7.2, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.4.0, yargs@^17.7.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==