diff --git a/.buildkite/ftr_security_stateful_configs.yml b/.buildkite/ftr_security_stateful_configs.yml index 8fb66cea9ee3d..148d78583a613 100644 --- a/.buildkite/ftr_security_stateful_configs.yml +++ b/.buildkite/ftr_security_stateful_configs.yml @@ -83,4 +83,5 @@ enabled: - x-pack/test/api_integration/apis/cloud_security_posture/config.ts - x-pack/test/cloud_security_posture_api/config.ts - x-pack/test/cloud_security_posture_functional/config.ts + - x-pack/test/cloud_security_posture_functional/config.agentless.ts - x-pack/test/cloud_security_posture_functional/data_views/config.ts diff --git a/.buildkite/pipelines/sonarqube.yml b/.buildkite/pipelines/sonarqube.yml index 61e275011140b..20f58df398ddf 100644 --- a/.buildkite/pipelines/sonarqube.yml +++ b/.buildkite/pipelines/sonarqube.yml @@ -2,8 +2,8 @@ env: SKIP_NODE_SETUP: true steps: - - label: ":sonarqube: Continuous Code Inspection" + - label: ':sonarqube: Continuous Code Inspection' agents: image: docker.elastic.co/cloud-ci/sonarqube/buildkite-scanner:latest - memory: 16G + memory: 32G command: /scan-source-code.sh diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 1ee8936a725c0..e07292b2eef19 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -776,6 +776,7 @@ packages/kbn-securitysolution-t-grid @elastic/security-detection-engine packages/kbn-securitysolution-utils @elastic/security-detection-engine packages/kbn-server-http-tools @elastic/kibana-core packages/kbn-server-route-repository @elastic/obs-knowledge-team +packages/kbn-server-route-repository-client @elastic/obs-knowledge-team packages/kbn-server-route-repository-utils @elastic/obs-knowledge-team x-pack/plugins/serverless @elastic/appex-sharedux packages/serverless/settings/common @elastic/appex-sharedux @elastic/kibana-management @@ -862,6 +863,7 @@ packages/kbn-stdio-dev-helpers @elastic/kibana-operations packages/kbn-storybook @elastic/kibana-operations x-pack/plugins/observability_solution/synthetics/e2e @elastic/obs-ux-management-team x-pack/plugins/observability_solution/synthetics @elastic/obs-ux-management-team +x-pack/packages/kbn-synthetics-private-location @elastic/obs-ux-management-team x-pack/test/alerting_api_integration/common/plugins/task_manager_fixture @elastic/response-ops x-pack/test/plugin_api_perf/plugins/task_manager_performance @elastic/response-ops x-pack/plugins/task_manager @elastic/response-ops diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 7449636928e52..2d0e9c483fac0 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2024-08-08 +date: 2024-08-12 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 09c2a29dd9a19..f5b97dd19e4d0 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index 6386ac8b99b4c..e87e7fa5b44d2 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2024-08-08 +date: 2024-08-12 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 e181c7e51e620..9ce70fefa680c 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2024-08-08 +date: 2024-08-12 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 1d652096cc61a..e2226f16090b1 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2024-08-08 +date: 2024-08-12 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 3e55be0bd3e79..4af7011046242 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2024-08-08 +date: 2024-08-12 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 6294ba93848f6..3fc6a3804646e 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 84d6b366c7add..034cb67d60296 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2024-08-08 +date: 2024-08-12 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 bae85adad9c14..0ee72a25f7fba 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2024-08-08 +date: 2024-08-12 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 754fce85f051d..a1da4c6611411 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2024-08-08 +date: 2024-08-12 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 f0a8ab3641636..d4b6be1c7632c 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2024-08-08 +date: 2024-08-12 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 be0f650f460b4..9b1411ca8ca73 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2024-08-08 +date: 2024-08-12 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 156f3995e0e4a..5f4a9f6689143 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2024-08-08 +date: 2024-08-12 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 3f272f9846742..f276b384c03ca 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2024-08-08 +date: 2024-08-12 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 0ca6934f9e88b..019d88fbc3f7a 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2024-08-08 +date: 2024-08-12 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 3d9336662ca7c..ec76f500d8fdc 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2024-08-08 +date: 2024-08-12 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 522a024bc7f0d..909a2b96c3f15 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2024-08-08 +date: 2024-08-12 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 c42c1685de826..5a9489665e738 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2024-08-08 +date: 2024-08-12 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 950a3056de8b7..85dd74c0690d8 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.devdocs.json b/api_docs/controls.devdocs.json index 53d7081b73d7e..f7972270d0906 100644 --- a/api_docs/controls.devdocs.json +++ b/api_docs/controls.devdocs.json @@ -5251,6 +5251,449 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupRuntimeState", + "type": "Interface", + "tags": [], + "label": "ControlGroupRuntimeState", + "description": [], + "path": "src/plugins/controls/public/react_controls/control_group/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupRuntimeState.chainingSystem", + "type": "CompoundType", + "tags": [], + "label": "chainingSystem", + "description": [], + "signature": [ + "\"NONE\" | \"HIERARCHICAL\"" + ], + "path": "src/plugins/controls/public/react_controls/control_group/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupRuntimeState.defaultControlGrow", + "type": "CompoundType", + "tags": [], + "label": "defaultControlGrow", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/controls/public/react_controls/control_group/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupRuntimeState.defaultControlWidth", + "type": "CompoundType", + "tags": [], + "label": "defaultControlWidth", + "description": [], + "signature": [ + { + "pluginId": "controls", + "scope": "common", + "docId": "kibControlsPluginApi", + "section": "def-common.ControlWidth", + "text": "ControlWidth" + }, + " | undefined" + ], + "path": "src/plugins/controls/public/react_controls/control_group/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupRuntimeState.labelPosition", + "type": "CompoundType", + "tags": [], + "label": "labelPosition", + "description": [], + "signature": [ + "\"twoLine\" | \"oneLine\"" + ], + "path": "src/plugins/controls/public/react_controls/control_group/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupRuntimeState.autoApplySelections", + "type": "boolean", + "tags": [], + "label": "autoApplySelections", + "description": [], + "path": "src/plugins/controls/public/react_controls/control_group/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupRuntimeState.ignoreParentSettings", + "type": "Object", + "tags": [], + "label": "ignoreParentSettings", + "description": [], + "signature": [ + "ParentIgnoreSettings", + " | undefined" + ], + "path": "src/plugins/controls/public/react_controls/control_group/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupRuntimeState.initialChildControlState", + "type": "Object", + "tags": [], + "label": "initialChildControlState", + "description": [], + "signature": [ + "ControlPanelsState", + "<", + "ControlPanelState", + ">" + ], + "path": "src/plugins/controls/public/react_controls/control_group/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupRuntimeState.editorConfig", + "type": "Object", + "tags": [], + "label": "editorConfig", + "description": [ + "TODO: Handle the editor config, which is used with the control group renderer component" + ], + "signature": [ + "{ hideDataViewSelector?: boolean | undefined; hideWidthSettings?: boolean | undefined; hideAdditionalSettings?: boolean | undefined; } | undefined" + ], + "path": "src/plugins/controls/public/react_controls/control_group/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupSerializedState", + "type": "Interface", + "tags": [], + "label": "ControlGroupSerializedState", + "description": [], + "path": "src/plugins/controls/public/react_controls/control_group/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupSerializedState.chainingSystem", + "type": "CompoundType", + "tags": [], + "label": "chainingSystem", + "description": [], + "signature": [ + "\"NONE\" | \"HIERARCHICAL\"" + ], + "path": "src/plugins/controls/public/react_controls/control_group/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupSerializedState.panelsJSON", + "type": "string", + "tags": [], + "label": "panelsJSON", + "description": [], + "path": "src/plugins/controls/public/react_controls/control_group/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupSerializedState.ignoreParentSettingsJSON", + "type": "string", + "tags": [], + "label": "ignoreParentSettingsJSON", + "description": [], + "path": "src/plugins/controls/public/react_controls/control_group/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupSerializedState.controlStyle", + "type": "CompoundType", + "tags": [], + "label": "controlStyle", + "description": [], + "signature": [ + "\"twoLine\" | \"oneLine\"" + ], + "path": "src/plugins/controls/public/react_controls/control_group/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupSerializedState.showApplySelections", + "type": "CompoundType", + "tags": [], + "label": "showApplySelections", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/controls/public/react_controls/control_group/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "controls", + "id": "def-public.DataControlFactory", + "type": "Interface", + "tags": [], + "label": "DataControlFactory", + "description": [], + "signature": [ + { + "pluginId": "controls", + "scope": "public", + "docId": "kibControlsPluginApi", + "section": "def-public.DataControlFactory", + "text": "DataControlFactory" + }, + " extends ", + { + "pluginId": "controls", + "scope": "public", + "docId": "kibControlsPluginApi", + "section": "def-public.ControlFactory", + "text": "ControlFactory" + }, + "" + ], + "path": "src/plugins/controls/public/react_controls/controls/data_controls/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "controls", + "id": "def-public.DataControlFactory.isFieldCompatible", + "type": "Function", + "tags": [], + "label": "isFieldCompatible", + "description": [], + "signature": [ + "(field: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataViewField", + "text": "DataViewField" + }, + ") => boolean" + ], + "path": "src/plugins/controls/public/react_controls/controls/data_controls/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "controls", + "id": "def-public.DataControlFactory.isFieldCompatible.$1", + "type": "Object", + "tags": [], + "label": "field", + "description": [], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataViewField", + "text": "DataViewField" + } + ], + "path": "src/plugins/controls/public/react_controls/controls/data_controls/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "controls", + "id": "def-public.DataControlFactory.CustomOptionsComponent", + "type": "Function", + "tags": [], + "label": "CustomOptionsComponent", + "description": [], + "signature": [ + "React.FC<", + "CustomOptionsComponentProps", + "> | undefined" + ], + "path": "src/plugins/controls/public/react_controls/controls/data_controls/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "controls", + "id": "def-public.DataControlServices", + "type": "Interface", + "tags": [], + "label": "DataControlServices", + "description": [], + "path": "src/plugins/controls/public/react_controls/controls/data_controls/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "controls", + "id": "def-public.DataControlServices.core", + "type": "Object", + "tags": [], + "label": "core", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-lifecycle-browser", + "scope": "public", + "docId": "kibKbnCoreLifecycleBrowserPluginApi", + "section": "def-public.CoreStart", + "text": "CoreStart" + } + ], + "path": "src/plugins/controls/public/react_controls/controls/data_controls/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "controls", + "id": "def-public.DataControlServices.data", + "type": "Object", + "tags": [], + "label": "data", + "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "public", + "docId": "kibDataPluginApi", + "section": "def-public.DataPublicPluginStart", + "text": "DataPublicPluginStart" + } + ], + "path": "src/plugins/controls/public/react_controls/controls/data_controls/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "controls", + "id": "def-public.DataControlServices.dataViews", + "type": "Object", + "tags": [], + "label": "dataViews", + "description": [], + "signature": [ + { + "pluginId": "dataViews", + "scope": "public", + "docId": "kibDataViewsPluginApi", + "section": "def-public.DataViewsServicePublic", + "text": "DataViewsServicePublic" + } + ], + "path": "src/plugins/controls/public/react_controls/controls/data_controls/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "controls", + "id": "def-public.DefaultDataControlState", + "type": "Interface", + "tags": [], + "label": "DefaultDataControlState", + "description": [], + "signature": [ + { + "pluginId": "controls", + "scope": "public", + "docId": "kibControlsPluginApi", + "section": "def-public.DefaultDataControlState", + "text": "DefaultDataControlState" + }, + " extends ", + "DefaultControlState" + ], + "path": "src/plugins/controls/public/react_controls/controls/data_controls/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "controls", + "id": "def-public.DefaultDataControlState.dataViewId", + "type": "string", + "tags": [], + "label": "dataViewId", + "description": [], + "path": "src/plugins/controls/public/react_controls/controls/data_controls/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "controls", + "id": "def-public.DefaultDataControlState.fieldName", + "type": "string", + "tags": [], + "label": "fieldName", + "description": [], + "path": "src/plugins/controls/public/react_controls/controls/data_controls/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "controls", + "id": "def-public.DefaultDataControlState.title", + "type": "string", + "tags": [], + "label": "title", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/controls/public/react_controls/controls/data_controls/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "controls", "id": "def-public.IEditableControlFactory", @@ -5850,7 +6293,7 @@ "label": "ACTION_EDIT_CONTROL", "description": [], "signature": [ - "\"editControl\"" + "\"editLegacyEmbeddableControl\"" ], "path": "src/plugins/controls/public/control_group/actions/index.ts", "deprecated": false, @@ -6039,6 +6482,184 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupApi", + "type": "Type", + "tags": [], + "label": "ControlGroupApi", + "description": [], + "signature": [ + { + "pluginId": "@kbn/presentation-containers", + "scope": "public", + "docId": "kibKbnPresentationContainersPluginApi", + "section": "def-public.PresentationContainer", + "text": "PresentationContainer" + }, + " & ", + { + "pluginId": "embeddable", + "scope": "public", + "docId": "kibEmbeddablePluginApi", + "section": "def-public.DefaultEmbeddableApi", + "text": "DefaultEmbeddableApi" + }, + "<", + { + "pluginId": "controls", + "scope": "public", + "docId": "kibControlsPluginApi", + "section": "def-public.ControlGroupSerializedState", + "text": "ControlGroupSerializedState" + }, + ", ", + { + "pluginId": "controls", + "scope": "public", + "docId": "kibControlsPluginApi", + "section": "def-public.ControlGroupRuntimeState", + "text": "ControlGroupRuntimeState" + }, + "> & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesFilters", + "text": "PublishesFilters" + }, + " & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesDataViews", + "text": "PublishesDataViews" + }, + " & ", + { + "pluginId": "@kbn/presentation-containers", + "scope": "public", + "docId": "kibKbnPresentationContainersPluginApi", + "section": "def-public.HasSerializedChildState", + "text": "HasSerializedChildState" + }, + "<", + "ControlPanelState", + "> & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.HasEditCapabilities", + "text": "HasEditCapabilities" + }, + " & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesDataLoading", + "text": "PublishesDataLoading" + }, + " & Pick<", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesUnsavedChanges", + "text": "PublishesUnsavedChanges" + }, + ", \"unsavedChanges\"> & ", + "PublishesControlDisplaySettings", + " & { labelPosition: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishingSubject", + "text": "PublishingSubject" + }, + "<", + "ControlStyle", + ">; } & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesTimeslice", + "text": "PublishesTimeslice" + }, + " & Partial<", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.HasParentApi", + "text": "HasParentApi" + }, + "<", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesUnifiedSearch", + "text": "PublishesUnifiedSearch" + }, + "> & ", + { + "pluginId": "@kbn/presentation-containers", + "scope": "public", + "docId": "kibKbnPresentationContainersPluginApi", + "section": "def-public.HasSaveNotification", + "text": "HasSaveNotification" + }, + "> & { asyncResetUnsavedChanges: () => Promise; autoApplySelections$: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishingSubject", + "text": "PublishingSubject" + }, + "; controlFetch$: (controlUuid: string) => ", + "Observable", + "<", + "ControlFetchContext", + ">; getLastSavedControlState: (controlUuid: string) => object; ignoreParentSettings$: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishingSubject", + "text": "PublishingSubject" + }, + "<", + "ParentIgnoreSettings", + " | undefined>; allowExpensiveQueries$: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishingSubject", + "text": "PublishingSubject" + }, + "; untilInitialized: () => Promise; openAddDataControlFlyout: (settings?: { controlInputTransform?: ", + { + "pluginId": "controls", + "scope": "common", + "docId": "kibControlsPluginApi", + "section": "def-common.ControlInputTransform", + "text": "ControlInputTransform" + }, + " | undefined; } | undefined) => void; }" + ], + "path": "src/plugins/controls/public/react_controls/control_group/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "controls", "id": "def-public.ControlGroupAPI", @@ -6265,6 +6886,148 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "controls", + "id": "def-public.DataControlApi", + "type": "Type", + "tags": [], + "label": "DataControlApi", + "description": [], + "signature": [ + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesDataLoading", + "text": "PublishesDataLoading" + }, + " & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesBlockingError", + "text": "PublishesBlockingError" + }, + " & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesUnsavedChanges", + "text": "PublishesUnsavedChanges" + }, + " & ", + "PublishesControlDisplaySettings", + " & Partial<", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesPanelTitle", + "text": "PublishesPanelTitle" + }, + " & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesDisabledActionIds", + "text": "PublishesDisabledActionIds" + }, + " & ", + "HasCustomPrepend", + "> & ", + { + "pluginId": "controls", + "scope": "public", + "docId": "kibControlsPluginApi", + "section": "def-public.CanClearSelections", + "text": "CanClearSelections" + }, + " & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.HasType", + "text": "HasType" + }, + " & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.HasUniqueId", + "text": "HasUniqueId" + }, + " & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.HasParentApi", + "text": "HasParentApi" + }, + "<", + { + "pluginId": "controls", + "scope": "public", + "docId": "kibControlsPluginApi", + "section": "def-public.ControlGroupApi", + "text": "ControlGroupApi" + }, + "> & { serializeState: () => ", + { + "pluginId": "@kbn/presentation-containers", + "scope": "public", + "docId": "kibKbnPresentationContainersPluginApi", + "section": "def-public.SerializedPanelState", + "text": "SerializedPanelState" + }, + "<", + "DefaultControlState", + ">; setDataLoading: (loading: boolean) => void; setBlockingError: (error: Error | undefined) => void; } & Omit<", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesPanelTitle", + "text": "PublishesPanelTitle" + }, + ", \"hidePanelTitle\"> & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.HasEditCapabilities", + "text": "HasEditCapabilities" + }, + " & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesDataViews", + "text": "PublishesDataViews" + }, + " & ", + "PublishesField", + " & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesFilters", + "text": "PublishesFilters" + }, + " & { untilFiltersReady: () => Promise; }" + ], + "path": "src/plugins/controls/public/react_controls/controls/data_controls/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "controls", "id": "def-public.DataControlInput", diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index e6e3f510a98fe..11ea1aa151fe0 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 351 | 0 | 343 | 19 | +| 380 | 0 | 371 | 27 | ## Client diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index fa7d1b01841ab..b53222090c339 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2024-08-08 +date: 2024-08-12 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 980cd85a0da79..fee7c63a488e5 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2024-08-08 +date: 2024-08-12 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 49129c208c426..03887ca990b60 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2024-08-08 +date: 2024-08-12 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 aa86036114e90..448330fddd505 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_quality.mdx b/api_docs/data_quality.mdx index 0d8a6810f92ad..050b78e15b0f8 100644 --- a/api_docs/data_quality.mdx +++ b/api_docs/data_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataQuality title: "dataQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the dataQuality plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataQuality'] --- import dataQualityObj from './data_quality.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 217b5ce6db793..d44b103b9316f 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2024-08-08 +date: 2024-08-12 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 a9df47c7f1a12..4c11abbb97d58 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2024-08-08 +date: 2024-08-12 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 9b376d766fbde..aee386ff5514a 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2024-08-08 +date: 2024-08-12 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 3ecaf07a64b0d..122c7660ba46c 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2024-08-08 +date: 2024-08-12 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 33c093e969ca1..e6f76d9dcfe76 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.devdocs.json b/api_docs/data_views.devdocs.json index 5bce761617486..64fbde62fb821 100644 --- a/api_docs/data_views.devdocs.json +++ b/api_docs/data_views.devdocs.json @@ -14054,6 +14054,10 @@ "plugin": "controls", "path": "src/plugins/controls/public/services/options_list/options_list_service.ts" }, + { + "plugin": "controls", + "path": "src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/options_list_fetch_cache.ts" + }, { "plugin": "@kbn/lens-embeddable-utils", "path": "packages/kbn-lens-embeddable-utils/config_builder/columns/breakdown.ts" diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index f2d5f799c7b2b..6ce8f7cc8f3ec 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2024-08-08 +date: 2024-08-12 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 8ee48d6b5ab84..6ec542d033b9e 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.devdocs.json b/api_docs/dataset_quality.devdocs.json index 6fdc03a22121e..4e12827e79f3f 100644 --- a/api_docs/dataset_quality.devdocs.json +++ b/api_docs/dataset_quality.devdocs.json @@ -265,20 +265,26 @@ "DatasetQualityRouteCreateOptions", "; }[TEndpoint] extends { endpoint: any; params?: infer TRouteParamsRT extends ", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.RouteParamsRT", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.RouteParamsRT", "text": "RouteParamsRT" }, " | undefined | undefined; handler: ({}: any) => Promise; } & ", - "ServerRouteCreateOptions", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRouteCreateOptions", + "text": "ServerRouteCreateOptions" + }, " ? TRouteParamsRT extends ", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.RouteParamsRT", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.RouteParamsRT", "text": "RouteParamsRT" }, " ? ClientRequestParamsOfType : {} : never" @@ -419,7 +425,13 @@ " & { params: { query: { type?: \"metrics\" | \"synthetics\" | \"traces\" | \"logs\" | \"profiling\" | undefined; } & { datasetQuery?: string | undefined; }; }; }) => Promise<{ datasetUserPrivileges: { canMonitor: boolean; } & { canRead: boolean; canViewIntegrations: boolean; }; dataStreamsStats: ({ name: string; userPrivileges: { canMonitor: boolean; }; } & { size?: string | undefined; sizeBytes?: number | undefined; lastActivity?: number | undefined; integration?: string | undefined; totalDocs?: number | null | undefined; })[]; }>; } & ", "DatasetQualityRouteCreateOptions", "; }[TEndpoint] extends { endpoint: any; params?: any; handler: ({}: any) => Promise; } & ", - "ServerRouteCreateOptions", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRouteCreateOptions", + "text": "ServerRouteCreateOptions" + }, " ? TReturnType extends ", { "pluginId": "@kbn/core-http-server", diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index e43153f58c2a1..a1cb7447bf7f8 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2024-08-08 +date: 2024-08-12 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 c620d677c637e..a72c07b29e365 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 1cdf64b98f75b..cb97812f417ad 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -615,7 +615,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [options_list_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/services/options_list/options_list_service.ts#:~:text=title), [options_list_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/services/options_list/options_list_service.ts#:~:text=title), [data_views.story.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/services/data_views/data_views.story.ts#:~:text=title) | - | +| | [options_list_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/services/options_list/options_list_service.ts#:~:text=title), [options_list_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/services/options_list/options_list_service.ts#:~:text=title), [options_list_fetch_cache.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/options_list_fetch_cache.ts#:~:text=title), [data_views.story.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/services/data_views/data_views.story.ts#:~:text=title) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/plugin.ts#:~:text=registerEmbeddableFactory), [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/plugin.ts#:~:text=registerEmbeddableFactory), [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/plugin.ts#:~:text=registerEmbeddableFactory), [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/plugin.ts#:~:text=registerEmbeddableFactory) | - | | | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/services/embeddable/types.ts#:~:text=getEmbeddableFactory), [embeddable_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/services/embeddable/embeddable_service.ts#:~:text=getEmbeddableFactory), [embeddable.story.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/services/embeddable/embeddable.story.ts#:~:text=getEmbeddableFactory) | - | | | [options_list_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/options_list/options_list_persistable_state.ts#:~:text=SavedObjectReference), [options_list_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/options_list/options_list_persistable_state.ts#:~:text=SavedObjectReference), [options_list_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/options_list/options_list_persistable_state.ts#:~:text=SavedObjectReference), [range_slider_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/range_slider/range_slider_persistable_state.ts#:~:text=SavedObjectReference), [range_slider_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/range_slider/range_slider_persistable_state.ts#:~:text=SavedObjectReference), [range_slider_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/range_slider/range_slider_persistable_state.ts#:~:text=SavedObjectReference), [time_slider_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/time_slider/time_slider_persistable_state.ts#:~:text=SavedObjectReference), [time_slider_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/time_slider/time_slider_persistable_state.ts#:~:text=SavedObjectReference), [time_slider_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/time_slider/time_slider_persistable_state.ts#:~:text=SavedObjectReference), [control_group_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/control_group/control_group_persistable_state.ts#:~:text=SavedObjectReference)+ 2 more | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 214172dd17893..a092135b9907e 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 4188c4ba2acb2..29421cdd19f45 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2024-08-08 +date: 2024-08-12 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 672e4f49463dc..3098e455f5469 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2024-08-08 +date: 2024-08-12 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 5ee65b1dadaf2..44d445aae4d55 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/discover_shared.mdx b/api_docs/discover_shared.mdx index bf048563a789e..055b031f2c71d 100644 --- a/api_docs/discover_shared.mdx +++ b/api_docs/discover_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverShared title: "discoverShared" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverShared plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverShared'] --- import discoverSharedObj from './discover_shared.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index 280c1e5a357e0..28dd537956620 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2024-08-08 +date: 2024-08-12 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 f5ae164d99b85..3df50f4921e28 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.devdocs.json b/api_docs/embeddable.devdocs.json index ff4db94fd499e..2f366ce07e0ae 100644 --- a/api_docs/embeddable.devdocs.json +++ b/api_docs/embeddable.devdocs.json @@ -9679,7 +9679,7 @@ "section": "def-public.PublishesPhaseEvents", "text": "PublishesPhaseEvents" }, - ",", + ",Partial<", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -9687,7 +9687,7 @@ "section": "def-public.PublishesUnsavedChanges", "text": "PublishesUnsavedChanges" }, - ",", + ">,", { "pluginId": "@kbn/presentation-containers", "scope": "public", diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 8300959954d01..5145bda514e87 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2024-08-08 +date: 2024-08-12 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 89748a9650e5d..d4d58d1eb88e7 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2024-08-08 +date: 2024-08-12 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 070da8f90d84b..0c886976e390d 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2024-08-08 +date: 2024-08-12 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 b1fcb1fabf984..56a36f276315a 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/entities_data_access.devdocs.json b/api_docs/entities_data_access.devdocs.json new file mode 100644 index 0000000000000..26fd0abf8e82b --- /dev/null +++ b/api_docs/entities_data_access.devdocs.json @@ -0,0 +1,43 @@ +{ + "id": "entitiesDataAccess", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [], + "start": { + "parentPluginId": "entitiesDataAccess", + "id": "def-server.EntitiesDataAccessPluginStart", + "type": "Type", + "tags": [], + "label": "EntitiesDataAccessPluginStart", + "description": [], + "signature": [ + "void" + ], + "path": "x-pack/plugins/observability_solution/entities_data_access/server/plugin.ts", + "deprecated": false, + "trackAdoption": false, + "lifecycle": "start", + "initialIsOpen": true + } + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/entities_data_access.mdx b/api_docs/entities_data_access.mdx new file mode 100644 index 0000000000000..13445a2e2d27d --- /dev/null +++ b/api_docs/entities_data_access.mdx @@ -0,0 +1,30 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibEntitiesDataAccessPluginApi +slug: /kibana-dev-docs/api/entitiesDataAccess +title: "entitiesDataAccess" +image: https://source.unsplash.com/400x175/?github +description: API docs for the entitiesDataAccess plugin +date: 2024-08-12 +tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entitiesDataAccess'] +--- +import entitiesDataAccessObj from './entities_data_access.devdocs.json'; + + + +Contact [@elastic/obs-entities](https://github.com/orgs/elastic/teams/obs-entities) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 2 | 0 | 2 | 0 | + +## Server + +### Start + + diff --git a/api_docs/entity_manager.mdx b/api_docs/entity_manager.mdx index 6ef69d72a9216..19d0b427eb5e3 100644 --- a/api_docs/entity_manager.mdx +++ b/api_docs/entity_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entityManager title: "entityManager" image: https://source.unsplash.com/400x175/?github description: API docs for the entityManager plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entityManager'] --- import entityManagerObj from './entity_manager.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 423b38a595e27..b7398ec32061f 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/esql.mdx b/api_docs/esql.mdx index 46e6f91e8ed4a..4e94497ad896e 100644 --- a/api_docs/esql.mdx +++ b/api_docs/esql.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esql title: "esql" image: https://source.unsplash.com/400x175/?github description: API docs for the esql plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esql'] --- import esqlObj from './esql.devdocs.json'; diff --git a/api_docs/esql_data_grid.mdx b/api_docs/esql_data_grid.mdx index 0b9da1f1b28fa..8e0c1a69cee11 100644 --- a/api_docs/esql_data_grid.mdx +++ b/api_docs/esql_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esqlDataGrid title: "esqlDataGrid" image: https://source.unsplash.com/400x175/?github description: API docs for the esqlDataGrid plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esqlDataGrid'] --- import esqlDataGridObj from './esql_data_grid.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index e769509fecb52..b062a3d42b233 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2024-08-08 +date: 2024-08-12 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 4472515fd16d5..182860b30a4e2 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2024-08-08 +date: 2024-08-12 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 61d7c8b147f79..13340fb586eac 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2024-08-08 +date: 2024-08-12 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 7bb11d2ecf996..fe9e4f7827f29 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2024-08-08 +date: 2024-08-12 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 532dcdae8cc35..feab4322528c8 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2024-08-08 +date: 2024-08-12 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 317aec53da813..7230f341a3aa6 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2024-08-08 +date: 2024-08-12 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 9d7cf427a2689..b20a668be5fc2 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2024-08-08 +date: 2024-08-12 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 bd382177187cb..d097cc08f14ce 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2024-08-08 +date: 2024-08-12 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 0359f92a2cecb..56ab7d41f29f6 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2024-08-08 +date: 2024-08-12 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 40a4597f7eb42..6912c4b2757e5 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2024-08-08 +date: 2024-08-12 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 c8181e3ef7e45..cfa6f799680eb 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2024-08-08 +date: 2024-08-12 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 bca3f02aee2cd..8be7b458c3849 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2024-08-08 +date: 2024-08-12 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 61962142e91a8..1af81fa349c61 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2024-08-08 +date: 2024-08-12 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 9d3e9708df9df..557aaccdfbfee 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2024-08-08 +date: 2024-08-12 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 fdb64005bba0f..5eaec336c2f70 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2024-08-08 +date: 2024-08-12 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 add1124a27f16..4078e1a80dfed 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2024-08-08 +date: 2024-08-12 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 5565fed950a80..98bb58b6f1817 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2024-08-08 +date: 2024-08-12 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 f36ddf6d641c1..893a59ad5d743 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2024-08-08 +date: 2024-08-12 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 5cc03a9ae31c9..d7ab07c26844f 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2024-08-08 +date: 2024-08-12 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 f04f1eee3f345..4f8c9c820ab50 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/fields_metadata.mdx b/api_docs/fields_metadata.mdx index c5edf3e1200bf..51ce1bfd81e97 100644 --- a/api_docs/fields_metadata.mdx +++ b/api_docs/fields_metadata.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldsMetadata title: "fieldsMetadata" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldsMetadata plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldsMetadata'] --- import fieldsMetadataObj from './fields_metadata.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 4c2bbfd6d9f0e..58982a21288eb 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2024-08-08 +date: 2024-08-12 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 2c4d25fe33985..8d6cc360a1a84 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2024-08-08 +date: 2024-08-12 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 cac7220d1d4b3..19b8764821c62 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index 6895c384f966a..54f1b16567154 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -23217,7 +23217,7 @@ "label": "monitoring_enabled", "description": [], "signature": [ - "(\"metrics\" | \"logs\")[] | undefined" + "(\"metrics\" | \"traces\" | \"logs\")[] | undefined" ], "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", "deprecated": false, diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index b33a738e24bbe..16adcf271500b 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2024-08-08 +date: 2024-08-12 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 270e5a206cd3b..2af9c7e64aace 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2024-08-08 +date: 2024-08-12 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 dc2bec84e837e..0fea91e2cb65d 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2024-08-08 +date: 2024-08-12 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 9ab87fbd39102..9d0d825a078ea 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2024-08-08 +date: 2024-08-12 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 7df20ef137d69..93fdfd71112f1 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2024-08-08 +date: 2024-08-12 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 295fc27fc0d7a..691bb2e211ced 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2024-08-08 +date: 2024-08-12 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 7fb7fd6369280..f41a91b99ef0b 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/inference.mdx b/api_docs/inference.mdx index 3b7a0ff19fe9b..66079391876a8 100644 --- a/api_docs/inference.mdx +++ b/api_docs/inference.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inference title: "inference" image: https://source.unsplash.com/400x175/?github description: API docs for the inference plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inference'] --- import inferenceObj from './inference.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 95ff57c5ca1c9..94836d135224b 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: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx index ab6a8a908c210..21275e4ccd0c1 100644 --- a/api_docs/ingest_pipelines.mdx +++ b/api_docs/ingest_pipelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ingestPipelines title: "ingestPipelines" image: https://source.unsplash.com/400x175/?github description: API docs for the ingestPipelines plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] --- import ingestPipelinesObj from './ingest_pipelines.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 79d1f3dbcec0e..0ee70733c7a48 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/integration_assistant.mdx b/api_docs/integration_assistant.mdx index 292b321958009..9cca3a90b054e 100644 --- a/api_docs/integration_assistant.mdx +++ b/api_docs/integration_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/integrationAssistant title: "integrationAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the integrationAssistant plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'integrationAssistant'] --- import integrationAssistantObj from './integration_assistant.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index 74a771382dc74..9f4f83739213c 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/investigate.mdx b/api_docs/investigate.mdx index 6ee8666fcb479..689e92313ecb3 100644 --- a/api_docs/investigate.mdx +++ b/api_docs/investigate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigate title: "investigate" image: https://source.unsplash.com/400x175/?github description: API docs for the investigate plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigate'] --- import investigateObj from './investigate.devdocs.json'; diff --git a/api_docs/investigate_app.devdocs.json b/api_docs/investigate_app.devdocs.json index 7c5650360609d..d8b91a87450ee 100644 --- a/api_docs/investigate_app.devdocs.json +++ b/api_docs/investigate_app.devdocs.json @@ -50,7 +50,49 @@ "label": "InvestigateAppServerRouteRepository", "description": [], "signature": [ - "{}" + "{ \"GET /api/observability/investigations/{id} 2023-10-31\": { endpoint: \"GET /api/observability/investigations/{id} 2023-10-31\"; params?: ", + "TypeC", + "<{ path: ", + "TypeC", + "<{ id: ", + "StringC", + "; }>; }> | undefined; handler: ({}: ", + "InvestigateAppRouteHandlerResources", + " & { params: { path: { id: string; }; }; }) => Promise<{ id: string; title: string; createdAt: number; createdBy: string; parameters: { timeRange: { from: number; to: number; }; }; }>; } & ", + "InvestigateAppRouteCreateOptions", + "; \"GET /api/observability/investigations 2023-10-31\": { endpoint: \"GET /api/observability/investigations 2023-10-31\"; params?: ", + "PartialC", + "<{ query: ", + "PartialC", + "<{ page: ", + "StringC", + "; perPage: ", + "StringC", + "; }>; }> | undefined; handler: ({}: ", + "InvestigateAppRouteHandlerResources", + " & { params?: { query?: { page?: string | undefined; perPage?: string | undefined; } | undefined; } | undefined; }) => Promise<{ page: number; perPage: number; total: number; results: { id: string; title: string; createdAt: number; createdBy: string; parameters: { timeRange: { from: number; to: number; }; }; }[]; }>; } & ", + "InvestigateAppRouteCreateOptions", + "; \"POST /api/observability/investigations 2023-10-31\": { endpoint: \"POST /api/observability/investigations 2023-10-31\"; params?: ", + "TypeC", + "<{ body: ", + "TypeC", + "<{ id: ", + "StringC", + "; title: ", + "StringC", + "; parameters: ", + "TypeC", + "<{ timeRange: ", + "TypeC", + "<{ from: ", + "NumberC", + "; to: ", + "NumberC", + "; }>; }>; }>; }> | undefined; handler: ({}: ", + "InvestigateAppRouteHandlerResources", + " & { params: { body: { id: string; title: string; parameters: { timeRange: { from: number; to: number; }; }; }; }; }) => Promise<{ id: string; title: string; createdAt: number; createdBy: string; parameters: { timeRange: { from: number; to: number; }; }; }>; } & ", + "InvestigateAppRouteCreateOptions", + "; }" ], "path": "x-pack/plugins/observability_solution/investigate_app/server/routes/get_global_investigate_app_server_route_repository.ts", "deprecated": false, diff --git a/api_docs/investigate_app.mdx b/api_docs/investigate_app.mdx index 7f32a9e495b69..9bc0fed42bee5 100644 --- a/api_docs/investigate_app.mdx +++ b/api_docs/investigate_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigateApp title: "investigateApp" image: https://source.unsplash.com/400x175/?github description: API docs for the investigateApp plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigateApp'] --- import investigateAppObj from './investigate_app.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 5 | 0 | 5 | 0 | +| 5 | 0 | 5 | 2 | ## Client diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 8bd5d596a4a1a..c263ed648017a 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2024-08-08 +date: 2024-08-12 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 28beb5f5e71b9..719037ef36428 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2024-08-08 +date: 2024-08-12 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 1ae57b349f2d7..778879e941912 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_pattern_analysis.mdx b/api_docs/kbn_aiops_log_pattern_analysis.mdx index ee8b1ca9d51b7..9326381c7a9f4 100644 --- a/api_docs/kbn_aiops_log_pattern_analysis.mdx +++ b/api_docs/kbn_aiops_log_pattern_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-pattern-analysis title: "@kbn/aiops-log-pattern-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-pattern-analysis plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-pattern-analysis'] --- import kbnAiopsLogPatternAnalysisObj from './kbn_aiops_log_pattern_analysis.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_rate_analysis.mdx b/api_docs/kbn_aiops_log_rate_analysis.mdx index 0f822889bef9c..a14edcd6f18a0 100644 --- a/api_docs/kbn_aiops_log_rate_analysis.mdx +++ b/api_docs/kbn_aiops_log_rate_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-rate-analysis title: "@kbn/aiops-log-rate-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-rate-analysis plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-rate-analysis'] --- import kbnAiopsLogRateAnalysisObj from './kbn_aiops_log_rate_analysis.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index 91e46ad099474..d1b138b6b3980 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2024-08-08 +date: 2024-08-12 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_comparators.mdx b/api_docs/kbn_alerting_comparators.mdx index b61f1eb256a65..8279e1e69910c 100644 --- a/api_docs/kbn_alerting_comparators.mdx +++ b/api_docs/kbn_alerting_comparators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-comparators title: "@kbn/alerting-comparators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-comparators plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-comparators'] --- import kbnAlertingComparatorsObj from './kbn_alerting_comparators.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 0028ba5a32acd..abd118777e4a1 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2024-08-08 +date: 2024-08-12 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 2ab32c9514c0f..48dfb96f8cbe0 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2024-08-08 +date: 2024-08-12 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 f024c69a70e9a..b6be95bf2bd6a 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2024-08-08 +date: 2024-08-12 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_grouping.mdx b/api_docs/kbn_alerts_grouping.mdx index c531517955cd9..71602e641dc2d 100644 --- a/api_docs/kbn_alerts_grouping.mdx +++ b/api_docs/kbn_alerts_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-grouping title: "@kbn/alerts-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-grouping plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-grouping'] --- import kbnAlertsGroupingObj from './kbn_alerts_grouping.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.devdocs.json b/api_docs/kbn_alerts_ui_shared.devdocs.json index 17e09808e3c68..10feecc712b89 100644 --- a/api_docs/kbn_alerts_ui_shared.devdocs.json +++ b/api_docs/kbn_alerts_ui_shared.devdocs.json @@ -161,7 +161,7 @@ "id": "def-public.AlertsSearchBar.$1", "type": "Object", "tags": [], - "label": "{\n appName,\n disableQueryLanguageSwitcher = false,\n featureIds,\n ruleTypeId,\n query,\n filters,\n onQueryChange,\n onQuerySubmit,\n onFiltersUpdated,\n rangeFrom,\n rangeTo,\n showFilterBar = false,\n showDatePicker = true,\n showSubmitButton = true,\n placeholder = SEARCH_BAR_PLACEHOLDER,\n submitOnBlur = false,\n http,\n toasts,\n unifiedSearchBar,\n dataViewsService,\n}", + "label": "{\n appName,\n disableQueryLanguageSwitcher = false,\n featureIds = EMPTY_FEATURE_IDS,\n ruleTypeId,\n query,\n filters,\n onQueryChange,\n onQuerySubmit,\n onFiltersUpdated,\n rangeFrom,\n rangeTo,\n showFilterBar = false,\n showDatePicker = true,\n showSubmitButton = true,\n placeholder = SEARCH_BAR_PLACEHOLDER,\n submitOnBlur = false,\n http,\n toasts,\n unifiedSearchBar,\n dataViewsService,\n}", "description": [], "signature": [ { @@ -279,56 +279,60 @@ }, { "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.useAlertDataView", + "id": "def-public.useAlertsDataView", "type": "Function", "tags": [], - "label": "useAlertDataView", - "description": [], + "label": "useAlertsDataView", + "description": [ + "\nComputes a {@link DataViewBase} object for alerts indices based on the provided feature ids\n" + ], "signature": [ - "(props: ", + "({ http, dataViewsService, toasts, featureIds, }: ", { "pluginId": "@kbn/alerts-ui-shared", "scope": "public", "docId": "kibKbnAlertsUiSharedPluginApi", - "section": "def-public.UseAlertDataViewProps", - "text": "UseAlertDataViewProps" + "section": "def-public.UseAlertsDataViewParams", + "text": "UseAlertsDataViewParams" }, ") => ", { "pluginId": "@kbn/alerts-ui-shared", "scope": "public", "docId": "kibKbnAlertsUiSharedPluginApi", - "section": "def-public.UseAlertDataViewResult", - "text": "UseAlertDataViewResult" + "section": "def-public.UseAlertsDataViewResult", + "text": "UseAlertsDataViewResult" } ], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alert_data_view.ts", + "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alerts_data_view.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.useAlertDataView.$1", + "id": "def-public.useAlertsDataView.$1", "type": "Object", "tags": [], - "label": "props", + "label": "{\n http,\n dataViewsService,\n toasts,\n featureIds,\n}", "description": [], "signature": [ { "pluginId": "@kbn/alerts-ui-shared", "scope": "public", "docId": "kibKbnAlertsUiSharedPluginApi", - "section": "def-public.UseAlertDataViewProps", - "text": "UseAlertDataViewProps" + "section": "def-public.UseAlertsDataViewParams", + "text": "UseAlertsDataViewParams" } ], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alert_data_view.ts", + "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alerts_data_view.ts", "deprecated": false, "trackAdoption": false, "isRequired": true } ], - "returnComment": [], + "returnComment": [ + "A {@link DataViewBase } object, intentionally not typed as a complete {@link DataView } object\nsince only Security Solution uses an actual in-memory data view (when `featureIds = ['siem']).\nIn all other cases the data view is computed from the index names and fields fetched from the\nalerting APIs." + ], "initialIsOpen": false }, { @@ -414,59 +418,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.useFindAlertsQuery", - "type": "Function", - "tags": [], - "label": "useFindAlertsQuery", - "description": [ - "\nA generic hook to find alerts\n\nStill applies alerts authorization rules but, unlike triggers_actions_ui's `useFetchAlerts` hook,\nallows to perform arbitrary queries" - ], - "signature": [ - "({ http, toasts, enabled, params, }: ", - { - "pluginId": "@kbn/alerts-ui-shared", - "scope": "public", - "docId": "kibKbnAlertsUiSharedPluginApi", - "section": "def-public.UseFindAlertsQueryProps", - "text": "UseFindAlertsQueryProps" - }, - ") => ", - "UseQueryResult", - "<", - "SearchResponseBody", - "<{}, T>, Error>" - ], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_find_alerts_query.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.useFindAlertsQuery.$1", - "type": "Object", - "tags": [], - "label": "{\n http,\n toasts,\n enabled = true,\n params,\n}", - "description": [], - "signature": [ - { - "pluginId": "@kbn/alerts-ui-shared", - "scope": "public", - "docId": "kibKbnAlertsUiSharedPluginApi", - "section": "def-public.UseFindAlertsQueryProps", - "text": "UseFindAlertsQueryProps" - } - ], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_find_alerts_query.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/alerts-ui-shared", "id": "def-public.useGetAlertsGroupAggregationsQuery", @@ -894,95 +845,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.useSearchAlertsQuery", - "type": "Function", - "tags": [ - "external" - ], - "label": "useSearchAlertsQuery", - "description": [ - "\nQuery alerts\n\nWhen testing components that depend on this hook, prefer mocking the {@link searchAlerts} function instead of the hook itself." - ], - "signature": [ - "({ data, ...params }: { fields?: ", - "QueryDslFieldAndFormat", - "[] | undefined; featureIds: ", - { - "pluginId": "@kbn/rule-data-utils", - "scope": "common", - "docId": "kibKbnRuleDataUtilsPluginApi", - "section": "def-common.AlertConsumers", - "text": "AlertConsumers" - }, - "[]; data: ", - { - "pluginId": "data", - "scope": "public", - "docId": "kibDataPluginApi", - "section": "def-public.DataPublicPluginStart", - "text": "DataPublicPluginStart" - }, - "; runtimeMappings?: ", - "MappingRuntimeFields", - " | undefined; sort?: ", - "SortCombinations", - "[] | undefined; query?: Pick<", - "QueryDslQueryContainer", - ", \"ids\" | \"bool\"> | undefined; pageSize?: number | undefined; pageIndex?: number | undefined; }) => ", - "UseQueryResult", - "<", - "SearchAlertsResult", - ", unknown>" - ], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_search_alerts_query.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.useSearchAlertsQuery.$1", - "type": "Object", - "tags": [], - "label": "{ data, ...params }", - "description": [], - "signature": [ - "{ fields?: ", - "QueryDslFieldAndFormat", - "[] | undefined; featureIds: ", - { - "pluginId": "@kbn/rule-data-utils", - "scope": "common", - "docId": "kibKbnRuleDataUtilsPluginApi", - "section": "def-common.AlertConsumers", - "text": "AlertConsumers" - }, - "[]; data: ", - { - "pluginId": "data", - "scope": "public", - "docId": "kibDataPluginApi", - "section": "def-public.DataPublicPluginStart", - "text": "DataPublicPluginStart" - }, - "; runtimeMappings?: ", - "MappingRuntimeFields", - " | undefined; sort?: ", - "SortCombinations", - "[] | undefined; query?: Pick<", - "QueryDslQueryContainer", - ", \"ids\" | \"bool\"> | undefined; pageSize?: number | undefined; pageIndex?: number | undefined; }" - ], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_search_alerts_query.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/alerts-ui-shared", "id": "def-public.useUpdateRule", @@ -4504,39 +4366,18 @@ }, { "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.UseAlertDataViewProps", + "id": "def-public.UseAlertsDataViewParams", "type": "Interface", "tags": [], - "label": "UseAlertDataViewProps", + "label": "UseAlertsDataViewParams", "description": [], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alert_data_view.ts", + "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alerts_data_view.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.UseAlertDataViewProps.featureIds", - "type": "Array", - "tags": [], - "label": "featureIds", - "description": [], - "signature": [ - { - "pluginId": "@kbn/rule-data-utils", - "scope": "common", - "docId": "kibKbnRuleDataUtilsPluginApi", - "section": "def-common.AlertConsumers", - "text": "AlertConsumers" - }, - "[]" - ], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alert_data_view.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.UseAlertDataViewProps.http", + "id": "def-public.UseAlertsDataViewParams.http", "type": "Object", "tags": [], "label": "http", @@ -4550,13 +4391,13 @@ "text": "HttpSetup" } ], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alert_data_view.ts", + "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alerts_data_view.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.UseAlertDataViewProps.dataViewsService", + "id": "def-public.UseAlertsDataViewParams.dataViewsService", "type": "Object", "tags": [], "label": "dataViewsService", @@ -4876,13 +4717,13 @@ }, ">; }" ], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alert_data_view.ts", + "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alerts_data_view.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.UseAlertDataViewProps.toasts", + "id": "def-public.UseAlertsDataViewParams.toasts", "type": "Object", "tags": [], "label": "toasts", @@ -4896,7 +4737,30 @@ "text": "IToasts" } ], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alert_data_view.ts", + "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alerts_data_view.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/alerts-ui-shared", + "id": "def-public.UseAlertsDataViewParams.featureIds", + "type": "Array", + "tags": [], + "label": "featureIds", + "description": [ + "\nArray of feature ids used for authorization and area-based filtering\n\nSecurity data views must be requested in isolation (i.e. `['siem']`). If mixed with\nother feature ids, the resulting data view will be empty." + ], + "signature": [ + { + "pluginId": "@kbn/rule-data-utils", + "scope": "common", + "docId": "kibKbnRuleDataUtilsPluginApi", + "section": "def-common.AlertConsumers", + "text": "AlertConsumers" + }, + "[]" + ], + "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alerts_data_view.ts", "deprecated": false, "trackAdoption": false } @@ -4905,44 +4769,53 @@ }, { "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.UseAlertDataViewResult", + "id": "def-public.UseAlertsDataViewResult", "type": "Interface", "tags": [], - "label": "UseAlertDataViewResult", + "label": "UseAlertsDataViewResult", "description": [], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alert_data_view.ts", + "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alerts_data_view.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.UseAlertDataViewResult.dataViews", - "type": "Array", + "id": "def-public.UseAlertsDataViewResult.isLoading", + "type": "boolean", "tags": [], - "label": "dataViews", + "label": "isLoading", "description": [], - "signature": [ - { - "pluginId": "dataViews", - "scope": "common", - "docId": "kibDataViewsPluginApi", - "section": "def-common.DataView", - "text": "DataView" - }, - "[] | undefined" - ], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alert_data_view.ts", + "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alerts_data_view.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.UseAlertDataViewResult.loading", - "type": "boolean", + "id": "def-public.UseAlertsDataViewResult.dataView", + "type": "CompoundType", "tags": [], - "label": "loading", + "label": "dataView", "description": [], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alert_data_view.ts", + "signature": [ + "(Omit<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.DataViewBase", + "text": "DataViewBase" + }, + ", \"fields\"> & { fields: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.FieldSpec", + "text": "FieldSpec" + }, + "[]; }) | undefined" + ], + "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_alerts_data_view.ts", "deprecated": false, "trackAdoption": false } @@ -5081,90 +4954,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.UseFindAlertsQueryProps", - "type": "Interface", - "tags": [], - "label": "UseFindAlertsQueryProps", - "description": [], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_find_alerts_query.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.UseFindAlertsQueryProps.http", - "type": "Object", - "tags": [], - "label": "http", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-http-browser", - "scope": "public", - "docId": "kibKbnCoreHttpBrowserPluginApi", - "section": "def-public.HttpSetup", - "text": "HttpSetup" - } - ], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_find_alerts_query.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.UseFindAlertsQueryProps.toasts", - "type": "Object", - "tags": [], - "label": "toasts", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-notifications-browser", - "scope": "public", - "docId": "kibKbnCoreNotificationsBrowserPluginApi", - "section": "def-public.IToasts", - "text": "IToasts" - } - ], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_find_alerts_query.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.UseFindAlertsQueryProps.enabled", - "type": "CompoundType", - "tags": [], - "label": "enabled", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_find_alerts_query.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.UseFindAlertsQueryProps.params", - "type": "CompoundType", - "tags": [], - "label": "params", - "description": [], - "signature": [ - "{ trackTotalHits?: boolean | undefined; } & ", - "SearchRequest", - " & { feature_ids?: string[] | undefined; }" - ], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_find_alerts_query.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/alerts-ui-shared", "id": "def-public.UseGetAlertsGroupAggregationsQueryProps", @@ -6063,21 +5852,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.queryKeyPrefix", - "type": "Array", - "tags": [], - "label": "queryKeyPrefix", - "description": [], - "signature": [ - "string[]" - ], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_search_alerts_query.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "@kbn/alerts-ui-shared", "id": "def-public.ResolvedRule", @@ -6406,45 +6180,6 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/alerts-ui-shared", - "id": "def-public.UseSearchAlertsQueryParams", - "type": "Type", - "tags": [], - "label": "UseSearchAlertsQueryParams", - "description": [], - "signature": [ - "{ fields?: ", - "QueryDslFieldAndFormat", - "[] | undefined; featureIds: ", - { - "pluginId": "@kbn/rule-data-utils", - "scope": "common", - "docId": "kibKbnRuleDataUtilsPluginApi", - "section": "def-common.AlertConsumers", - "text": "AlertConsumers" - }, - "[]; data: ", - { - "pluginId": "data", - "scope": "public", - "docId": "kibDataPluginApi", - "section": "def-public.DataPublicPluginStart", - "text": "DataPublicPluginStart" - }, - "; runtimeMappings?: ", - "MappingRuntimeFields", - " | undefined; sort?: ", - "SortCombinations", - "[] | undefined; query?: Pick<", - "QueryDslQueryContainer", - ", \"ids\" | \"bool\"> | undefined; pageSize?: number | undefined; pageIndex?: number | undefined; }" - ], - "path": "packages/kbn-alerts-ui-shared/src/common/hooks/use_search_alerts_query.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false } ], "objects": [ diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index b4a8269c8789e..1d584fead24a1 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 310 | 0 | 293 | 9 | +| 299 | 0 | 282 | 8 | ## Client diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index 2b965557779f4..43d9a7a3e99bb 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index 4063b850862ff..9827e7b1d8a20 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 1d52ef9ba5a2e..63ad40f98dece 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2024-08-08 +date: 2024-08-12 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_data_view.mdx b/api_docs/kbn_apm_data_view.mdx index df6a8f62a8b24..4f42509e19135 100644 --- a/api_docs/kbn_apm_data_view.mdx +++ b/api_docs/kbn_apm_data_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-data-view title: "@kbn/apm-data-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-data-view plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-data-view'] --- import kbnApmDataViewObj from './kbn_apm_data_view.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 90519ac3dedf9..c37b8b086c0c2 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2024-08-08 +date: 2024-08-12 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 db9be7e877731..0a95edf2b12b1 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2024-08-08 +date: 2024-08-12 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_types.mdx b/api_docs/kbn_apm_types.mdx index 881a5e89da298..05036d60001a7 100644 --- a/api_docs/kbn_apm_types.mdx +++ b/api_docs/kbn_apm_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-types title: "@kbn/apm-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-types plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-types'] --- import kbnApmTypesObj from './kbn_apm_types.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 2445cfa995ac5..df14028e3fe95 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_avc_banner.mdx b/api_docs/kbn_avc_banner.mdx index ab4e15e990cea..42f27f8145eef 100644 --- a/api_docs/kbn_avc_banner.mdx +++ b/api_docs/kbn_avc_banner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-avc-banner title: "@kbn/avc-banner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/avc-banner plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/avc-banner'] --- import kbnAvcBannerObj from './kbn_avc_banner.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index cc63e676f4d8f..3de15f77a2574 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2024-08-08 +date: 2024-08-12 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 523fced6fc1f9..9dc88e62cfe18 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2024-08-08 +date: 2024-08-12 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 89be88ede0779..dcd7abcaa62dc 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2024-08-08 +date: 2024-08-12 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 e746686094b1a..ecef209a06d93 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2024-08-08 +date: 2024-08-12 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 3d00af448b4e4..8698f3137f035 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2024-08-08 +date: 2024-08-12 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 220ed6a7fcbbf..c4e28f77dd135 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2024-08-08 +date: 2024-08-12 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 4263a55d33903..b2a943efc3405 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2024-08-08 +date: 2024-08-12 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 4a1b086234b3a..6a9627b1d17f7 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2024-08-08 +date: 2024-08-12 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 761958a4bd072..68dc27b1d068f 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2024-08-08 +date: 2024-08-12 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 d50286e2ab526..f3be7508a9266 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2024-08-08 +date: 2024-08-12 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 8bcca2c4a7442..cac1b133dbbc1 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2024-08-08 +date: 2024-08-12 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 38157496f7473..d49977e9e09c7 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2024-08-08 +date: 2024-08-12 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 394ad9ee954a5..005db16c0d5bd 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index 9266414223fd2..c4bd87f3abb66 100644 --- a/api_docs/kbn_code_editor_mock.mdx +++ b/api_docs/kbn_code_editor_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mock title: "@kbn/code-editor-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mock plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index 9d6e263d5fd2f..85b4626f4aa89 100644 --- a/api_docs/kbn_code_owners.mdx +++ b/api_docs/kbn_code_owners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners title: "@kbn/code-owners" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-owners plugin -date: 2024-08-08 +date: 2024-08-12 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 ca7ea4c6fb050..307e7126dc60f 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2024-08-08 +date: 2024-08-12 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 5dd0d8148b42c..43b2cd32fa6a6 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.devdocs.json b/api_docs/kbn_config_mocks.devdocs.json index 922f5422a35c3..bebb572bec47a 100644 --- a/api_docs/kbn_config_mocks.devdocs.json +++ b/api_docs/kbn_config_mocks.devdocs.json @@ -352,7 +352,7 @@ "section": "def-server.ConfigPath", "text": "ConfigPath" }, - ", dynamicConfigPaths: string[]], unknown>; setDynamicConfigOverrides: jest.MockInstance], unknown>; } & ", + ", dynamicConfigPaths: string[]], unknown>; setDynamicConfigOverrides: jest.MockInstance, [newOverrides: Record], unknown>; } & ", "IConfigService" ], "path": "packages/kbn-config-mocks/src/config_service.mock.ts", diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index acc99c3af289f..f09687a2fccd1 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 f4b9f10c0400a..ab58ad5a9e374 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2024-08-08 +date: 2024-08-12 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 cd842ec41bab6..758879688bbb9 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2024-08-08 +date: 2024-08-12 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 1c0e2a901debd..3d235f8dc56af 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2024-08-08 +date: 2024-08-12 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 6e3b7c53092fc..c0385184834f1 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2024-08-08 +date: 2024-08-12 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 da4fe7f5b0e8b..a32c3a215b138 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2024-08-08 +date: 2024-08-12 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 ce781c5176dc7..b5a422a97e9c0 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2024-08-08 +date: 2024-08-12 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_user_profiles.mdx b/api_docs/kbn_content_management_user_profiles.mdx index 8de0a676f1e2c..cc351f6020cd0 100644 --- a/api_docs/kbn_content_management_user_profiles.mdx +++ b/api_docs/kbn_content_management_user_profiles.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-user-profiles title: "@kbn/content-management-user-profiles" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-user-profiles plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-user-profiles'] --- import kbnContentManagementUserProfilesObj from './kbn_content_management_user_profiles.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index 12f8c8a6de8ad..84d01dd68d1c8 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2024-08-08 +date: 2024-08-12 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.devdocs.json b/api_docs/kbn_core_analytics_browser.devdocs.json index e0fc0c465dcd2..502a1f60df079 100644 --- a/api_docs/kbn_core_analytics_browser.devdocs.json +++ b/api_docs/kbn_core_analytics_browser.devdocs.json @@ -1322,6 +1322,30 @@ "plugin": "@kbn/core-analytics-browser-internal", "path": "packages/core/analytics/core-analytics-browser-internal/src/track_clicks.test.ts" }, + { + "plugin": "@kbn/core-analytics-browser-internal", + "path": "packages/core/analytics/core-analytics-browser-internal/src/track_performance_measure_entries.test.ts" + }, + { + "plugin": "@kbn/core-analytics-browser-internal", + "path": "packages/core/analytics/core-analytics-browser-internal/src/track_performance_measure_entries.test.ts" + }, + { + "plugin": "@kbn/core-analytics-browser-internal", + "path": "packages/core/analytics/core-analytics-browser-internal/src/track_performance_measure_entries.test.ts" + }, + { + "plugin": "@kbn/core-analytics-browser-internal", + "path": "packages/core/analytics/core-analytics-browser-internal/src/track_performance_measure_entries.test.ts" + }, + { + "plugin": "@kbn/core-analytics-browser-internal", + "path": "packages/core/analytics/core-analytics-browser-internal/src/track_performance_measure_entries.test.ts" + }, + { + "plugin": "@kbn/core-analytics-browser-internal", + "path": "packages/core/analytics/core-analytics-browser-internal/src/track_performance_measure_entries.test.ts" + }, { "plugin": "@kbn/core-analytics-browser-internal", "path": "packages/core/analytics/core-analytics-browser-internal/src/track_viewport_size.test.ts" diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index a793479f7602d..f8e7201dee1f9 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 310f4ed18de24..601a0cbf8a9bc 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 aa06c61584405..97067d8baedb9 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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.devdocs.json b/api_docs/kbn_core_analytics_server.devdocs.json index bd7dbc0707b9e..1194fae25d085 100644 --- a/api_docs/kbn_core_analytics_server.devdocs.json +++ b/api_docs/kbn_core_analytics_server.devdocs.json @@ -1330,6 +1330,30 @@ "plugin": "@kbn/core-analytics-browser-internal", "path": "packages/core/analytics/core-analytics-browser-internal/src/track_clicks.test.ts" }, + { + "plugin": "@kbn/core-analytics-browser-internal", + "path": "packages/core/analytics/core-analytics-browser-internal/src/track_performance_measure_entries.test.ts" + }, + { + "plugin": "@kbn/core-analytics-browser-internal", + "path": "packages/core/analytics/core-analytics-browser-internal/src/track_performance_measure_entries.test.ts" + }, + { + "plugin": "@kbn/core-analytics-browser-internal", + "path": "packages/core/analytics/core-analytics-browser-internal/src/track_performance_measure_entries.test.ts" + }, + { + "plugin": "@kbn/core-analytics-browser-internal", + "path": "packages/core/analytics/core-analytics-browser-internal/src/track_performance_measure_entries.test.ts" + }, + { + "plugin": "@kbn/core-analytics-browser-internal", + "path": "packages/core/analytics/core-analytics-browser-internal/src/track_performance_measure_entries.test.ts" + }, + { + "plugin": "@kbn/core-analytics-browser-internal", + "path": "packages/core/analytics/core-analytics-browser-internal/src/track_performance_measure_entries.test.ts" + }, { "plugin": "@kbn/core-analytics-browser-internal", "path": "packages/core/analytics/core-analytics-browser-internal/src/track_viewport_size.test.ts" diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index f1ad240a44404..d4de886057840 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2024-08-08 +date: 2024-08-12 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 dc70e9744e58b..4de907c9e09e0 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 64703de1f77b4..e3032d287d1e1 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 9e1690e08ceb2..46798cdf3c407 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 530e0d6bd254b..ba4afee732ccb 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 f6deecb7a1562..b2858c445aed2 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 997e285a0a3a9..ff2c5bda17d9c 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2024-08-08 +date: 2024-08-12 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 8733a70ca8e65..d1e3efac15399 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 5825f4565f4df..b73bac0786684 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 76e14f23b305d..6819984d3b1e8 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 2e4489f3232f5..c9c5736320580 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 1032bf13903f8..60001988cb466 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2024-08-08 +date: 2024-08-12 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 855c432e05a5c..01fa97101c329 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 fc371a7da5fea..e8806faae57c2 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 367401d5465b5..abd57f9603eb7 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 307eaec8259c9..f5f5f1be6a41b 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2024-08-08 +date: 2024-08-12 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 e1ed7083d0943..2899313fe130e 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2024-08-08 +date: 2024-08-12 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 3e2738a996591..fd883291a2132 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 0e29e08274115..e2dbc018432a0 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 19552d4519ba0..30ad05a4e9e70 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 077253d0ed78d..7612bfc78bf1e 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 140eb76dca0ff..1524254001c6f 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 5076b07076fbf..8ff2c9a90e4cd 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 97b1c935abfd1..e22550841a8de 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 454677f757d6b..bfbd979d07637 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2024-08-08 +date: 2024-08-12 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 960da41c9edaf..494f6ca18df81 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2024-08-08 +date: 2024-08-12 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 2d04ef59419cd..14c433c683189 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 04f38bc565069..435f8de318c42 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 ae19158ad7399..2b42db41ad0c9 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 2e45bd54c7a03..014e24e94e3f3 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 2cc2ce8f6017c..d00ce77c7f129 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 37468710d9b88..c094cb3438e52 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2024-08-08 +date: 2024-08-12 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 9c73c93d5b8de..490a64e4df36a 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2024-08-08 +date: 2024-08-12 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 e525c802e4e7e..387b9bf63ef32 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 7166a1ce1194f..a4190cf2dd312 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 a490c217c0b4f..b08279e025b71 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 343d6a726a624..686df9c4946b5 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 0a05876ee80f2..daaa349e06ad9 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2024-08-08 +date: 2024-08-12 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 8b0e05a0337c4..7489fc9200e91 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 a0e3d62763e48..af600b5805abc 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 84cbfc3d7b0e4..f92c21b5f8180 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 23fe79aafb6da..9f59734a27f7f 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2024-08-08 +date: 2024-08-12 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 413cf6e4d52d8..8b8db8b8d91cb 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 4ba6e885e9836..9e5a464d732d2 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 dc9cdad4a1b7f..5cfa143d32c8b 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 31ecd53561f36..32a96539f15c1 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 8126074467e5d..34bc8c9c2ec3c 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 8c4c54654e9b3..ef31936db5f13 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 20c2e8fb07a88..bd8fc5a101f36 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 015a207ae6064..22fe182567882 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2024-08-08 +date: 2024-08-12 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 a1d355d5be45e..5c46d3c554e3e 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2024-08-08 +date: 2024-08-12 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 16ed3e04515cd..da3c5a9770626 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 4ddc1e87119e5..ce5b60b2e9444 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 f62fd6d08b0f2..d76acfe28ea7d 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 92ba2d829e8af..0347c62cb2852 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 6be9e99c051b0..6366d25319bbf 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 7c05687458387..ab41703f871e4 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 1a55dc775a017..78af590e6341d 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 65de75d044b27..2d67dee7cb31c 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2024-08-08 +date: 2024-08-12 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 ac2c8e40b071c..df9a82436725a 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 93821243288de..89ccdef79a5f5 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2024-08-08 +date: 2024-08-12 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 b8ba8351950ad..46d9e0b84c396 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2024-08-08 +date: 2024-08-12 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 06f5c5b024a92..19c3fa513b358 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 20ed5837f9c1d..4200290640757 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 9ab0ebb9d22b9..14cb758ead89d 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 c7d858aca4e71..dc0253790ec2a 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 5149ad7026690..cc5185b0ceb81 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -6272,6 +6272,10 @@ "plugin": "security", "path": "x-pack/plugins/security/server/routes/authentication/saml.ts" }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/authorization/roles/post.ts" + }, { "plugin": "security", "path": "x-pack/plugins/security/server/routes/deprecations/kibana_user_role.ts" @@ -8268,6 +8272,10 @@ "plugin": "security", "path": "x-pack/plugins/security/server/routes/role_mapping/post.test.ts" }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/authorization/roles/post.test.ts" + }, { "plugin": "security", "path": "x-pack/plugins/security/server/routes/authentication/common.test.ts" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index c692c75e55959..21f3bb901bbc6 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2024-08-08 +date: 2024-08-12 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 9c980bdc6af4d..9a4eb9dc33a47 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 b21cf13bf7240..f7909af9a4795 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 9aad28e33b6e5..dabf55fde826e 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 dd023b0bea6eb..f85837815257d 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 b6ddb752efb91..707cd156d4fc4 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2024-08-08 +date: 2024-08-12 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 13f0f8c223382..2f0e3c9745871 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 c3ccfff0036c5..0f3bd01371918 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 33d6ca12a78e5..92550ce2e0a46 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 b2897c26a6be8..1f7584261fa00 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 6388a809fdf99..adfb5ab90b917 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 160be2049ca12..3c23d4746d64d 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 b941d5a6a6261..932ec467fe282 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 9c125ded3f1a6..acfe01f8a7557 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2024-08-08 +date: 2024-08-12 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 41ce3404a2c4a..e416530d7b696 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 dc85930fd990c..8d800f6bbac92 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 b2eafcc6a7639..8f5a9a49cfb7f 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 5dfa3a42819a4..af41aa7559038 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2024-08-08 +date: 2024-08-12 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 46f8a1618a19d..c2b11f471fef7 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 71979ef44c51b..5460389b1e7d0 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 f87ac414f2c98..e178cbaa1e626 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 6291e09855117..882ed6f848090 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 fbda7292e618f..5d89b322df721 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2024-08-08 +date: 2024-08-12 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 89c3071317e64..9ebac1eb04ffc 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 ec3539518bda0..93380e0602c71 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 422f46abfca74..645f220be703e 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 65ec6baeabab3..e732f75fd7337 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2024-08-08 +date: 2024-08-12 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 98affc539016b..7e4dc96cc7823 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 65a1ca8d4ecb1..88e2a7fb4ee14 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 b7ff779a30c22..a08da2c740d7d 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 7dbf787d93ec6..ab81c5cb42026 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 9097db7f7a20f..9b6c543db88ff 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 7b887e36ec3c0..fd516c7117a71 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 3e51096b74109..459f33f442e64 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 3e94a07faf665..1226b68f959d8 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 df1748367db1b..4e681964ae875 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 77a30d20d5162..68d6ecfff7548 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 6252a6f9ea275..81f27aba7417b 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 81a2e655fe9ef..31080f4c27ce8 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2024-08-08 +date: 2024-08-12 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 78fb2c07ff576..382a328df52f0 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2024-08-08 +date: 2024-08-12 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 6a643acf11c62..45e39955d7aa3 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 88ae749184503..5a3ed19e6ed5e 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2024-08-08 +date: 2024-08-12 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 c2f1f37181b47..1bb565f751ef1 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 a8e11f83270ea..292836231e289 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 d0a03f4e04c06..9a0ae548fc7be 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 688fb9f3b4c28..3e6ba9697a690 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 1df480d7154d3..e7c73925f30b9 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 124eb03be209b..7a9ea17c278d2 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 5db99bcbef48c..e42b8d49a5a68 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2024-08-08 +date: 2024-08-12 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 5bb42322a06d5..2c98d7aaeca06 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 e983c424ebe70..42f8be8f40236 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 ee647d80037f3..f9df6295a260f 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 22623d9e42aa5..4e03077757855 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 8495eee8c675b..fc94e168b3ab4 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 d5d17c328feee..38fc0e600f1bb 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 dd5f4b6d825a9..3f407c5547c1f 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2024-08-08 +date: 2024-08-12 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 67d9aa4e36f50..b90444ec407d4 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 66fbdfff3e06e..87141463e752d 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 578f863774fd7..0c3b4dcc42756 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 01c86eb82bc1d..fdbe2bbfc655a 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 6af3fc84b6fbc..b6774178cd0c2 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2024-08-08 +date: 2024-08-12 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 049d062806580..5b64b4a42ffd8 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 6d89a1e04b0ad..b1b69fea36455 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 23680a2a1e059..519fd3e1548ca 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2024-08-08 +date: 2024-08-12 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_security_browser.mdx b/api_docs/kbn_core_security_browser.mdx index 6032611201c6e..837c12032788e 100644 --- a/api_docs/kbn_core_security_browser.mdx +++ b/api_docs/kbn_core_security_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser title: "@kbn/core-security-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser'] --- import kbnCoreSecurityBrowserObj from './kbn_core_security_browser.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_internal.mdx b/api_docs/kbn_core_security_browser_internal.mdx index d614db056c796..1e44be330b342 100644 --- a/api_docs/kbn_core_security_browser_internal.mdx +++ b/api_docs/kbn_core_security_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-internal title: "@kbn/core-security-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-internal plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-internal'] --- import kbnCoreSecurityBrowserInternalObj from './kbn_core_security_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_mocks.mdx b/api_docs/kbn_core_security_browser_mocks.mdx index c53ac907b981a..8bd0f75be9426 100644 --- a/api_docs/kbn_core_security_browser_mocks.mdx +++ b/api_docs/kbn_core_security_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-mocks title: "@kbn/core-security-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-mocks'] --- import kbnCoreSecurityBrowserMocksObj from './kbn_core_security_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_security_common.mdx b/api_docs/kbn_core_security_common.mdx index 6f05f909f33a2..9f95066d6ccdc 100644 --- a/api_docs/kbn_core_security_common.mdx +++ b/api_docs/kbn_core_security_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-common title: "@kbn/core-security-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-common plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-common'] --- import kbnCoreSecurityCommonObj from './kbn_core_security_common.devdocs.json'; diff --git a/api_docs/kbn_core_security_server.mdx b/api_docs/kbn_core_security_server.mdx index 2ee3d047e1b18..d4cf19a1d3cf4 100644 --- a/api_docs/kbn_core_security_server.mdx +++ b/api_docs/kbn_core_security_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server title: "@kbn/core-security-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server'] --- import kbnCoreSecurityServerObj from './kbn_core_security_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_internal.mdx b/api_docs/kbn_core_security_server_internal.mdx index b12dbb37f254e..b56f03ae38958 100644 --- a/api_docs/kbn_core_security_server_internal.mdx +++ b/api_docs/kbn_core_security_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-internal title: "@kbn/core-security-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-internal'] --- import kbnCoreSecurityServerInternalObj from './kbn_core_security_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_mocks.mdx b/api_docs/kbn_core_security_server_mocks.mdx index c4d5ab6a546ad..18137e9a1722e 100644 --- a/api_docs/kbn_core_security_server_mocks.mdx +++ b/api_docs/kbn_core_security_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-mocks title: "@kbn/core-security-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-mocks'] --- import kbnCoreSecurityServerMocksObj from './kbn_core_security_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index b544592c39ebe..bec498fe6462a 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2024-08-08 +date: 2024-08-12 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 9459de56dc967..5bc8a2e17d630 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 21afb62ac543f..274dc2618893a 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2024-08-08 +date: 2024-08-12 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 e9a49f8b343f0..ddf250463d140 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 3f61689026b71..f9633bbe372f6 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 dd8798932b574..6c488038f7120 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2024-08-08 +date: 2024-08-12 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 1d5fcf92cb3d3..fb672b7432a8d 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 43158ffaa622b..b05b5a397de4a 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2024-08-08 +date: 2024-08-12 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 d4f130b1148ea..e794a276aeb12 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2024-08-08 +date: 2024-08-12 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 2dca355e221d3..af83842d5f64c 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2024-08-08 +date: 2024-08-12 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 f01565ff5ecdc..4e44d559fb2ac 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 f692d9fd2cb47..e7ce9c2631ce7 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 682e69edf6a2d..9ce26dc434533 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 3e30377fa8757..1ccf840a147c3 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 0fdc0b3be0fcc..c065366d3ff94 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 97dccbbfe4105..03e6de6d226d8 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 c11fcfb323cda..004417e795bbc 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2024-08-08 +date: 2024-08-12 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 c3d1b9143c822..bdbdfb5f41c18 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2024-08-08 +date: 2024-08-12 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 2efe024d7317f..31b128008d374 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 37572e60a8970..34cb8287a96e1 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 cf037dc1afcbc..1ca6c0d2af7e3 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2024-08-08 +date: 2024-08-12 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 1cd2306ff0716..ffe51df1768bb 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 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 9d737f68a867a..ecfd482c79876 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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_profile_browser.mdx b/api_docs/kbn_core_user_profile_browser.mdx index 2e21026c9326f..5841c4cf69c49 100644 --- a/api_docs/kbn_core_user_profile_browser.mdx +++ b/api_docs/kbn_core_user_profile_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser title: "@kbn/core-user-profile-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser'] --- import kbnCoreUserProfileBrowserObj from './kbn_core_user_profile_browser.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_internal.mdx b/api_docs/kbn_core_user_profile_browser_internal.mdx index 79bb962c37d9c..93357f0872c00 100644 --- a/api_docs/kbn_core_user_profile_browser_internal.mdx +++ b/api_docs/kbn_core_user_profile_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-internal title: "@kbn/core-user-profile-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-internal plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-internal'] --- import kbnCoreUserProfileBrowserInternalObj from './kbn_core_user_profile_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_mocks.mdx b/api_docs/kbn_core_user_profile_browser_mocks.mdx index 3b3c619b194fb..c4fe0be939dd1 100644 --- a/api_docs/kbn_core_user_profile_browser_mocks.mdx +++ b/api_docs/kbn_core_user_profile_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-mocks title: "@kbn/core-user-profile-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-mocks plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-mocks'] --- import kbnCoreUserProfileBrowserMocksObj from './kbn_core_user_profile_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_common.mdx b/api_docs/kbn_core_user_profile_common.mdx index ec3a90c775101..cb25813de2de2 100644 --- a/api_docs/kbn_core_user_profile_common.mdx +++ b/api_docs/kbn_core_user_profile_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-common title: "@kbn/core-user-profile-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-common plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-common'] --- import kbnCoreUserProfileCommonObj from './kbn_core_user_profile_common.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server.mdx b/api_docs/kbn_core_user_profile_server.mdx index db4a0516bdfa6..002034cffd15e 100644 --- a/api_docs/kbn_core_user_profile_server.mdx +++ b/api_docs/kbn_core_user_profile_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server title: "@kbn/core-user-profile-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server'] --- import kbnCoreUserProfileServerObj from './kbn_core_user_profile_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_internal.mdx b/api_docs/kbn_core_user_profile_server_internal.mdx index 14f000d7c8fab..a71dc8502b04c 100644 --- a/api_docs/kbn_core_user_profile_server_internal.mdx +++ b/api_docs/kbn_core_user_profile_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-internal title: "@kbn/core-user-profile-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-internal plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-internal'] --- import kbnCoreUserProfileServerInternalObj from './kbn_core_user_profile_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_mocks.mdx b/api_docs/kbn_core_user_profile_server_mocks.mdx index c0c1f141ffc36..9a50305b08901 100644 --- a/api_docs/kbn_core_user_profile_server_mocks.mdx +++ b/api_docs/kbn_core_user_profile_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-mocks title: "@kbn/core-user-profile-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-mocks'] --- import kbnCoreUserProfileServerMocksObj from './kbn_core_user_profile_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 f8b8d1631b69a..152cf89d8c983 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2024-08-08 +date: 2024-08-12 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_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 5cc7ea0d2d601..8fb8d2e62138e 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 c96b4764c262c..1598b7de796f3 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2024-08-08 +date: 2024-08-12 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 836c2475794f6..b3afdaeb5845f 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 9ae039d714586..7d779d13692d3 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2024-08-08 +date: 2024-08-12 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 8226142b1cb8c..8269e3cfe0635 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2024-08-08 +date: 2024-08-12 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 69eca48ec2380..01699825414b5 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx index 509ca548d4926..00382a2c4b193 100644 --- a/api_docs/kbn_data_forge.mdx +++ b/api_docs/kbn_data_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-forge title: "@kbn/data-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-forge plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge'] --- import kbnDataForgeObj from './kbn_data_forge.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index 555d0dd879966..85ee79091aab5 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx index d2886f7060f10..d31c2d3632902 100644 --- a/api_docs/kbn_data_stream_adapter.mdx +++ b/api_docs/kbn_data_stream_adapter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-stream-adapter title: "@kbn/data-stream-adapter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-stream-adapter plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter'] --- import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json'; diff --git a/api_docs/kbn_data_view_utils.mdx b/api_docs/kbn_data_view_utils.mdx index 16c548f5329d0..00e06a609cfdf 100644 --- a/api_docs/kbn_data_view_utils.mdx +++ b/api_docs/kbn_data_view_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-view-utils title: "@kbn/data-view-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-view-utils plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-view-utils'] --- import kbnDataViewUtilsObj from './kbn_data_view_utils.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index bcb6431d30aa1..0c0c754c270cf 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2024-08-08 +date: 2024-08-12 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 8bec8b7018321..e0f57c4c2cda5 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2024-08-08 +date: 2024-08-12 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 8fc14399c24d8..e71198d238f66 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_fleet.mdx b/api_docs/kbn_deeplinks_fleet.mdx index 0db6a0b7844ee..0b51dea6a84b9 100644 --- a/api_docs/kbn_deeplinks_fleet.mdx +++ b/api_docs/kbn_deeplinks_fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-fleet title: "@kbn/deeplinks-fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-fleet plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-fleet'] --- import kbnDeeplinksFleetObj from './kbn_deeplinks_fleet.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index 704827f5339be..7a249f3a4ebff 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2024-08-08 +date: 2024-08-12 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 d800f2d397e1b..74422525d97c8 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2024-08-08 +date: 2024-08-12 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 f5cdb192e922a..5154ce9cbe022 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2024-08-08 +date: 2024-08-12 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 45f4196169034..3b540c0d038a8 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx index 22f0092e077fa..7a970ab816c93 100644 --- a/api_docs/kbn_deeplinks_security.mdx +++ b/api_docs/kbn_deeplinks_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-security title: "@kbn/deeplinks-security" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-security plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-security'] --- import kbnDeeplinksSecurityObj from './kbn_deeplinks_security.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_shared.mdx b/api_docs/kbn_deeplinks_shared.mdx index be50b55a13a8f..2dafa43580e1a 100644 --- a/api_docs/kbn_deeplinks_shared.mdx +++ b/api_docs/kbn_deeplinks_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-shared title: "@kbn/deeplinks-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-shared plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-shared'] --- import kbnDeeplinksSharedObj from './kbn_deeplinks_shared.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index 6356d7f131f8d..135210ce4690f 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2024-08-08 +date: 2024-08-12 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 01453ecb5681f..2fcf7fff7348a 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2024-08-08 +date: 2024-08-12 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 1d1ca54ef4758..5111a620e9e8c 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2024-08-08 +date: 2024-08-12 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 47cfbb922ed05..0ccd754455279 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2024-08-08 +date: 2024-08-12 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 0ba93c08205a6..040a1d23f8b58 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2024-08-08 +date: 2024-08-12 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 501f3ff24603d..0fb79ffc336e7 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2024-08-08 +date: 2024-08-12 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 9fd07049bee70..f5d4248ea2400 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2024-08-08 +date: 2024-08-12 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 e3e2eaf529ede..29765396edb02 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.devdocs.json b/api_docs/kbn_discover_utils.devdocs.json index de9e46c1279bd..fff4f4ef79982 100644 --- a/api_docs/kbn_discover_utils.devdocs.json +++ b/api_docs/kbn_discover_utils.devdocs.json @@ -2516,6 +2516,21 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.TRUNCATE_MAX_HEIGHT_DEFAULT_VALUE", + "type": "number", + "tags": [], + "label": "TRUNCATE_MAX_HEIGHT_DEFAULT_VALUE", + "description": [], + "signature": [ + "115" + ], + "path": "packages/kbn-discover-utils/src/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false } ], "objects": [] diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index d7ba299ff0796..cf6c05a4f0d6d 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 130 | 0 | 104 | 1 | +| 131 | 0 | 105 | 1 | ## Common diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index ca931b5a2b4e9..4323f37024bb0 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2024-08-08 +date: 2024-08-12 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 efe5bb9a757d9..f8cec2405c810 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 2390fa9fbdac7..e23e8b6d4fb0f 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2024-08-08 +date: 2024-08-12 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 09a0e076adfdc..6522b09157b53 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index 596c3b16fc82a..6f113dba47d11 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2024-08-08 +date: 2024-08-12 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 53b45fc342d46..d3d067bac6a9b 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 0fc3d37b2675e..e06dbbcd4d2e7 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2024-08-08 +date: 2024-08-12 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 5e90b15ce4a17..501a8204e27a1 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_entities_schema.devdocs.json b/api_docs/kbn_entities_schema.devdocs.json index 5a095101476e4..2d1ad602d26cc 100644 --- a/api_docs/kbn_entities_schema.devdocs.json +++ b/api_docs/kbn_entities_schema.devdocs.json @@ -51,6 +51,72 @@ ], "returnComment": [], "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/entities-schema", + "id": "def-common.entitiesAliasPattern", + "type": "Function", + "tags": [], + "label": "entitiesAliasPattern", + "description": [], + "signature": [ + "({\n type,\n dataset,\n}: AliasPatternOptions) => `entities-${string}-${TDataset}`" + ], + "path": "x-pack/packages/kbn-entities-schema/src/schema/patterns.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/entities-schema", + "id": "def-common.entitiesAliasPattern.$1", + "type": "Object", + "tags": [], + "label": "{\n type,\n dataset,\n}", + "description": [], + "signature": [ + "AliasPatternOptions" + ], + "path": "x-pack/packages/kbn-entities-schema/src/schema/patterns.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/entities-schema", + "id": "def-common.entitiesIndexPattern", + "type": "Function", + "tags": [], + "label": "entitiesIndexPattern", + "description": [], + "signature": [ + "({\n schemaVersion,\n dataset,\n definitionId,\n}: IndexPatternOptions) => `.entities.v${number}.${TDataset}.${string}`" + ], + "path": "x-pack/packages/kbn-entities-schema/src/schema/patterns.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/entities-schema", + "id": "def-common.entitiesIndexPattern.$1", + "type": "Object", + "tags": [], + "label": "{\n schemaVersion,\n dataset,\n definitionId,\n}", + "description": [], + "signature": [ + "IndexPatternOptions" + ], + "path": "x-pack/packages/kbn-entities-schema/src/schema/patterns.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false } ], "interfaces": [], @@ -69,6 +135,66 @@ } ], "misc": [ + { + "parentPluginId": "@kbn/entities-schema", + "id": "def-common.ENTITY_BASE_PREFIX", + "type": "string", + "tags": [], + "label": "ENTITY_BASE_PREFIX", + "description": [], + "signature": [ + "\"entities\"" + ], + "path": "x-pack/packages/kbn-entities-schema/src/schema/patterns.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/entities-schema", + "id": "def-common.ENTITY_HISTORY", + "type": "string", + "tags": [], + "label": "ENTITY_HISTORY", + "description": [], + "signature": [ + "\"history\"" + ], + "path": "x-pack/packages/kbn-entities-schema/src/schema/patterns.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/entities-schema", + "id": "def-common.ENTITY_LATEST", + "type": "string", + "tags": [], + "label": "ENTITY_LATEST", + "description": [], + "signature": [ + "\"latest\"" + ], + "path": "x-pack/packages/kbn-entities-schema/src/schema/patterns.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/entities-schema", + "id": "def-common.ENTITY_SCHEMA_VERSION_V1", + "type": "string", + "tags": [], + "label": "ENTITY_SCHEMA_VERSION_V1", + "description": [], + "signature": [ + "\"v1\"" + ], + "path": "x-pack/packages/kbn-entities-schema/src/schema/patterns.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/entities-schema", "id": "def-common.EntityDefinition", diff --git a/api_docs/kbn_entities_schema.mdx b/api_docs/kbn_entities_schema.mdx index 3a5daa5b0ba90..7be852e159ef5 100644 --- a/api_docs/kbn_entities_schema.mdx +++ b/api_docs/kbn_entities_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-entities-schema title: "@kbn/entities-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/entities-schema plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/entities-schema'] --- import kbnEntitiesSchemaObj from './kbn_entities_schema.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-entities](https://github.com/orgs/elastic/teams/obs-entiti | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 26 | 0 | 26 | 0 | +| 34 | 0 | 34 | 0 | ## Common diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 9a11e984c1167..46cb01353c296 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2024-08-08 +date: 2024-08-12 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 15d5e76d6d7b0..a9b654e026a6b 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2024-08-08 +date: 2024-08-12 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 b9e234b52a368..f59675a8a5abe 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2024-08-08 +date: 2024-08-12 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 a2cd69e078253..1ef6a10fd7cb2 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2024-08-08 +date: 2024-08-12 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 a47e034f3145c..1cffb595596a9 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2024-08-08 +date: 2024-08-12 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 43b7c04d55360..d92a0a7c66b89 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_esql_ast.mdx b/api_docs/kbn_esql_ast.mdx index 95b954bf9d7c9..f43c5381d6206 100644 --- a/api_docs/kbn_esql_ast.mdx +++ b/api_docs/kbn_esql_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-ast title: "@kbn/esql-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-ast plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index 19ea1eacd5abb..4031a32982330 100644 --- a/api_docs/kbn_esql_utils.mdx +++ b/api_docs/kbn_esql_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-utils title: "@kbn/esql-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-utils plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; diff --git a/api_docs/kbn_esql_validation_autocomplete.devdocs.json b/api_docs/kbn_esql_validation_autocomplete.devdocs.json index b5149b448e605..9c4af05a18969 100644 --- a/api_docs/kbn_esql_validation_autocomplete.devdocs.json +++ b/api_docs/kbn_esql_validation_autocomplete.devdocs.json @@ -3188,10 +3188,13 @@ { "parentPluginId": "@kbn/esql-validation-autocomplete", "id": "def-common.ESQLRealField.type", - "type": "string", + "type": "CompoundType", "tags": [], "label": "type", "description": [], + "signature": [ + "\"boolean\" | \"geo_point\" | \"geo_shape\" | \"ip\" | \"keyword\" | \"text\" | \"date\" | \"version\" | \"integer\" | \"long\" | \"double\" | \"unsigned_long\" | \"cartesian_point\" | \"cartesian_shape\" | \"counter_integer\" | \"counter_long\" | \"counter_double\" | \"unsupported\"" + ], "path": "packages/kbn-esql-validation-autocomplete/src/validation/types.ts", "deprecated": false, "trackAdoption": false @@ -3204,7 +3207,7 @@ "label": "metadata", "description": [], "signature": [ - "{ description?: string | undefined; type?: string | undefined; } | undefined" + "{ description?: string | undefined; } | undefined" ], "path": "packages/kbn-esql-validation-autocomplete/src/validation/types.ts", "deprecated": false, diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index 4973f2c8fedf4..2bf86d64d7873 100644 --- a/api_docs/kbn_esql_validation_autocomplete.mdx +++ b/api_docs/kbn_esql_validation_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-validation-autocomplete title: "@kbn/esql-validation-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-validation-autocomplete plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-validation-autocomplete'] --- import kbnEsqlValidationAutocompleteObj from './kbn_esql_validation_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index cdc5f632b8708..4711978096b21 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2024-08-08 +date: 2024-08-12 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 ca49285f48c75..d53d7dd4278ef 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2024-08-08 +date: 2024-08-12 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 59e53d57c40ca..a81a7669c9f18 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2024-08-08 +date: 2024-08-12 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 e29614df62c0a..845a1ab14381f 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2024-08-08 +date: 2024-08-12 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 bf1a06302b4df..024492c10f8c6 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 7842fe4085939..29b4e67731077 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2024-08-08 +date: 2024-08-12 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_formatters.mdx b/api_docs/kbn_formatters.mdx index 428a819d7c550..0d9df0af48a81 100644 --- a/api_docs/kbn_formatters.mdx +++ b/api_docs/kbn_formatters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-formatters title: "@kbn/formatters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/formatters plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/formatters'] --- import kbnFormattersObj from './kbn_formatters.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index 18dab808bd1d4..02a261fc0c57d 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2024-08-08 +date: 2024-08-12 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 2a318b44c872a..41b7695b45bd8 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.mdx +++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services title: "@kbn/ftr-common-functional-ui-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-ui-services plugin -date: 2024-08-08 +date: 2024-08-12 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 b8901fe9608fc..1e77ece4a79e3 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2024-08-08 +date: 2024-08-12 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 cf003b43a8e91..ff7eb21033cf6 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2024-08-08 +date: 2024-08-12 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 8568819720032..23130c9138e00 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_grouping.mdx b/api_docs/kbn_grouping.mdx index 4443baabaae68..700d0e651cd0d 100644 --- a/api_docs/kbn_grouping.mdx +++ b/api_docs/kbn_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grouping title: "@kbn/grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grouping plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grouping'] --- import kbnGroupingObj from './kbn_grouping.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 3f28a58ae2f49..612b00e4b6693 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2024-08-08 +date: 2024-08-12 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 6504d460950f9..98ffef188691b 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2024-08-08 +date: 2024-08-12 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 11725e7233c0e..b6a7c063e1a85 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 b15b4e12b47e0..f1cf66772b2ad 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2024-08-08 +date: 2024-08-12 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 ff731def1a283..a0baa412c6a8a 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2024-08-08 +date: 2024-08-12 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 bf543fa26ee53..03846a82ad11a 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2024-08-08 +date: 2024-08-12 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 c9d6d8ecb9275..db9bd01676ab2 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2024-08-08 +date: 2024-08-12 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 c589731ba6615..c311e57e4b050 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2024-08-08 +date: 2024-08-12 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 ac1d8fa676612..66b77b2f6da6f 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_management.mdx b/api_docs/kbn_index_management.mdx index 33d4d14500c70..1670b929b95c5 100644 --- a/api_docs/kbn_index_management.mdx +++ b/api_docs/kbn_index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management title: "@kbn/index-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-management plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management'] --- import kbnIndexManagementObj from './kbn_index_management.devdocs.json'; diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index ddebb4164fcb7..68ab12bf13409 100644 --- a/api_docs/kbn_inference_integration_flyout.mdx +++ b/api_docs/kbn_inference_integration_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-inference_integration_flyout title: "@kbn/inference_integration_flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/inference_integration_flyout plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference_integration_flyout'] --- import kbnInferenceIntegrationFlyoutObj from './kbn_inference_integration_flyout.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index 6cbd9a39dc92a..f05a988c024f7 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2024-08-08 +date: 2024-08-12 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 67048dc4fbf1d..954f28050d9f5 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2024-08-08 +date: 2024-08-12 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 fbea40e454929..be37d982823d5 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_ipynb.mdx b/api_docs/kbn_ipynb.mdx index f62adb8bf4c67..89ff0098ade92 100644 --- a/api_docs/kbn_ipynb.mdx +++ b/api_docs/kbn_ipynb.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ipynb title: "@kbn/ipynb" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ipynb plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 54f223c041ffb..8eac6b735dcd9 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2024-08-08 +date: 2024-08-12 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 553cb25e9ddba..561cd2a5ce906 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2024-08-08 +date: 2024-08-12 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 8938147d160ad..df18c52551437 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_json_schemas.mdx b/api_docs/kbn_json_schemas.mdx index 12123e4afc91b..5cb56798b2876 100644 --- a/api_docs/kbn_json_schemas.mdx +++ b/api_docs/kbn_json_schemas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-schemas title: "@kbn/json-schemas" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-schemas plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-schemas'] --- import kbnJsonSchemasObj from './kbn_json_schemas.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 848e59fdc8ef6..71f911e4dc2d5 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2024-08-08 +date: 2024-08-12 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 907d946361115..98d36f459847f 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2024-08-08 +date: 2024-08-12 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 ff83eaf17488b..9801d0772fcbf 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx index 43c92ee278fd1..36d5c10f572f7 100644 --- a/api_docs/kbn_lens_formula_docs.mdx +++ b/api_docs/kbn_lens_formula_docs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-formula-docs title: "@kbn/lens-formula-docs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-formula-docs plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] --- import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 91bcedd4e2543..c9837e85f7592 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2024-08-08 +date: 2024-08-12 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 268d61cfecc92..def8f6ce008e4 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx index 6f6bf2daf3c5f..a088ae6148ca2 100644 --- a/api_docs/kbn_managed_content_badge.mdx +++ b/api_docs/kbn_managed_content_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-content-badge title: "@kbn/managed-content-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-content-badge plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge'] --- import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index 3e756296f06f2..53b5e7ef339a2 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2024-08-08 +date: 2024-08-12 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 b4d578c005a8a..8a7bc5708b1b3 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2024-08-08 +date: 2024-08-12 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 af133c80ff191..85389a9533d68 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2024-08-08 +date: 2024-08-12 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 f373d99d76e40..12c9401741b5b 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2024-08-08 +date: 2024-08-12 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 2f19b0d35478d..0f4a541c0a034 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2024-08-08 +date: 2024-08-12 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 20a4676243868..5324d30cff9f6 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2024-08-08 +date: 2024-08-12 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 4ce6dfb7bd4bf..b8ced65222e17 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2024-08-08 +date: 2024-08-12 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 75118f9d8ac3d..8d4534a4cd9f0 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2024-08-08 +date: 2024-08-12 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.devdocs.json b/api_docs/kbn_management_settings_ids.devdocs.json index 516e6a7f6bade..f5662d441bdc0 100644 --- a/api_docs/kbn_management_settings_ids.devdocs.json +++ b/api_docs/kbn_management_settings_ids.devdocs.json @@ -1072,6 +1072,66 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_AI_ASSISTANT_LOGS_INDEX_PATTERN_ID", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_AI_ASSISTANT_LOGS_INDEX_PATTERN_ID", + "description": [], + "signature": [ + "\"observability:aiAssistantLogsIndexPattern\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_AI_ASSISTANT_RESPONSE_LANGUAGE", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_AI_ASSISTANT_RESPONSE_LANGUAGE", + "description": [], + "signature": [ + "\"observability:aiAssistantResponseLanguage\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_AI_ASSISTANT_SEARCH_CONNECTOR_INDEX_PATTERN", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_AI_ASSISTANT_SEARCH_CONNECTOR_INDEX_PATTERN", + "description": [], + "signature": [ + "\"observability:aiAssistantSearchConnectorIndexPattern\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_AI_ASSISTANT_SIMULATED_FUNCTION_CALLING", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_AI_ASSISTANT_SIMULATED_FUNCTION_CALLING", + "description": [], + "signature": [ + "\"observability:aiAssistantSimulatedFunctionCalling\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/management-settings-ids", "id": "def-common.OBSERVABILITY_APM_AGENT_EXPLORER_VIEW_ID", diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index 5c96ac7531ab6..7c380de66edf8 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 139 | 0 | 137 | 0 | +| 143 | 0 | 141 | 0 | ## Common diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 81ae22db61c22..bda709b6fe6da 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2024-08-08 +date: 2024-08-12 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 b8f25f9b2ed7f..6d3b8bfbae67b 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2024-08-08 +date: 2024-08-12 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 c8442abfd00b0..5be657457d845 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2024-08-08 +date: 2024-08-12 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 1ce0dcd3205a6..33e03f2e0e3cc 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2024-08-08 +date: 2024-08-12 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 463a833ec6d2d..b1df12648b605 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2024-08-08 +date: 2024-08-12 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 0950729a9aa3f..b2ed75bb78f06 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 637b176474ec4..e3966e47cd7df 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 1c2d02400c863..4627700e851fe 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2024-08-08 +date: 2024-08-12 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_cancellable_search.mdx b/api_docs/kbn_ml_cancellable_search.mdx index 523384303a5ae..4e3771ae39641 100644 --- a/api_docs/kbn_ml_cancellable_search.mdx +++ b/api_docs/kbn_ml_cancellable_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-cancellable-search title: "@kbn/ml-cancellable-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-cancellable-search plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-cancellable-search'] --- import kbnMlCancellableSearchObj from './kbn_ml_cancellable_search.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index ce4aa52996da9..f79e8b346ab83 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2024-08-08 +date: 2024-08-12 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 6d0f44ab29b27..0be15e3454d1b 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2024-08-08 +date: 2024-08-12 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 da5bdb08cff11..9a7786f60d98e 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 89f81e0315db9..36379779c334b 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2024-08-08 +date: 2024-08-12 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 a8155cb084d60..e69b108287721 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2024-08-08 +date: 2024-08-12 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 352e21c7b3308..a2c16bb31f7ac 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 8730f6d8bd0ec..0908cdb5f0bb2 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 6b3cfbf62a844..b29c025d5337b 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2024-08-08 +date: 2024-08-12 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 afdd04438d24d..2f313cda943e8 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2024-08-08 +date: 2024-08-12 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 e03f335494091..95de59ab9a702 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2024-08-08 +date: 2024-08-12 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 c4a835cba75bc..8f18372615dc5 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2024-08-08 +date: 2024-08-12 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 7c755588467c3..4225980bc0ed8 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2024-08-08 +date: 2024-08-12 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 6847177f53739..ba52430a20fb5 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2024-08-08 +date: 2024-08-12 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 594709c18db88..273fcdc268594 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 9d9434b02d037..43fe31c6df7ae 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 d91a1ed9948de..f8f893c3d254c 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 c7bb929f42d47..22d77ced4e43c 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 f0eae0d2c5d73..41dcb4286e778 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 9810f2d71e567..7851334783e44 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2024-08-08 +date: 2024-08-12 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_time_buckets.mdx b/api_docs/kbn_ml_time_buckets.mdx index 1e8b845e370d6..934db7b6f6156 100644 --- a/api_docs/kbn_ml_time_buckets.mdx +++ b/api_docs/kbn_ml_time_buckets.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-time-buckets title: "@kbn/ml-time-buckets" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-time-buckets plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-time-buckets'] --- import kbnMlTimeBucketsObj from './kbn_ml_time_buckets.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 8993e30a00a39..fcda87d9bf0bd 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 0422b465dfce8..2c7d931ac857e 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2024-08-08 +date: 2024-08-12 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 e5aa4ab7bc992..b9b61ee9784a2 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index bab15c846e2c7..aa29bdf4504d8 100644 --- a/api_docs/kbn_mock_idp_utils.mdx +++ b/api_docs/kbn_mock_idp_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mock-idp-utils title: "@kbn/mock-idp-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mock-idp-utils plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils'] --- import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index c4089d57918e8..369d177bd61ea 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2024-08-08 +date: 2024-08-12 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 5fe646445461e..9c56b3b14d73a 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2024-08-08 +date: 2024-08-12 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 f852885f817a8..5c7644c937bbe 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2024-08-08 +date: 2024-08-12 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_rule_utils.mdx b/api_docs/kbn_observability_alerting_rule_utils.mdx index 5750ad2c951e6..b29c10aa12dbc 100644 --- a/api_docs/kbn_observability_alerting_rule_utils.mdx +++ b/api_docs/kbn_observability_alerting_rule_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-rule-utils title: "@kbn/observability-alerting-rule-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-rule-utils plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-rule-utils'] --- import kbnObservabilityAlertingRuleUtilsObj from './kbn_observability_alerting_rule_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index e3b424459b05a..fe19a3f2253e3 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2024-08-08 +date: 2024-08-12 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 341b03cf068e2..4642a9d0d6d89 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2024-08-08 +date: 2024-08-12 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 dbcb018644602..95941bca01ded 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2024-08-08 +date: 2024-08-12 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 0afb431ad62fc..3d098bf14dec8 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2024-08-08 +date: 2024-08-12 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 ee9922dcf7947..a21f54efc6547 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2024-08-08 +date: 2024-08-12 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 f5a7ad7b1654c..5ea2d0eaf103c 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2024-08-08 +date: 2024-08-12 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 ccd944982955d..54d9b50b58e4a 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2024-08-08 +date: 2024-08-12 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 919b94ce3a1a8..ef913cfce4e1a 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2024-08-08 +date: 2024-08-12 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 9ae83db144035..2762897d06c1d 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_check.mdx b/api_docs/kbn_plugin_check.mdx index a9a6381b459c7..e72c28bfb2679 100644 --- a/api_docs/kbn_plugin_check.mdx +++ b/api_docs/kbn_plugin_check.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-check title: "@kbn/plugin-check" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-check plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-check'] --- import kbnPluginCheckObj from './kbn_plugin_check.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 6088a1b02046f..803925ad3f52f 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2024-08-08 +date: 2024-08-12 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 be17ef12a7939..2ec9f51859cf7 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index e38e8e7fd049f..1b0ce40a12d4b 100644 --- a/api_docs/kbn_presentation_containers.mdx +++ b/api_docs/kbn_presentation_containers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-containers title: "@kbn/presentation-containers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-containers plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index ee999fd7e22c2..efd9c7415783b 100644 --- a/api_docs/kbn_presentation_publishing.mdx +++ b/api_docs/kbn_presentation_publishing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-publishing title: "@kbn/presentation-publishing" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-publishing plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 771c8587cb286..a8b07f4737936 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 e775402034d52..4df93606fe4f7 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2024-08-08 +date: 2024-08-12 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 f39dbac0a810a..7d15683ce3996 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_hooks.mdx b/api_docs/kbn_react_hooks.mdx index bd286282e2ad0..efdba8a23eb0e 100644 --- a/api_docs/kbn_react_hooks.mdx +++ b/api_docs/kbn_react_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-hooks title: "@kbn/react-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-hooks plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-hooks'] --- import kbnReactHooksObj from './kbn_react_hooks.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index 81993e0917771..1b9d38befd97a 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2024-08-08 +date: 2024-08-12 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 77283ede26138..b5ac0b5ea1867 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2024-08-08 +date: 2024-08-12 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 28444b825734c..725f46b126794 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2024-08-08 +date: 2024-08-12 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 ed2cadefff94f..c727d96de1f4f 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2024-08-08 +date: 2024-08-12 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 c509d8f64bc20..b6bb3234d1b24 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2024-08-08 +date: 2024-08-12 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 d8008ad5fe538..0522e8f31f515 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_recently_accessed.mdx b/api_docs/kbn_recently_accessed.mdx index aae8e22d7f51b..8206a9d368fc0 100644 --- a/api_docs/kbn_recently_accessed.mdx +++ b/api_docs/kbn_recently_accessed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-recently-accessed title: "@kbn/recently-accessed" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/recently-accessed plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/recently-accessed'] --- import kbnRecentlyAccessedObj from './kbn_recently_accessed.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index 4364da4f5e2b2..4635bea4cdf19 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2024-08-08 +date: 2024-08-12 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 a27c077ae68ff..0709db9f707af 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2024-08-08 +date: 2024-08-12 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 eae5097895bf6..b7ad07d4fd94f 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2024-08-08 +date: 2024-08-12 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 ab1a3cdcd19e6..60e9e15acd993 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2024-08-08 +date: 2024-08-12 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 00dce6a151991..5102a65520ce7 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_csv_share_panel.mdx b/api_docs/kbn_reporting_csv_share_panel.mdx index 157c7253517a8..238ce47bc9199 100644 --- a/api_docs/kbn_reporting_csv_share_panel.mdx +++ b/api_docs/kbn_reporting_csv_share_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-csv-share-panel title: "@kbn/reporting-csv-share-panel" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-csv-share-panel plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-csv-share-panel'] --- import kbnReportingCsvSharePanelObj from './kbn_reporting_csv_share_panel.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index ef4ecb54af388..b93450c82dcc3 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2024-08-08 +date: 2024-08-12 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 8e301f04dfd0e..addae41645ddc 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2024-08-08 +date: 2024-08-12 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 3145ab3e7c451..2877e414785a5 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2024-08-08 +date: 2024-08-12 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 f43a8e9901be5..a46a02801058a 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2024-08-08 +date: 2024-08-12 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 4b8339f3e812d..1ce180808a78c 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2024-08-08 +date: 2024-08-12 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 71cf39f741a20..71a6ecebe24aa 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2024-08-08 +date: 2024-08-12 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 9dee4ca54c204..da66dad2c1ea3 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2024-08-08 +date: 2024-08-12 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 8aff20a5e82bb..4a3422d78bb48 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2024-08-08 +date: 2024-08-12 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 2bf3b49a0041e..ec3feab617d8e 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2024-08-08 +date: 2024-08-12 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 05804a8139e88..c3b630715865e 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_response_ops_feature_flag_service.mdx b/api_docs/kbn_response_ops_feature_flag_service.mdx index d96d0c98b2ee5..85a28070c727d 100644 --- a/api_docs/kbn_response_ops_feature_flag_service.mdx +++ b/api_docs/kbn_response_ops_feature_flag_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-feature-flag-service title: "@kbn/response-ops-feature-flag-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-feature-flag-service plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-feature-flag-service'] --- import kbnResponseOpsFeatureFlagServiceObj from './kbn_response_ops_feature_flag_service.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 974465f102b6c..2c7f6a76ae252 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rollup.mdx b/api_docs/kbn_rollup.mdx index 717416a01dbd0..9918363ca5ee6 100644 --- a/api_docs/kbn_rollup.mdx +++ b/api_docs/kbn_rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rollup title: "@kbn/rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rollup plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rollup'] --- import kbnRollupObj from './kbn_rollup.devdocs.json'; diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx index 82fc843dea744..ed6878841de18 100644 --- a/api_docs/kbn_router_to_openapispec.mdx +++ b/api_docs/kbn_router_to_openapispec.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-to-openapispec title: "@kbn/router-to-openapispec" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-to-openapispec plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-to-openapispec'] --- import kbnRouterToOpenapispecObj from './kbn_router_to_openapispec.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index 9aca2ec33252a..d6d01f09ea863 100644 --- a/api_docs/kbn_router_utils.mdx +++ b/api_docs/kbn_router_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils title: "@kbn/router-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 1a448ec1857b7..1102b37b4a905 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2024-08-08 +date: 2024-08-12 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 c019899d6e803..69ebf79710e81 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 dc6b8c0b1a38d..3cafae7e5e1b6 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2024-08-08 +date: 2024-08-12 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 806bde85577d8..f395f2636ef25 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2024-08-08 +date: 2024-08-12 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.mdx b/api_docs/kbn_search_connectors.mdx index 5fa0005540305..e2aa19d4040a9 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index 8276b375507f2..0fbdb6bb30cab 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2024-08-08 +date: 2024-08-12 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 8055e39240ba4..c7ce215eadaae 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2024-08-08 +date: 2024-08-12 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 95e61451f1f67..297b7a61513db 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index b469025b6d532..8f78a3e69b386 100644 --- a/api_docs/kbn_search_types.mdx +++ b/api_docs/kbn_search_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-types title: "@kbn/search-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-types plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] --- import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; diff --git a/api_docs/kbn_security_api_key_management.mdx b/api_docs/kbn_security_api_key_management.mdx index 233c5119cf596..9a1448a7426bc 100644 --- a/api_docs/kbn_security_api_key_management.mdx +++ b/api_docs/kbn_security_api_key_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-api-key-management title: "@kbn/security-api-key-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-api-key-management plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-api-key-management'] --- import kbnSecurityApiKeyManagementObj from './kbn_security_api_key_management.devdocs.json'; diff --git a/api_docs/kbn_security_form_components.mdx b/api_docs/kbn_security_form_components.mdx index a24cac184ed26..bc18bd4d31bd7 100644 --- a/api_docs/kbn_security_form_components.mdx +++ b/api_docs/kbn_security_form_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-form-components title: "@kbn/security-form-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-form-components plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-form-components'] --- import kbnSecurityFormComponentsObj from './kbn_security_form_components.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index 2da1623dda034..4764760faed17 100644 --- a/api_docs/kbn_security_hardening.mdx +++ b/api_docs/kbn_security_hardening.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-hardening title: "@kbn/security-hardening" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-hardening plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-hardening'] --- import kbnSecurityHardeningObj from './kbn_security_hardening.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index 6bcceb090ab38..d86bfe29b129b 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2024-08-08 +date: 2024-08-12 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 46d4056720b79..8790206c8dc29 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2024-08-08 +date: 2024-08-12 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 c3f11125cc42b..4c1463ab67c49 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2024-08-08 +date: 2024-08-12 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_distribution_bar.mdx b/api_docs/kbn_security_solution_distribution_bar.mdx index 388acb35c5d8c..84306527d8f96 100644 --- a/api_docs/kbn_security_solution_distribution_bar.mdx +++ b/api_docs/kbn_security_solution_distribution_bar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-distribution-bar title: "@kbn/security-solution-distribution-bar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-distribution-bar plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-distribution-bar'] --- import kbnSecuritySolutionDistributionBarObj from './kbn_security_solution_distribution_bar.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index e05572fa49949..4308bf935f15c 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2024-08-08 +date: 2024-08-12 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 b422b473d6036..8d093c91addea 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2024-08-08 +date: 2024-08-12 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 4cf26074672af..012a9956a3c05 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2024-08-08 +date: 2024-08-12 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 309d62ccaa2d0..20c76925299bb 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2024-08-08 +date: 2024-08-12 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 5714d4778ff73..0f4221b192334 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2024-08-08 +date: 2024-08-12 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 4c2c7f27a9536..86c1dee74838d 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2024-08-08 +date: 2024-08-12 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 57d35b97b81b8..c9432292e68d1 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2024-08-08 +date: 2024-08-12 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 52ba6f7c95735..6ad15ef2719db 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 a170d02cfa40d..35790905e1542 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2024-08-08 +date: 2024-08-12 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_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index a8c25aa4741c0..5de1901cad561 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 87ee6dac77884..3857fa142ec14 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2024-08-08 +date: 2024-08-12 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 405bb509c707d..35b244f4cddfa 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2024-08-08 +date: 2024-08-12 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 61eae47af1347..c8cda9ac0357c 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2024-08-08 +date: 2024-08-12 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 e0b21eb792a2f..c9e703c9b01a3 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 99cb8d1dfa5c2..36fdb16633c09 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2024-08-08 +date: 2024-08-12 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 a1ca045acad6e..ffa8e7cb2bcca 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2024-08-08 +date: 2024-08-12 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 a843756e300ab..de68f625d2e2c 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2024-08-08 +date: 2024-08-12 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 3b0038d07dbd5..2769d4705317f 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 f9e79f761ad33..43114efc8fabb 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2024-08-08 +date: 2024-08-12 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 40f19b0f2122a..4f333eb9c8742 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2024-08-08 +date: 2024-08-12 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 582a92a2e4b42..dc1f1d5389ba5 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 e1ee7439b9b27..88e2a34879c4e 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2024-08-08 +date: 2024-08-12 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.devdocs.json b/api_docs/kbn_server_route_repository.devdocs.json index 8d5fb3cd5dfdc..131bad8a5f347 100644 --- a/api_docs/kbn_server_route_repository.devdocs.json +++ b/api_docs/kbn_server_route_repository.devdocs.json @@ -21,26 +21,26 @@ "signature": [ "() => (route: ", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.ServerRoute", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRoute", "text": "ServerRoute" }, ") => Record>" @@ -200,7 +200,13 @@ "text": "CoreSetup" }, "; repository: Record Promise; } & ", - "ServerRouteCreateOptions", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRouteCreateOptions", + "text": "ServerRouteCreateOptions" + }, ">; logger: ", { "pluginId": "@kbn/logging", @@ -209,7 +215,7 @@ "section": "def-common.Logger", "text": "Logger" }, - "; dependencies: Record; }) => void" + "; dependencies: TDependencies; }) => void" ], "path": "packages/kbn-server-route-repository/src/register_routes.ts", "deprecated": false, @@ -256,7 +262,13 @@ "description": [], "signature": [ "{ [x: string]: { endpoint: string; params?: any; handler: ({}: any) => Promise; } & ", - "ServerRouteCreateOptions", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRouteCreateOptions", + "text": "ServerRouteCreateOptions" + }, "; }" ], "path": "packages/kbn-server-route-repository/src/register_routes.ts", @@ -286,12 +298,12 @@ { "parentPluginId": "@kbn/server-route-repository", "id": "def-server.registerRoutes.$1.dependencies", - "type": "Object", + "type": "Uncategorized", "tags": [], "label": "dependencies", "description": [], "signature": [ - "{ [x: string]: any; }" + "TDependencies" ], "path": "packages/kbn-server-route-repository/src/register_routes.ts", "deprecated": false, @@ -305,6 +317,93 @@ } ], "interfaces": [ + { + "parentPluginId": "@kbn/server-route-repository", + "id": "def-server.DefaultRouteCreateOptions", + "type": "Interface", + "tags": [], + "label": "DefaultRouteCreateOptions", + "description": [], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/server-route-repository", + "id": "def-server.DefaultRouteCreateOptions.options", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteConfigOptions", + "text": "RouteConfigOptions" + }, + "<", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteMethod", + "text": "RouteMethod" + }, + "> | undefined" + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-route-repository", + "id": "def-server.DefaultRouteHandlerResources", + "type": "Interface", + "tags": [], + "label": "DefaultRouteHandlerResources", + "description": [], + "signature": [ + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.DefaultRouteHandlerResources", + "text": "DefaultRouteHandlerResources" + }, + " extends CoreRouteHandlerResources" + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/server-route-repository", + "id": "def-server.DefaultRouteHandlerResources.logger", + "type": "Object", + "tags": [], + "label": "logger", + "description": [], + "signature": [ + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.Logger", + "text": "Logger" + } + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/server-route-repository", "id": "def-server.RouteState", @@ -312,7 +411,7 @@ "tags": [], "label": "RouteState", "description": [], - "path": "packages/kbn-server-route-repository/src/typings.ts", + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -326,7 +425,7 @@ "signature": [ "[endpoint: string]: any" ], - "path": "packages/kbn-server-route-repository/src/typings.ts", + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", "deprecated": false, "trackAdoption": false } @@ -346,25 +445,31 @@ "signature": [ "TServerRouteRepository[TEndpoint] extends { endpoint: any; params?: infer TRouteParamsRT extends ", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.RouteParamsRT", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.RouteParamsRT", "text": "RouteParamsRT" }, " | undefined | undefined; handler: ({}: any) => Promise; } & ", - "ServerRouteCreateOptions", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRouteCreateOptions", + "text": "ServerRouteCreateOptions" + }, " ? TRouteParamsRT extends ", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.RouteParamsRT", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.RouteParamsRT", "text": "RouteParamsRT" }, " ? ClientRequestParamsOfType : {} : never" ], - "path": "packages/kbn-server-route-repository/src/typings.ts", + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -379,25 +484,31 @@ "signature": [ "TServerRouteRepository[TEndpoint] extends { endpoint: any; params?: infer TRouteParamsRT extends ", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.RouteParamsRT", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.RouteParamsRT", "text": "RouteParamsRT" }, " | undefined | undefined; handler: ({}: any) => Promise; } & ", - "ServerRouteCreateOptions", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRouteCreateOptions", + "text": "ServerRouteCreateOptions" + }, " ? TRouteParamsRT extends ", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.RouteParamsRT", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.RouteParamsRT", "text": "RouteParamsRT" }, " ? DecodedRequestParamsOfType : {} : never" ], - "path": "packages/kbn-server-route-repository/src/typings.ts", + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -412,7 +523,7 @@ "signature": [ "keyof TServerRouteRepository" ], - "path": "packages/kbn-server-route-repository/src/typings.ts", + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -426,7 +537,13 @@ "description": [], "signature": [ "TServerRouteRepository[TEndpoint] extends { endpoint: any; params?: any; handler: ({}: any) => Promise; } & ", - "ServerRouteCreateOptions", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRouteCreateOptions", + "text": "ServerRouteCreateOptions" + }, " ? TReturnType extends ", { "pluginId": "@kbn/core-http-server", @@ -447,7 +564,7 @@ }, " | undefined; } | undefined> ? TWrappedResponseType : TReturnType : never" ], - "path": "packages/kbn-server-route-repository/src/typings.ts", + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -468,7 +585,7 @@ "Encoder", "; }" ], - "path": "packages/kbn-server-route-repository/src/typings.ts", + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -481,25 +598,25 @@ "label": "RouteRepositoryClient", "description": [], "signature": [ - "(endpoint: TEndpoint, ...args: MaybeOptionalArgs<", + ">(endpoint: TEndpoint, ...args: MaybeOptionalArgs<", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.ClientRequestParamsOf", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ClientRequestParamsOf", "text": "ClientRequestParamsOf" }, " & TAdditionalClientOptions>) => Promise<", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.ReturnOf", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ReturnOf", "text": "ReturnOf" }, ">" ], - "path": "packages/kbn-server-route-repository/src/typings.ts", + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", "deprecated": false, "trackAdoption": false, "returnComment": [], @@ -514,7 +631,7 @@ "signature": [ "TEndpoint" ], - "path": "packages/kbn-server-route-repository/src/typings.ts", + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", "deprecated": false, "trackAdoption": false }, @@ -529,31 +646,31 @@ "RequiredKeys", "<", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.ClientRequestParamsOf", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ClientRequestParamsOf", "text": "ClientRequestParamsOf" }, " & TAdditionalClientOptions> extends never ? [] | [", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.ClientRequestParamsOf", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ClientRequestParamsOf", "text": "ClientRequestParamsOf" }, " & TAdditionalClientOptions] : [", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.ClientRequestParamsOf", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ClientRequestParamsOf", "text": "ClientRequestParamsOf" }, " & TAdditionalClientOptions]" ], - "path": "packages/kbn-server-route-repository/src/typings.ts", + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", "deprecated": false, "trackAdoption": false } @@ -570,15 +687,15 @@ "signature": [ "ValidateEndpoint extends true ? { endpoint: TEndpoint; params?: TRouteParamsRT | undefined; handler: ({}: TRouteHandlerResources & (TRouteParamsRT extends ", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.RouteParamsRT", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.RouteParamsRT", "text": "RouteParamsRT" }, " ? DecodedRequestParamsOfType : {})) => Promise; } & TRouteCreateOptions : never" ], - "path": "packages/kbn-server-route-repository/src/typings.ts", + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -593,15 +710,15 @@ "signature": [ "{ [x: string]: { endpoint: string; params?: ", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.RouteParamsRT", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.RouteParamsRT", "text": "RouteParamsRT" }, " | undefined; handler: ({}: any) => Promise; } & Record; }" ], - "path": "packages/kbn-server-route-repository/src/typings.ts", + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index e41e9b0900d4e..0375afa2ce106 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 31 | 0 | 30 | 1 | +| 35 | 0 | 34 | 0 | ## Server diff --git a/api_docs/kbn_server_route_repository_client.devdocs.json b/api_docs/kbn_server_route_repository_client.devdocs.json new file mode 100644 index 0000000000000..c4368889eea9e --- /dev/null +++ b/api_docs/kbn_server_route_repository_client.devdocs.json @@ -0,0 +1,122 @@ +{ + "id": "@kbn/server-route-repository-client", + "client": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/server-route-repository-client", + "id": "def-public.createRepositoryClient", + "type": "Function", + "tags": [], + "label": "createRepositoryClient", + "description": [], + "signature": [ + "(core: ", + { + "pluginId": "@kbn/core-lifecycle-browser", + "scope": "public", + "docId": "kibKbnCoreLifecycleBrowserPluginApi", + "section": "def-public.CoreStart", + "text": "CoreStart" + }, + " | ", + { + "pluginId": "@kbn/core-lifecycle-browser", + "scope": "public", + "docId": "kibKbnCoreLifecycleBrowserPluginApi", + "section": "def-public.CoreSetup", + "text": "CoreSetup" + }, + ") => { fetch: ", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.RouteRepositoryClient", + "text": "RouteRepositoryClient" + }, + "; }" + ], + "path": "packages/kbn-server-route-repository-client/src/create_repository_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/server-route-repository-client", + "id": "def-public.createRepositoryClient.$1", + "type": "CompoundType", + "tags": [], + "label": "core", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-lifecycle-browser", + "scope": "public", + "docId": "kibKbnCoreLifecycleBrowserPluginApi", + "section": "def-public.CoreStart", + "text": "CoreStart" + }, + " | ", + { + "pluginId": "@kbn/core-lifecycle-browser", + "scope": "public", + "docId": "kibKbnCoreLifecycleBrowserPluginApi", + "section": "def-public.CoreSetup", + "text": "CoreSetup" + }, + "" + ], + "path": "packages/kbn-server-route-repository-client/src/create_repository_client.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/server-route-repository-client", + "id": "def-public.DefaultClientOptions", + "type": "Type", + "tags": [], + "label": "DefaultClientOptions", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-browser", + "scope": "public", + "docId": "kibKbnCoreHttpBrowserPluginApi", + "section": "def-public.HttpFetchOptions", + "text": "HttpFetchOptions" + } + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_server_route_repository_client.mdx b/api_docs/kbn_server_route_repository_client.mdx new file mode 100644 index 0000000000000..5b8dfb615d880 --- /dev/null +++ b/api_docs/kbn_server_route_repository_client.mdx @@ -0,0 +1,33 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnServerRouteRepositoryClientPluginApi +slug: /kibana-dev-docs/api/kbn-server-route-repository-client +title: "@kbn/server-route-repository-client" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/server-route-repository-client plugin +date: 2024-08-12 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-client'] +--- +import kbnServerRouteRepositoryClientObj from './kbn_server_route_repository_client.devdocs.json'; + + + +Contact [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 3 | 0 | 3 | 0 | + +## Client + +### Functions + + +### Consts, variables and types + + diff --git a/api_docs/kbn_server_route_repository_utils.devdocs.json b/api_docs/kbn_server_route_repository_utils.devdocs.json index 5a60cb9e794bb..b46edcb83eca7 100644 --- a/api_docs/kbn_server_route_repository_utils.devdocs.json +++ b/api_docs/kbn_server_route_repository_utils.devdocs.json @@ -101,9 +101,465 @@ "initialIsOpen": false } ], - "interfaces": [], + "interfaces": [ + { + "parentPluginId": "@kbn/server-route-repository-utils", + "id": "def-common.DefaultRouteCreateOptions", + "type": "Interface", + "tags": [], + "label": "DefaultRouteCreateOptions", + "description": [], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/server-route-repository-utils", + "id": "def-common.DefaultRouteCreateOptions.options", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteConfigOptions", + "text": "RouteConfigOptions" + }, + "<", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteMethod", + "text": "RouteMethod" + }, + "> | undefined" + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-route-repository-utils", + "id": "def-common.DefaultRouteHandlerResources", + "type": "Interface", + "tags": [], + "label": "DefaultRouteHandlerResources", + "description": [], + "signature": [ + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.DefaultRouteHandlerResources", + "text": "DefaultRouteHandlerResources" + }, + " extends CoreRouteHandlerResources" + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/server-route-repository-utils", + "id": "def-common.DefaultRouteHandlerResources.logger", + "type": "Object", + "tags": [], + "label": "logger", + "description": [], + "signature": [ + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.Logger", + "text": "Logger" + } + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-route-repository-utils", + "id": "def-common.RouteState", + "type": "Interface", + "tags": [], + "label": "RouteState", + "description": [], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/server-route-repository-utils", + "id": "def-common.RouteState.Unnamed", + "type": "IndexSignature", + "tags": [], + "label": "[endpoint: string]: any", + "description": [], + "signature": [ + "[endpoint: string]: any" + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], "enums": [], - "misc": [], + "misc": [ + { + "parentPluginId": "@kbn/server-route-repository-utils", + "id": "def-common.ClientRequestParamsOf", + "type": "Type", + "tags": [], + "label": "ClientRequestParamsOf", + "description": [], + "signature": [ + "TServerRouteRepository[TEndpoint] extends { endpoint: any; params?: infer TRouteParamsRT extends ", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.RouteParamsRT", + "text": "RouteParamsRT" + }, + " | undefined | undefined; handler: ({}: any) => Promise; } & ", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRouteCreateOptions", + "text": "ServerRouteCreateOptions" + }, + " ? TRouteParamsRT extends ", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.RouteParamsRT", + "text": "RouteParamsRT" + }, + " ? ClientRequestParamsOfType : {} : never" + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-route-repository-utils", + "id": "def-common.DecodedRequestParamsOf", + "type": "Type", + "tags": [], + "label": "DecodedRequestParamsOf", + "description": [], + "signature": [ + "TServerRouteRepository[TEndpoint] extends { endpoint: any; params?: infer TRouteParamsRT extends ", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.RouteParamsRT", + "text": "RouteParamsRT" + }, + " | undefined | undefined; handler: ({}: any) => Promise; } & ", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRouteCreateOptions", + "text": "ServerRouteCreateOptions" + }, + " ? TRouteParamsRT extends ", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.RouteParamsRT", + "text": "RouteParamsRT" + }, + " ? DecodedRequestParamsOfType : {} : never" + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-route-repository-utils", + "id": "def-common.DefaultClientOptions", + "type": "Type", + "tags": [], + "label": "DefaultClientOptions", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-browser", + "scope": "public", + "docId": "kibKbnCoreHttpBrowserPluginApi", + "section": "def-public.HttpFetchOptions", + "text": "HttpFetchOptions" + } + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-route-repository-utils", + "id": "def-common.EndpointOf", + "type": "Type", + "tags": [], + "label": "EndpointOf", + "description": [], + "signature": [ + "keyof TServerRouteRepository" + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-route-repository-utils", + "id": "def-common.ReturnOf", + "type": "Type", + "tags": [], + "label": "ReturnOf", + "description": [], + "signature": [ + "TServerRouteRepository[TEndpoint] extends { endpoint: any; params?: any; handler: ({}: any) => Promise; } & ", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRouteCreateOptions", + "text": "ServerRouteCreateOptions" + }, + " ? TReturnType extends ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.IKibanaResponse", + "text": "IKibanaResponse" + }, + " | Error | Buffer | ", + "Stream", + " | { message: string | Error; attributes?: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.ResponseErrorAttributes", + "text": "ResponseErrorAttributes" + }, + " | undefined; } | undefined> ? TWrappedResponseType : TReturnType : never" + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-route-repository-utils", + "id": "def-common.RouteParamsRT", + "type": "Type", + "tags": [], + "label": "RouteParamsRT", + "description": [], + "signature": [ + "Omit<", + "Type", + "<{ path?: any; query?: any; body?: any; }, { path?: any; query?: any; body?: any; }, unknown>, \"encode\" | \"asEncoder\"> & { encode: ", + "Encode", + "; asEncoder: () => ", + "Encoder", + "; }" + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-route-repository-utils", + "id": "def-common.RouteRepositoryClient", + "type": "Type", + "tags": [], + "label": "RouteRepositoryClient", + "description": [], + "signature": [ + ">(endpoint: TEndpoint, ...args: MaybeOptionalArgs<", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ClientRequestParamsOf", + "text": "ClientRequestParamsOf" + }, + " & TAdditionalClientOptions>) => Promise<", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ReturnOf", + "text": "ReturnOf" + }, + ">" + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/server-route-repository-utils", + "id": "def-common.RouteRepositoryClient.$1", + "type": "Uncategorized", + "tags": [], + "label": "endpoint", + "description": [], + "signature": [ + "TEndpoint" + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/server-route-repository-utils", + "id": "def-common.RouteRepositoryClient.$2", + "type": "Uncategorized", + "tags": [], + "label": "args", + "description": [], + "signature": [ + "RequiredKeys", + "<", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ClientRequestParamsOf", + "text": "ClientRequestParamsOf" + }, + " & TAdditionalClientOptions> extends never ? [] | [", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ClientRequestParamsOf", + "text": "ClientRequestParamsOf" + }, + " & TAdditionalClientOptions] : [", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ClientRequestParamsOf", + "text": "ClientRequestParamsOf" + }, + " & TAdditionalClientOptions]" + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-route-repository-utils", + "id": "def-common.ServerRoute", + "type": "Type", + "tags": [], + "label": "ServerRoute", + "description": [], + "signature": [ + "ValidateEndpoint extends true ? { endpoint: TEndpoint; params?: TRouteParamsRT | undefined; handler: ({}: TRouteHandlerResources & (TRouteParamsRT extends ", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.RouteParamsRT", + "text": "RouteParamsRT" + }, + " ? DecodedRequestParamsOfType : {})) => Promise; } & TRouteCreateOptions : never" + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-route-repository-utils", + "id": "def-common.ServerRouteCreateOptions", + "type": "Type", + "tags": [], + "label": "ServerRouteCreateOptions", + "description": [], + "signature": [ + "{ [x: string]: any; }" + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-route-repository-utils", + "id": "def-common.ServerRouteHandlerResources", + "type": "Type", + "tags": [], + "label": "ServerRouteHandlerResources", + "description": [], + "signature": [ + "{ [x: string]: any; }" + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-route-repository-utils", + "id": "def-common.ServerRouteRepository", + "type": "Type", + "tags": [], + "label": "ServerRouteRepository", + "description": [], + "signature": [ + "{ [x: string]: { endpoint: string; params?: ", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.RouteParamsRT", + "text": "RouteParamsRT" + }, + " | undefined; handler: ({}: any) => Promise; } & Record; }" + ], + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], "objects": [] } } \ No newline at end of file diff --git a/api_docs/kbn_server_route_repository_utils.mdx b/api_docs/kbn_server_route_repository_utils.mdx index 64bcfa7677127..b8846764b7fc0 100644 --- a/api_docs/kbn_server_route_repository_utils.mdx +++ b/api_docs/kbn_server_route_repository_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-utils title: "@kbn/server-route-repository-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-utils plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-utils'] --- import kbnServerRouteRepositoryUtilsObj from './kbn_server_route_repository_utils.devdocs.json'; @@ -21,10 +21,16 @@ Contact [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 5 | 0 | 5 | 0 | +| 24 | 0 | 24 | 0 | ## Common ### Functions +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index a8f2ac795ebb3..c4d323a5b831c 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2024-08-08 +date: 2024-08-12 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 82655cae0866f..3d882cfb6bb5f 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2024-08-08 +date: 2024-08-12 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 e78845c52d974..39f3785ccf59e 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2024-08-08 +date: 2024-08-12 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 3a0c8737238cd..03cf188278615 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2024-08-08 +date: 2024-08-12 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 2fd1795ff01cd..420540c09dcc6 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2024-08-08 +date: 2024-08-12 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 a2e322532f7fe..5f60d42d03b56 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2024-08-08 +date: 2024-08-12 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 2958c334b5d2b..2262549b890c3 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2024-08-08 +date: 2024-08-12 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 aaa806fbafe5b..a5ecb221cf4fe 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2024-08-08 +date: 2024-08-12 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 569cba45daf73..8285e8d47958f 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2024-08-08 +date: 2024-08-12 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 4bbce6fd5be83..3d6be8a3c163f 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2024-08-08 +date: 2024-08-12 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 0232688b5c7a2..7f4b52b7bcac6 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2024-08-08 +date: 2024-08-12 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 8dfda9d2dcc01..3098d39bce5df 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 85fd8e27ed66f..3396fd6deace0 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2024-08-08 +date: 2024-08-12 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 55955ca38da63..722eecb8429b6 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2024-08-08 +date: 2024-08-12 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 db6f363b3e76a..0ec411e600f58 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2024-08-08 +date: 2024-08-12 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 37acae655f400..0e131b7e59abb 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2024-08-08 +date: 2024-08-12 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 e91a962f90792..aea7064b64e2b 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 e0ffe21f66ec8..ff9622569eb76 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 cbbde620ba593..6d34b5e7a5e75 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2024-08-08 +date: 2024-08-12 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 31b11254fddec..d8db139aad4ee 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2024-08-08 +date: 2024-08-12 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 e180968d95a76..34b491252894e 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2024-08-08 +date: 2024-08-12 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 9408bfe76143c..5755ab6c35769 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2024-08-08 +date: 2024-08-12 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 1802cb8e2af6d..6bb1871901ad7 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2024-08-08 +date: 2024-08-12 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 14ac0aeb3d679..5f3c6e85a2a3e 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 afbe5b45c7c0b..88b110484e2d9 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2024-08-08 +date: 2024-08-12 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 553fbd004694b..0aeae0f92691e 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 b18286fc4bfee..5f6d8b59754f7 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2024-08-08 +date: 2024-08-12 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 a95cfe896f4cf..70acae1ac0525 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 baaae833f7fbe..9480e7f7aa0bd 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2024-08-08 +date: 2024-08-12 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 0f3e321c1f0b6..df6bed2e5d17a 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 6fff6b2fcc4fa..0c916581d2225 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2024-08-08 +date: 2024-08-12 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 94cf259e55575..d472169488033 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 6c217da430dbd..26d499a0c3369 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2024-08-08 +date: 2024-08-12 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 49c0b4fd9c8a8..d78fea8d78fec 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2024-08-08 +date: 2024-08-12 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 416ab1b14135b..28fcccab361b0 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 a5184f221df7b..33a8389536712 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 effc761116b21..66210b9b955e4 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2024-08-08 +date: 2024-08-12 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 39f9c8ceda85c..44466af5d48af 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2024-08-08 +date: 2024-08-12 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 045d44840c05d..4796e9382cb17 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 0991c30ea0482..47b6e440b34a3 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2024-08-08 +date: 2024-08-12 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 6b30ce494f0a6..6c2f2d73ae502 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2024-08-08 +date: 2024-08-12 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 990f362356522..13f8124c7933f 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2024-08-08 +date: 2024-08-12 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 190dd3edd0425..49841b8b959e0 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2024-08-08 +date: 2024-08-12 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 86b8e1ac93218..7c6d14cb29abf 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2024-08-08 +date: 2024-08-12 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_tabbed_modal.mdx b/api_docs/kbn_shared_ux_tabbed_modal.mdx index 62bbf8aff5ab2..6bd02782ef2e3 100644 --- a/api_docs/kbn_shared_ux_tabbed_modal.mdx +++ b/api_docs/kbn_shared_ux_tabbed_modal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-tabbed-modal title: "@kbn/shared-ux-tabbed-modal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-tabbed-modal plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-tabbed-modal'] --- import kbnSharedUxTabbedModalObj from './kbn_shared_ux_tabbed_modal.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index dc96e32137628..bdc8a7435ffca 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2024-08-08 +date: 2024-08-12 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 359807de14b5e..cd29bbf94a60e 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2024-08-08 +date: 2024-08-12 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 7b1df1741bdad..af4010409a156 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx index 4d54b3fa28666..2c00d8893d974 100644 --- a/api_docs/kbn_sort_predicates.mdx +++ b/api_docs/kbn_sort_predicates.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-predicates title: "@kbn/sort-predicates" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-predicates plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 43b5de7f747ea..c9db4e23ac50c 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2024-08-08 +date: 2024-08-12 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 f1f0cb01a2123..6e60a4abe21e9 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2024-08-08 +date: 2024-08-12 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 92a2718ced9da..e16bdb22ac568 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_synthetics_e2e.mdx b/api_docs/kbn_synthetics_e2e.mdx index 7e910866ef549..5cda66c41846b 100644 --- a/api_docs/kbn_synthetics_e2e.mdx +++ b/api_docs/kbn_synthetics_e2e.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-e2e title: "@kbn/synthetics-e2e" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-e2e plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-e2e'] --- import kbnSyntheticsE2eObj from './kbn_synthetics_e2e.devdocs.json'; diff --git a/api_docs/kbn_synthetics_private_location.devdocs.json b/api_docs/kbn_synthetics_private_location.devdocs.json new file mode 100644 index 0000000000000..6b8de96db3d57 --- /dev/null +++ b/api_docs/kbn_synthetics_private_location.devdocs.json @@ -0,0 +1,314 @@ +{ + "id": "@kbn/synthetics-private-location", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/synthetics-private-location", + "id": "def-common.cli", + "type": "Function", + "tags": [], + "label": "cli", + "description": [], + "signature": [ + "(cliOptions: ", + { + "pluginId": "@kbn/synthetics-private-location", + "scope": "common", + "docId": "kibKbnSyntheticsPrivateLocationPluginApi", + "section": "def-common.CliOptions", + "text": "CliOptions" + }, + " | undefined) => Promise" + ], + "path": "x-pack/packages/kbn-synthetics-private-location/src/cli.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/synthetics-private-location", + "id": "def-common.cli.$1", + "type": "Object", + "tags": [], + "label": "cliOptions", + "description": [], + "signature": [ + { + "pluginId": "@kbn/synthetics-private-location", + "scope": "common", + "docId": "kibKbnSyntheticsPrivateLocationPluginApi", + "section": "def-common.CliOptions", + "text": "CliOptions" + }, + " | undefined" + ], + "path": "x-pack/packages/kbn-synthetics-private-location/src/cli.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/synthetics-private-location", + "id": "def-common.run", + "type": "Function", + "tags": [], + "label": "run", + "description": [], + "signature": [ + "(options: ", + { + "pluginId": "@kbn/synthetics-private-location", + "scope": "common", + "docId": "kibKbnSyntheticsPrivateLocationPluginApi", + "section": "def-common.CliOptions", + "text": "CliOptions" + }, + ", logger: ", + { + "pluginId": "@kbn/tooling-log", + "scope": "common", + "docId": "kibKbnToolingLogPluginApi", + "section": "def-common.ToolingLog", + "text": "ToolingLog" + }, + ") => Promise" + ], + "path": "x-pack/packages/kbn-synthetics-private-location/src/run.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/synthetics-private-location", + "id": "def-common.run.$1", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "@kbn/synthetics-private-location", + "scope": "common", + "docId": "kibKbnSyntheticsPrivateLocationPluginApi", + "section": "def-common.CliOptions", + "text": "CliOptions" + } + ], + "path": "x-pack/packages/kbn-synthetics-private-location/src/run.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/synthetics-private-location", + "id": "def-common.run.$2", + "type": "Object", + "tags": [], + "label": "logger", + "description": [], + "signature": [ + { + "pluginId": "@kbn/tooling-log", + "scope": "common", + "docId": "kibKbnToolingLogPluginApi", + "section": "def-common.ToolingLog", + "text": "ToolingLog" + } + ], + "path": "x-pack/packages/kbn-synthetics-private-location/src/run.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "@kbn/synthetics-private-location", + "id": "def-common.CliOptions", + "type": "Interface", + "tags": [], + "label": "CliOptions", + "description": [], + "path": "x-pack/packages/kbn-synthetics-private-location/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/synthetics-private-location", + "id": "def-common.CliOptions.locationName", + "type": "string", + "tags": [], + "label": "locationName", + "description": [], + "path": "x-pack/packages/kbn-synthetics-private-location/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/synthetics-private-location", + "id": "def-common.CliOptions.agentPolicyName", + "type": "string", + "tags": [], + "label": "agentPolicyName", + "description": [], + "path": "x-pack/packages/kbn-synthetics-private-location/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/synthetics-private-location", + "id": "def-common.CliOptions.kibanaUrl", + "type": "string", + "tags": [], + "label": "kibanaUrl", + "description": [], + "path": "x-pack/packages/kbn-synthetics-private-location/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/synthetics-private-location", + "id": "def-common.CliOptions.kibanaUsername", + "type": "string", + "tags": [], + "label": "kibanaUsername", + "description": [], + "path": "x-pack/packages/kbn-synthetics-private-location/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/synthetics-private-location", + "id": "def-common.CliOptions.kibanaPassword", + "type": "string", + "tags": [], + "label": "kibanaPassword", + "description": [], + "path": "x-pack/packages/kbn-synthetics-private-location/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/synthetics-private-location", + "id": "def-common.CliOptions.elasticsearchHost", + "type": "string", + "tags": [], + "label": "elasticsearchHost", + "description": [], + "path": "x-pack/packages/kbn-synthetics-private-location/src/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [], + "objects": [ + { + "parentPluginId": "@kbn/synthetics-private-location", + "id": "def-common.DEFAULTS", + "type": "Object", + "tags": [], + "label": "DEFAULTS", + "description": [], + "path": "x-pack/packages/kbn-synthetics-private-location/src/constants.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/synthetics-private-location", + "id": "def-common.DEFAULTS.LOCATION_NAME", + "type": "string", + "tags": [], + "label": "LOCATION_NAME", + "description": [], + "path": "x-pack/packages/kbn-synthetics-private-location/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/synthetics-private-location", + "id": "def-common.DEFAULTS.AGENT_POLICY_NAME", + "type": "string", + "tags": [], + "label": "AGENT_POLICY_NAME", + "description": [], + "path": "x-pack/packages/kbn-synthetics-private-location/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/synthetics-private-location", + "id": "def-common.DEFAULTS.ELASTICSEARCH_HOST", + "type": "string", + "tags": [], + "label": "ELASTICSEARCH_HOST", + "description": [], + "path": "x-pack/packages/kbn-synthetics-private-location/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/synthetics-private-location", + "id": "def-common.DEFAULTS.KIBANA_URL", + "type": "string", + "tags": [], + "label": "KIBANA_URL", + "description": [], + "path": "x-pack/packages/kbn-synthetics-private-location/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/synthetics-private-location", + "id": "def-common.DEFAULTS.KIBANA_USERNAME", + "type": "string", + "tags": [], + "label": "KIBANA_USERNAME", + "description": [], + "path": "x-pack/packages/kbn-synthetics-private-location/src/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/synthetics-private-location", + "id": "def-common.DEFAULTS.KIBANA_PASSWORD", + "type": "string", + "tags": [], + "label": "KIBANA_PASSWORD", + "description": [], + "path": "x-pack/packages/kbn-synthetics-private-location/src/constants.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ] + } +} \ No newline at end of file diff --git a/api_docs/kbn_synthetics_private_location.mdx b/api_docs/kbn_synthetics_private_location.mdx new file mode 100644 index 0000000000000..ff2d0466de938 --- /dev/null +++ b/api_docs/kbn_synthetics_private_location.mdx @@ -0,0 +1,36 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnSyntheticsPrivateLocationPluginApi +slug: /kibana-dev-docs/api/kbn-synthetics-private-location +title: "@kbn/synthetics-private-location" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/synthetics-private-location plugin +date: 2024-08-12 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-private-location'] +--- +import kbnSyntheticsPrivateLocationObj from './kbn_synthetics_private_location.devdocs.json'; + + + +Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 19 | 0 | 19 | 0 | + +## Common + +### Objects + + +### Functions + + +### Interfaces + + diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 55443d5e20bdc..848b16c9576ff 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2024-08-08 +date: 2024-08-12 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 bb773205983e2..ad0ee15b3657a 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx index 8849b900ecab1..9d869ffadd86f 100644 --- a/api_docs/kbn_test_eui_helpers.mdx +++ b/api_docs/kbn_test_eui_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-eui-helpers title: "@kbn/test-eui-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-eui-helpers plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers'] --- import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index aa63c17a859bb..a6fb901e84fbf 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2024-08-08 +date: 2024-08-12 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 d44f7e1e72d7c..31b97258a046f 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2024-08-08 +date: 2024-08-12 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 f4f616919047b..e02b7a2789f14 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index b955552a4bc68..22cf52f1a1bdb 100644 --- a/api_docs/kbn_timerange.mdx +++ b/api_docs/kbn_timerange.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-timerange title: "@kbn/timerange" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/timerange plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/timerange'] --- import kbnTimerangeObj from './kbn_timerange.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 515767c2bde02..8fe978774e467 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2024-08-08 +date: 2024-08-12 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 6000486ec41e1..f01598f5a7d6c 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2024-08-08 +date: 2024-08-12 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_try_in_console.mdx b/api_docs/kbn_try_in_console.mdx index a7ea664586f4a..f2e072ddd177e 100644 --- a/api_docs/kbn_try_in_console.mdx +++ b/api_docs/kbn_try_in_console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-try-in-console title: "@kbn/try-in-console" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/try-in-console plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/try-in-console'] --- import kbnTryInConsoleObj from './kbn_try_in_console.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 6019e351ecb2c..9d0c5182a763b 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2024-08-08 +date: 2024-08-12 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 494cce9a2b37b..c1972868e3281 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2024-08-08 +date: 2024-08-12 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 590f740824a41..0b3eb5cfe6d5b 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2024-08-08 +date: 2024-08-12 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 6bea7d88435f3..1f0a30dec91e2 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2024-08-08 +date: 2024-08-12 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 1b487a89f29bf..79f186f1b6149 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2024-08-08 +date: 2024-08-12 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 70a60fabe0e0e..36510f942f316 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2024-08-08 +date: 2024-08-12 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 23c0a849e7305..22b1661510761 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2024-08-08 +date: 2024-08-12 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 f5585995ea34c..839f771997a25 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2024-08-08 +date: 2024-08-12 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 dba8d0e1c6c36..8c6ead945acc3 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_prompt.mdx b/api_docs/kbn_unsaved_changes_prompt.mdx index 1184618de6465..6b8e6dfd0ad27 100644 --- a/api_docs/kbn_unsaved_changes_prompt.mdx +++ b/api_docs/kbn_unsaved_changes_prompt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-prompt title: "@kbn/unsaved-changes-prompt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-prompt plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-prompt'] --- import kbnUnsavedChangesPromptObj from './kbn_unsaved_changes_prompt.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 9f5b88f3fe7c4..e8c3afe9b83b3 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2024-08-08 +date: 2024-08-12 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 fdf7c9c0821b6..3f5934d58bd29 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2024-08-08 +date: 2024-08-12 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 22fe3638109b3..df2b2d233bcdf 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2024-08-08 +date: 2024-08-12 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 4c92217fde3ad..16f9f6c0deb12 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2024-08-08 +date: 2024-08-12 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 9f72af7215f17..e13f2b74a8925 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2024-08-08 +date: 2024-08-12 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 d066d3c12f39a..2e8fe581ec063 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2024-08-08 +date: 2024-08-12 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 48fdc8ea7c184..3e4bfeaed3d03 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 253f1c414c92e..d20089748c5f2 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2024-08-08 +date: 2024-08-12 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 2d4ba03b6d2ec..5aed6c7e00117 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2024-08-08 +date: 2024-08-12 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.mdx b/api_docs/kbn_zod.mdx index 3113fa897f7bf..44ae6f4572aca 100644 --- a/api_docs/kbn_zod.mdx +++ b/api_docs/kbn_zod.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod title: "@kbn/zod" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod'] --- import kbnZodObj from './kbn_zod.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index aa5f1c4c6f77b..7f233c07c2043 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2024-08-08 +date: 2024-08-12 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 b6b25b7dec58e..423dee011f5e3 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2024-08-08 +date: 2024-08-12 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 75974d909acf5..7353453e6a028 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2024-08-08 +date: 2024-08-12 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 3d93f1a16183a..0290de3be8c85 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2024-08-08 +date: 2024-08-12 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 245c7ce391f44..8eaaf880bd656 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2024-08-08 +date: 2024-08-12 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 a67015d3e7aa4..05d285009bb05 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2024-08-08 +date: 2024-08-12 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 2f15b54f16f78..a65eb30b0a3aa 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2024-08-08 +date: 2024-08-12 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 dbca4e021fd73..4590bf38c766c 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2024-08-08 +date: 2024-08-12 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 95098191a82ae..dbf8ed5a10d81 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2024-08-08 +date: 2024-08-12 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 3fb1feaed3c47..82c6a06617ec6 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2024-08-08 +date: 2024-08-12 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 8689e19f3b26b..9d3f0abd2e75a 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_data_access.devdocs.json b/api_docs/logs_data_access.devdocs.json index 4098b0950c6f1..3255af872f573 100644 --- a/api_docs/logs_data_access.devdocs.json +++ b/api_docs/logs_data_access.devdocs.json @@ -2,7 +2,75 @@ "id": "logsDataAccess", "client": { "classes": [], - "functions": [], + "functions": [ + { + "parentPluginId": "logsDataAccess", + "id": "def-public.LogSourcesProvider", + "type": "Function", + "tags": [], + "label": "LogSourcesProvider", + "description": [], + "signature": [ + "React.FunctionComponent>" + ], + "path": "x-pack/plugins/observability_solution/logs_data_access/public/hooks/use_log_sources.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "logsDataAccess", + "id": "def-public.LogSourcesProvider.$1", + "type": "CompoundType", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "P & { children?: React.ReactNode; }" + ], + "path": "node_modules/@types/react/index.d.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "logsDataAccess", + "id": "def-public.LogSourcesProvider.$2", + "type": "Any", + "tags": [], + "label": "context", + "description": [], + "signature": [ + "any" + ], + "path": "node_modules/@types/react/index.d.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "logsDataAccess", + "id": "def-public.useLogSourcesContext", + "type": "Function", + "tags": [], + "label": "useLogSourcesContext", + "description": [], + "signature": [ + "() => { isUninitialized: boolean; isLoadingLogSources: boolean; hasFailedLoadingLogSources: boolean; logSourcesError: Error | undefined; logSources: ", + "LogSource", + "[]; combinedIndices: string; }" + ], + "path": "x-pack/plugins/observability_solution/logs_data_access/public/hooks/use_log_sources.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [], + "initialIsOpen": false + } + ], "interfaces": [], "enums": [], "misc": [], diff --git a/api_docs/logs_data_access.mdx b/api_docs/logs_data_access.mdx index ddd656d98573f..7577ce11cada6 100644 --- a/api_docs/logs_data_access.mdx +++ b/api_docs/logs_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsDataAccess title: "logsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the logsDataAccess plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsDataAccess'] --- import logsDataAccessObj from './logs_data_access.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 9 | 0 | 9 | 6 | +| 13 | 0 | 11 | 7 | ## Client @@ -31,6 +31,9 @@ Contact [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs- ### Start +### Functions + + ## Server ### Setup diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index b9b15ad1bd39c..53e7579c91098 100644 --- a/api_docs/logs_explorer.mdx +++ b/api_docs/logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsExplorer title: "logsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logsExplorer plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsExplorer'] --- import logsExplorerObj from './logs_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index ee624af4f8b1b..e4662b4a0b0b2 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2024-08-08 +date: 2024-08-12 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 9832b8c90b504..493a94b723bae 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2024-08-08 +date: 2024-08-12 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 0a4f9a2cabe26..df52de2c214b3 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2024-08-08 +date: 2024-08-12 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 8658b91a7f81c..c0712e5adc9c4 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2024-08-08 +date: 2024-08-12 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 0d2da80237b1b..1aa2668432686 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2024-08-08 +date: 2024-08-12 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 68b2be50e796e..ab3021b1db3ab 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2024-08-08 +date: 2024-08-12 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 193cbb48605fc..269fc67ef96d0 100644 --- a/api_docs/mock_idp_plugin.mdx +++ b/api_docs/mock_idp_plugin.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin title: "mockIdpPlugin" image: https://source.unsplash.com/400x175/?github description: API docs for the mockIdpPlugin plugin -date: 2024-08-08 +date: 2024-08-12 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 78365923fe83e..647e63a094437 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2024-08-08 +date: 2024-08-12 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 25295ffca87b5..42015f6914276 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2024-08-08 +date: 2024-08-12 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 ff5166a8b85c5..6632792c2b686 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2024-08-08 +date: 2024-08-12 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 d1dc0f3bad91d..9b6a661065ce4 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2024-08-08 +date: 2024-08-12 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 ced4481f4a592..a5858606adbf5 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2024-08-08 +date: 2024-08-12 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 b1fce344186ac..6088c5a442da5 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index 472391e133e2d..75b56890e1f3b 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -8722,10 +8722,10 @@ "signature": [ "{ [x: string]: { endpoint: string; params?: ", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.RouteParamsRT", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.RouteParamsRT", "text": "RouteParamsRT" }, " | undefined; handler: ({}: any) => Promise; } & Record; }" @@ -8861,7 +8861,13 @@ "text": "ObservabilityRouteCreateOptions" }, "; }[TEndpoint] extends { endpoint: any; params?: any; handler: ({}: any) => Promise; } & ", - "ServerRouteCreateOptions", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRouteCreateOptions", + "text": "ServerRouteCreateOptions" + }, " ? TReturnType extends ", { "pluginId": "@kbn/core-http-server", diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index a5cb3732f6cd5..039348bc8ac1c 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.devdocs.json b/api_docs/observability_a_i_assistant.devdocs.json index 65159e5b5d6a5..974d7df93c0fe 100644 --- a/api_docs/observability_a_i_assistant.devdocs.json +++ b/api_docs/observability_a_i_assistant.devdocs.json @@ -2052,10 +2052,10 @@ "signature": [ "(endpoint: TEndpoint, ...args: MaybeOptionalArgs<", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.ClientRequestParamsOf", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ClientRequestParamsOf", "text": "ClientRequestParamsOf" }, "<{ \"DELETE /internal/observability_ai_assistant/kb/entries/{entryId}\": { endpoint: \"DELETE /internal/observability_ai_assistant/kb/entries/{entryId}\"; params?: ", @@ -2712,10 +2712,10 @@ "ObservabilityAIAssistantRouteCreateOptions", "; }, TEndpoint> & Omit & { signal: AbortSignal | null; }>) => Promise<", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.ReturnOf", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ReturnOf", "text": "ReturnOf" }, "<{ \"DELETE /internal/observability_ai_assistant/kb/entries/{entryId}\": { endpoint: \"DELETE /internal/observability_ai_assistant/kb/entries/{entryId}\"; params?: ", @@ -3387,7 +3387,7 @@ "signature": [ "TEndpoint" ], - "path": "packages/kbn-server-route-repository/src/typings.ts", + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", "deprecated": false, "trackAdoption": false }, @@ -3402,31 +3402,31 @@ "RequiredKeys", "<", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.ClientRequestParamsOf", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ClientRequestParamsOf", "text": "ClientRequestParamsOf" }, " & TAdditionalClientOptions> extends never ? [] | [", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.ClientRequestParamsOf", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ClientRequestParamsOf", "text": "ClientRequestParamsOf" }, " & TAdditionalClientOptions] : [", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.ClientRequestParamsOf", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ClientRequestParamsOf", "text": "ClientRequestParamsOf" }, " & TAdditionalClientOptions]" ], - "path": "packages/kbn-server-route-repository/src/typings.ts", + "path": "packages/kbn-server-route-repository-utils/src/typings.ts", "deprecated": false, "trackAdoption": false } @@ -4646,7 +4646,13 @@ ">; } & ", "ObservabilityAIAssistantRouteCreateOptions", "; }[TEndpoint] extends { endpoint: any; params?: any; handler: ({}: any) => Promise; } & ", - "ServerRouteCreateOptions", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRouteCreateOptions", + "text": "ServerRouteCreateOptions" + }, " ? TReturnType extends ", { "pluginId": "@kbn/core-http-server", @@ -5539,20 +5545,26 @@ "ObservabilityAIAssistantRouteCreateOptions", "; }[TEndpoint] extends { endpoint: any; params?: infer TRouteParamsRT extends ", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.RouteParamsRT", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.RouteParamsRT", "text": "RouteParamsRT" }, " | undefined | undefined; handler: ({}: any) => Promise; } & ", - "ServerRouteCreateOptions", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRouteCreateOptions", + "text": "ServerRouteCreateOptions" + }, " ? TRouteParamsRT extends ", { - "pluginId": "@kbn/server-route-repository", - "scope": "server", - "docId": "kibKbnServerRouteRepositoryPluginApi", - "section": "def-server.RouteParamsRT", + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.RouteParamsRT", "text": "RouteParamsRT" }, " ? ClientRequestParamsOfType : {} : never" diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index dc7d5febf9597..433aeb7f1e9ff 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx index bff2968ffbe84..be8851be18bf0 100644 --- a/api_docs/observability_a_i_assistant_app.mdx +++ b/api_docs/observability_a_i_assistant_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistantApp title: "observabilityAIAssistantApp" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistantApp plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistantApp'] --- import observabilityAIAssistantAppObj from './observability_a_i_assistant_app.devdocs.json'; diff --git a/api_docs/observability_ai_assistant_management.mdx b/api_docs/observability_ai_assistant_management.mdx index 7ee81fde42030..d79951d56a9fd 100644 --- a/api_docs/observability_ai_assistant_management.mdx +++ b/api_docs/observability_ai_assistant_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAiAssistantManagement title: "observabilityAiAssistantManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAiAssistantManagement plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAiAssistantManagement'] --- import observabilityAiAssistantManagementObj from './observability_ai_assistant_management.devdocs.json'; diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx index ea89389c52fa2..cc02267b7482e 100644 --- a/api_docs/observability_logs_explorer.mdx +++ b/api_docs/observability_logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogsExplorer title: "observabilityLogsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogsExplorer plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer'] --- import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index b5a4c40daf7fc..61ec51f0841ca 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2024-08-08 +date: 2024-08-12 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 3f50d3fd415a0..3b9d19acd0295 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2024-08-08 +date: 2024-08-12 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 025a24c5e51fd..a7be8bc2add1a 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2024-08-08 +date: 2024-08-12 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 30bc08f8cc7a2..d5a3700ff48df 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2024-08-08 +date: 2024-08-12 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 95802ed12b23a..4d1fad01428c9 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,13 +15,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a
public API | Number of teams | |--------------|----------|------------------------| -| 828 | 704 | 45 | +| 830 | 706 | 45 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 51991 | 241 | 38932 | 1909 | +| 52071 | 241 | 39009 | 1918 | ## Plugin Directory @@ -34,7 +34,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 871 | 1 | 839 | 52 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | The user interface for Elastic APM | 29 | 0 | 29 | 119 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 74 | 0 | 74 | 1 | -| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 2 | 0 | 2 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 9 | 0 | 9 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Considering using bfetch capabilities when fetching large amounts of data. This services supports batching HTTP requests and streaming responses back. | 83 | 1 | 73 | 2 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds Canvas application to Kibana | 9 | 0 | 8 | 3 | @@ -50,7 +49,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | The cloud security posture plugin | 14 | 0 | 2 | 2 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 39 | 0 | 30 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Content management app | 149 | 0 | 125 | 6 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Controls Plugin contains embeddable components intended to create a simple query interface for end users, and a powerful editing suite that allows dashboard authors to build controls | 351 | 0 | 343 | 19 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Controls Plugin contains embeddable components intended to create a simple query interface for end users, and a powerful editing suite that allows dashboard authors to build controls | 380 | 0 | 371 | 27 | | crossClusterReplication | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 0 | 0 | 0 | 0 | | customBranding | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Enables customization of Kibana | 0 | 0 | 0 | 0 | | | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 271 | 0 | 252 | 1 | @@ -74,6 +73,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Extends embeddable plugin with more functionality | 19 | 0 | 19 | 2 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides encryption and decryption utilities for saved objects containing sensitive information. | 53 | 0 | 46 | 1 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Adds dashboards for discovering and managing Enterprise Search products. | 5 | 0 | 5 | 0 | +| | [@elastic/obs-entities](https://github.com/orgs/elastic/teams/obs-entities) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-entities](https://github.com/orgs/elastic/teams/obs-entities) | Entity manager plugin for entity assets (inventory, topology, etc) | 16 | 0 | 16 | 1 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 99 | 3 | 97 | 3 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 24 | 0 | 9 | 0 | @@ -122,7 +122,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-scalability](https://github.com/orgs/elastic/teams/security-scalability) | Plugin implementing the Integration Assistant API and UI | 47 | 0 | 40 | 3 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides UI and APIs for the interactive setup mode. | 28 | 0 | 18 | 0 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 105 | 0 | 105 | 6 | -| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 5 | 0 | 5 | 0 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 5 | 0 | 5 | 2 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 6 | 0 | 6 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 153 | 0 | 121 | 3 | | kibanaUsageCollection | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | @@ -134,7 +134,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 117 | 0 | 42 | 10 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | A dashboard panel for creating links to dashboards or external links. | 5 | 0 | 5 | 0 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 226 | 0 | 97 | 52 | -| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 9 | 0 | 9 | 6 | +| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 13 | 0 | 11 | 7 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin provides a LogsExplorer component using the Discover customization framework, offering several affordances specifically designed for log consumption. | 117 | 4 | 117 | 22 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | Exposes the shared components and APIs to access and visualize logs. | 300 | 0 | 272 | 32 | | logstash | [@elastic/logstash](https://github.com/orgs/elastic/teams/logstash) | - | 0 | 0 | 0 | 0 | @@ -249,7 +249,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 217 | 0 | 214 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 33 | 0 | 33 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 22 | 0 | 5 | 1 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 310 | 0 | 293 | 9 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 299 | 0 | 282 | 8 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 73 | 0 | 73 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 1 | 0 | 0 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 18 | 0 | 18 | 0 | @@ -484,7 +484,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 102 | 0 | 86 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 15 | 0 | 9 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 38 | 2 | 33 | 0 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 130 | 0 | 104 | 1 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 131 | 0 | 105 | 1 | | | [@elastic/docs](https://github.com/orgs/elastic/teams/docs) | - | 78 | 0 | 78 | 2 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 5 | 0 | 5 | 1 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 41 | 0 | 27 | 6 | @@ -493,7 +493,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 35 | 0 | 34 | 0 | | | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 156 | 0 | 130 | 9 | | | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 354 | 0 | 328 | 0 | -| | [@elastic/obs-entities](https://github.com/orgs/elastic/teams/obs-entities) | - | 26 | 0 | 26 | 0 | +| | [@elastic/obs-entities](https://github.com/orgs/elastic/teams/obs-entities) | - | 34 | 0 | 34 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 55 | 0 | 40 | 7 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 32 | 0 | 19 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 11 | 0 | 6 | 0 | @@ -550,7 +550,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 23 | 0 | 7 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 8 | 0 | 2 | 3 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 45 | 0 | 0 | 0 | -| | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 139 | 0 | 137 | 0 | +| | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 143 | 0 | 141 | 0 | | | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 20 | 0 | 11 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 88 | 0 | 10 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 56 | 0 | 6 | 0 | @@ -672,8 +672,9 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 120 | 0 | 116 | 0 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 51 | 0 | 46 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 69 | 0 | 64 | 0 | -| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 31 | 0 | 30 | 1 | -| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 5 | 0 | 5 | 0 | +| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 35 | 0 | 34 | 0 | +| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 3 | 0 | 3 | 0 | +| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 24 | 0 | 24 | 0 | | | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 1 | 0 | 1 | 0 | | | [@elastic/appex-sharedux @elastic/kibana-management @elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 1 | 0 | 1 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 10 | 0 | 7 | 1 | @@ -727,6 +728,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 4 | 0 | 2 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 41 | 2 | 21 | 0 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 32 | 2 | 32 | 0 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 19 | 0 | 19 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 5 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 315 | 4 | 267 | 14 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 36 | 0 | 18 | 0 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index 39f680b354142..02513dae57d5a 100644 --- a/api_docs/presentation_panel.mdx +++ b/api_docs/presentation_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationPanel title: "presentationPanel" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationPanel plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 9f2ec5fc497a5..00c933ab96eff 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2024-08-08 +date: 2024-08-12 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 c0f536704ca49..1db9ab875e444 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2024-08-08 +date: 2024-08-12 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 d26bbabd2ce07..eb301e8a88a31 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2024-08-08 +date: 2024-08-12 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 d63a01170e220..0835a57ca705f 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2024-08-08 +date: 2024-08-12 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 274439a9eed20..96ca789fe37e8 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2024-08-08 +date: 2024-08-12 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 3f8dbe1736cb1..4ff3fb361489f 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2024-08-08 +date: 2024-08-12 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 a6bcbd10bfe54..5812be13b7c8c 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2024-08-08 +date: 2024-08-12 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 898c63a048a6e..d92a74c4b6030 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2024-08-08 +date: 2024-08-12 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 3c200fdf07ef9..9bf39d40d3a84 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2024-08-08 +date: 2024-08-12 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 b3040b7273fca..64f32ae44bb4f 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2024-08-08 +date: 2024-08-12 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 910d4acc1d6f1..830b856e414c5 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2024-08-08 +date: 2024-08-12 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 bae1bce7bafda..4ac3bbe282cc3 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2024-08-08 +date: 2024-08-12 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 b30d6fb256995..f7dedba4a124c 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2024-08-08 +date: 2024-08-12 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 86c92cb9a8bb2..4abad408a03c7 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2024-08-08 +date: 2024-08-12 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 10cf5df7a0190..e41bfa59d05bb 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2024-08-08 +date: 2024-08-12 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 0044c885eb623..0d774753dd538 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index aea1b99981212..8c5c310066699 100644 --- a/api_docs/search_connectors.mdx +++ b/api_docs/search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchConnectors title: "searchConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the searchConnectors plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_homepage.mdx b/api_docs/search_homepage.mdx index bbe352871685e..6b6f81be203da 100644 --- a/api_docs/search_homepage.mdx +++ b/api_docs/search_homepage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchHomepage title: "searchHomepage" image: https://source.unsplash.com/400x175/?github description: API docs for the searchHomepage plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchHomepage'] --- import searchHomepageObj from './search_homepage.devdocs.json'; diff --git a/api_docs/search_inference_endpoints.mdx b/api_docs/search_inference_endpoints.mdx index 924dfac2865c4..d99e701e236d8 100644 --- a/api_docs/search_inference_endpoints.mdx +++ b/api_docs/search_inference_endpoints.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchInferenceEndpoints title: "searchInferenceEndpoints" image: https://source.unsplash.com/400x175/?github description: API docs for the searchInferenceEndpoints plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchInferenceEndpoints'] --- import searchInferenceEndpointsObj from './search_inference_endpoints.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index 2e0ad8d29c6f6..5a42540a26458 100644 --- a/api_docs/search_notebooks.mdx +++ b/api_docs/search_notebooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchNotebooks title: "searchNotebooks" image: https://source.unsplash.com/400x175/?github description: API docs for the searchNotebooks plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks'] --- import searchNotebooksObj from './search_notebooks.devdocs.json'; diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx index e5770230187d0..2d81c7a40819b 100644 --- a/api_docs/search_playground.mdx +++ b/api_docs/search_playground.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchPlayground title: "searchPlayground" image: https://source.unsplash.com/400x175/?github description: API docs for the searchPlayground plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index c000c37ab9a59..22a17fcc343af 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json index fef443a955c1e..184c86f6a708c 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -485,7 +485,7 @@ "\nExperimental flag needed to enable the link" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"assistantBedrockChat\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"assistantBedrockChat\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -565,7 +565,7 @@ "\nExperimental flag needed to disable the link. Opposite of experimentalKey" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"assistantBedrockChat\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"assistantBedrockChat\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -1931,7 +1931,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly assistantBedrockChat: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly assistantBedrockChat: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -3082,7 +3082,7 @@ "\nThe security solution generic experimental features" ], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly assistantBedrockChat: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly assistantBedrockChat: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/server/plugin_contract.ts", "deprecated": false, @@ -3258,7 +3258,7 @@ "label": "ExperimentalFeatures", "description": [], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly assistantBedrockChat: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly assistantBedrockChat: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, @@ -3324,7 +3324,7 @@ "\nA list of allowed values that can be used in `xpack.securitySolution.enableExperimental`.\nThis object is then used to validate and parse the value entered." ], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionsEnabled: true; readonly endpointResponseActionsEnabled: true; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: true; readonly responseActionsSentinelOneKillProcessEnabled: false; readonly responseActionsSentinelOneProcessesEnabled: false; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: true; readonly responseActionScanEnabled: false; readonly securitySolutionNotesEnabled: false; readonly entityAlertPreviewDisabled: false; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly assistantBedrockChat: true; readonly newUserDetailsFlyoutManagedUser: false; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: true; readonly jamfDataInAnalyzerEnabled: false; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineDisabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly prebuiltRulesCustomizationEnabled: false; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: true; readonly valueListItemsModalEnabled: true; readonly manualRuleRunEnabled: false; readonly filterProcessDescendantsForEventFiltersEnabled: false; readonly dataIngestionHubEnabled: false; }" + "{ readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: true; readonly responseActionsSentinelOneKillProcessEnabled: false; readonly responseActionsSentinelOneProcessesEnabled: false; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: true; readonly responseActionScanEnabled: true; readonly securitySolutionNotesEnabled: false; readonly entityAlertPreviewDisabled: false; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly assistantBedrockChat: true; readonly newUserDetailsFlyoutManagedUser: false; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: true; readonly jamfDataInAnalyzerEnabled: false; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineDisabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly prebuiltRulesCustomizationEnabled: false; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: true; readonly valueListItemsModalEnabled: true; readonly manualRuleRunEnabled: false; readonly filterProcessDescendantsForEventFiltersEnabled: true; readonly dataIngestionHubEnabled: false; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index faac33f2f5eb7..4ddbc85270121 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2024-08-08 +date: 2024-08-12 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 211066386212f..af38a1a660c98 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2024-08-08 +date: 2024-08-12 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 7e9da161c7c43..696c7d2c6ff57 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2024-08-08 +date: 2024-08-12 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 280f36400d10e..9c3e3e11eee64 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2024-08-08 +date: 2024-08-12 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 f25512f73e45d..72f18dc7055a2 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2024-08-08 +date: 2024-08-12 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 38c2c94000c5e..c6ea3565cac86 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2024-08-08 +date: 2024-08-12 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 7472f66790dec..4a02108dccd22 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2024-08-08 +date: 2024-08-12 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 f36058b2be1d4..c19dca3c1152c 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx index 7de0907e55c0f..657c99782443c 100644 --- a/api_docs/slo.mdx +++ b/api_docs/slo.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/slo title: "slo" image: https://source.unsplash.com/400x175/?github description: API docs for the slo plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo'] --- import sloObj from './slo.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 071acbb356988..2399ccc4a2474 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2024-08-08 +date: 2024-08-12 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 cf39690fd8e55..96924884591b8 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2024-08-08 +date: 2024-08-12 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 b71a7ae4c36af..e2503bd40b6c6 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2024-08-08 +date: 2024-08-12 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 f2020c9c0d8d9..881a3500b5346 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2024-08-08 +date: 2024-08-12 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 c8ec229776f2a..eadd886a53d12 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2024-08-08 +date: 2024-08-12 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 1a006ed707680..d10e614ddd448 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2024-08-08 +date: 2024-08-12 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 1f04de17c164d..b8fc2e5e31b19 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2024-08-08 +date: 2024-08-12 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 1c66d152df6eb..de03f32aef554 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2024-08-08 +date: 2024-08-12 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 88daa1085358e..6490952b00ea1 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 0a3d44483ccac..305996525b254 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: 2024-08-08 +date: 2024-08-12 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 ffaa53d997ba5..17ffcf19d6728 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2024-08-08 +date: 2024-08-12 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 78a08c46494e0..e723c6aa211a8 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2024-08-08 +date: 2024-08-12 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 846fa43855ed7..b3f11b82d2942 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2024-08-08 +date: 2024-08-12 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 14faecc1b008b..ec2671e868acc 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2024-08-08 +date: 2024-08-12 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 0b656b0223982..e604b6418d674 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2024-08-08 +date: 2024-08-12 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 0341174380b36..e03e4491d714d 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2024-08-08 +date: 2024-08-12 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 27d6c562fe7ad..046c4a331601e 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2024-08-08 +date: 2024-08-12 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 3ab0dcf1e5403..47d0ce8c5f94e 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2024-08-08 +date: 2024-08-12 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 d3a8e4d5f3648..8e931d49aabcd 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2024-08-08 +date: 2024-08-12 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 23c1e763645f7..428abe7c2493f 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2024-08-08 +date: 2024-08-12 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 361f67a81f9cc..bd75332ad8b20 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2024-08-08 +date: 2024-08-12 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 ff05a389ec2c2..4add15065d1b1 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2024-08-08 +date: 2024-08-12 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 de09b62ae5c0e..7260cdf7118e3 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2024-08-08 +date: 2024-08-12 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 31bba38b5475e..e08b8a653f2fe 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2024-08-08 +date: 2024-08-12 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 030603954b21d..eae6191c4b222 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2024-08-08 +date: 2024-08-12 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 20bf2f6a0cc9d..0b18b906a46fe 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2024-08-08 +date: 2024-08-12 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 32010837ac2c4..b1ee21dadc1f2 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2024-08-08 +date: 2024-08-12 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 d7253de28fcf6..20dc20b6673f7 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2024-08-08 +date: 2024-08-12 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 aa19fda274b2e..80147d0cd8f5e 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2024-08-08 +date: 2024-08-12 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 d7f05ff1044fb..c106cfa735c76 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2024-08-08 +date: 2024-08-12 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 f3c76f010502f..d9bf6484d7890 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2024-08-08 +date: 2024-08-12 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 304a8c1ea8b4f..65633d1ca9435 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2024-08-08 +date: 2024-08-12 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 13c1fa62e1f10..0b768566f4767 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.devdocs.json b/api_docs/visualizations.devdocs.json index 0a4684c1fb556..47f45c79e7b3c 100644 --- a/api_docs/visualizations.devdocs.json +++ b/api_docs/visualizations.devdocs.json @@ -6870,31 +6870,7 @@ "section": "def-public.ContainerOutput", "text": "ContainerOutput" }, - "> | undefined; canLinkToLibrary: (() => Promise) | undefined; canUnlinkFromLibrary: (() => Promise) | undefined; parentApi: (", - { - "pluginId": "@kbn/presentation-containers", - "scope": "public", - "docId": "kibKbnPresentationContainersPluginApi", - "section": "def-public.PresentationContainer", - "text": "PresentationContainer" - }, - " & Partial & ", - { - "pluginId": "@kbn/presentation-publishing", - "scope": "public", - "docId": "kibKbnPresentationPublishingPluginApi", - "section": "def-public.PublishesViewMode", - "text": "PublishesViewMode" - }, - ">) | undefined; hidePanelTitle: ", + "> | undefined; hidePanelTitle: ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -6958,7 +6934,31 @@ "section": "def-public.PublishingSubject", "text": "PublishingSubject" }, - "; timeRange$: ", + "; parentApi: (", + { + "pluginId": "@kbn/presentation-containers", + "scope": "public", + "docId": "kibKbnPresentationContainersPluginApi", + "section": "def-public.PresentationContainer", + "text": "PresentationContainer" + }, + " & Partial & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesViewMode", + "text": "PublishesViewMode" + }, + ">) | undefined; canLinkToLibrary: (() => Promise) | undefined; canUnlinkFromLibrary: (() => Promise) | undefined; timeRange$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index a51fec67c7dda..daff9ebc9e83d 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2024-08-08 +date: 2024-08-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/docs/management/advanced-options.asciidoc b/docs/management/advanced-options.asciidoc index 4a88d33c83e5d..3e8cc1e8b109b 100644 --- a/docs/management/advanced-options.asciidoc +++ b/docs/management/advanced-options.asciidoc @@ -209,7 +209,7 @@ The default refresh interval for the time filter. Example: The default selection in the time filter. [[truncate-maxheight]]`truncate:maxHeight`:: -The maximum height that a cell occupies in a table. Set to 0 to disable +deprecated:[8.16.0]The maximum height that a cell occupies in a table. Set to 0 to disable truncation. [[enableESQL]]`enableESQL`:: diff --git a/docs/siem/index.asciidoc b/docs/siem/index.asciidoc index e795d7456417d..06d9097dcc5dc 100644 --- a/docs/siem/index.asciidoc +++ b/docs/siem/index.asciidoc @@ -6,159 +6,5 @@ Security ++++ -https://www.elastic.co/security[Elastic Security] combines SIEM threat detection features with endpoint -prevention and response capabilities in one solution. These analytical and -protection capabilities, leveraged by the speed and extensibility of -Elasticsearch, enable analysts to defend their organization from threats before -damage and loss occur. +Elastic Security combines threat detection analytics, cloud native security, and endpoint protection capabilities in a single solution, so you can quickly detect, investigate, and respond to threats and vulnerabilities across your environment. To learn more about how {elastic-sec} works and what it offers, refer to the {security-guide}/es-overview.html[documentation]. -Elastic Security provides the following security benefits and capabilities: - -* A detection engine to identify attacks and system misconfigurations -* A workspace for event triage and investigations -* Interactive visualizations to investigate process relationships -* Inbuilt case management with automated actions -* Detection of signatureless attacks with prebuilt machine learning anomaly jobs -and detection rules - -[discrete] -== Elastic Security components and workflow - -The following diagram provides a comprehensive illustration of the Elastic Security workflow. - -[role="screenshot"] -image::images/workflow.png[] - -Here's an overview of the flow and its components: - -* Data is shipped from your hosts to {es} via beat modules and the Elastic https://www.elastic.co/endpoint-security/[Endpoint Security agent integration]. This integration provides capabilities such as collecting events, detecting and preventing {security-guide}/detection-engine-overview.html#malware-prevention[malicious activity], and artifact delivery. The {fleet-guide}/fleet-overview.html[{fleet}] app is used to -install and manage agents and integrations on your hosts. -+ -The Endpoint Security integration ships the following data sets: -+ -*** *Windows*: Process, network, file, DNS, registry, DLL and driver loads, -malware security detections -*** *Linux/macOS*: Process, network, file -+ -* https://www.elastic.co/integrations?solution=security[Beat modules]: {beats} -are lightweight data shippers. Beat modules provide a way of collecting and -parsing specific data sets from common sources, such as cloud and OS events, -logs, and metrics. Common security-related modules are listed {security-guide}/ingest-data.html#enable-beat-modules[here]. -* The {security-app} in {kib} is used to manage the *Detection engine*, -*Cases*, and *Timeline*, as well as administer hosts running Endpoint Security: -** Detection engine: Automatically searches for suspicious host and network -activity via the following: -*** {security-guide}/detection-engine-overview.html#detection-engine-overview[Detection rules]: Periodically search the data -({es} indices) sent from your hosts for suspicious events. When a suspicious -event is discovered, a detection alert is generated. External systems, such as -Slack and email, can be used to send notifications when alerts are generated. -You can create your own rules and make use of our {security-guide}/prebuilt-rules.html[prebuilt ones]. -*** {security-guide}/detections-ui-exceptions.html[Exceptions]: Reduce noise and the number of -false positives. Exceptions are associated with rules and prevent alerts when -an exception's conditions are met. *Value lists* contain source event -values that can be used as part of an exception's conditions. When -Elastic {endpoint-sec} is installed on your hosts, you can add malware exceptions -directly to the endpoint from the Security app. -*** {security-guide}/machine-learning.html#included-jobs[{ml-cap} jobs]: Automatic anomaly detection of host and -network events. Anomaly scores are provided per host and can be used with -detection rules. -** {security-guide}/timelines-ui.html[Timeline]: Workspace for investigating alerts and events. -Timelines use queries and filters to drill down into events related to -a specific incident. Timeline templates are attached to rules and use predefined -queries when alerts are investigated. Timelines can be saved and shared with -others, as well as attached to Cases. -** {security-guide}/cases-overview.html[Cases]: An internal system for opening, tracking, and sharing -security issues directly in the Security app. Cases can be integrated with -external ticketing systems. -** {security-guide}/admin-page-ov.html[Administration]: View and manage hosts running {endpoint-sec}. - -{security-guide}/ingest-data.html[Ingest data to Elastic Security] and {security-guide}/install-endpoint.html[Configure and install the Elastic Endpoint integration] describe how to ship security-related -data to {es}. - - -For more background information, see: - -* https://www.elastic.co/products/elasticsearch[{es}]: A real-time, -distributed storage, search, and analytics engine. {es} excels at indexing -streams of semi-structured data, such as logs or metrics. -* https://www.elastic.co/products/kibana[{kib}]: An open-source analytics and -visualization platform designed to work with {es}. You use {kib} to search, -view, and interact with data stored in {es} indices. You can easily compile -advanced data analysis and visualize your data in a variety of charts, tables, -and maps. - -[discrete] -=== Compatibility with cold tier nodes - -Cold tier is a {ref}/data-tiers.html[data tier] that holds time-series data that is accessed only occasionally. In {stack} version >=7.11.0, {elastic-sec} supports cold tier data for the following {es} indices: - -* Index patterns specified in `securitySolution:defaultIndex` -* Index patterns specified in the definitions of detection rules, except for indicator match rules -* Index patterns specified in the data sources selector on various {security-app} pages - -{elastic-sec} does NOT support cold tier data for the following {es} indices: - -* Index patterns controlled by {elastic-sec}, including signals and list indices -* Index patterns specified in indicator match rules - -Using cold tier data for unsupported indices may result in detection rule timeouts and overall performance degradation. - -[discrete] -[[self-protection]] -==== Elastic Endpoint self-protection - -Self-protection means that {elastic-endpoint} has guards against users and attackers that may try to interfere with its functionality. This protection feature is consistently enhanced to prevent attackers who may attempt to use newer, more sophisticated tactics to interfere with the {elastic-endpoint}. Self-protection is enabled by default when {elastic-endpoint} installs on supported platforms, listed below. - -Self-protection is enabled on the following 64-bit Windows versions: - -* Windows 8.1 -* Windows 10 -* Windows Server 2012 R2 -* Windows Server 2016 -* Windows Server 2019 - -And on the following macOS versions: - -* macOS 10.15 (Catalina) -* macOS 11 (Big Sur) - -NOTE: Other Windows and macOS variants (and all Linux distributions) do not have self-protection. - -For {stack} version >= 7.11.0, self-protection defines the following permissions: - -* Users -- even Administrator/root -- *cannot* delete {elastic-endpoint} files (located at `c:\Program Files\Elastic\Endpoint` on Windows, and `/Library/Elastic/Endpoint` on macOS). -* Users *cannot* terminate the {elastic-endpoint} program or service. -* Administrator/root users *can* read the endpoint's files. On Windows, the easiest way to read Endpoint files is to start an Administrator `cmd.exe` prompt. On macOS, an Administrator can use the `sudo` command. -* Administrator/root users *can* stop the {elastic-agent}'s service. On Windows, run the `sc stop "Elastic Agent"` command. On macOS, run the `sudo launchctl stop elastic-agent` command. - - -[discrete] -[[siem-integration]] -=== Integration with other Elastic products - -You can use {elastic-sec} with other Elastic products and features to help you -identify and investigate suspicious activity: - -* https://www.elastic.co/products/stack/machine-learning[{ml-cap}] -* https://www.elastic.co/products/stack/alerting[Alerting] -* https://www.elastic.co/products/stack/canvas[Canvas] - -[discrete] -[[data-sources]] -=== APM transaction data sources - -By default, {elastic-sec} monitors {observability-guide}/apm.html[APM] -`apm-*-transaction*` indices. To add additional APM indices, update the -index patterns in the `securitySolution:defaultIndex` setting ({kib} -> Stack Management -> Advanced Settings -> `securitySolution:defaultIndex`). - -[discrete] -[[ecs-compliant-reqs]] -=== ECS compliance data requirements - -The {ecs-ref}[Elastic Common Schema (ECS)] defines a common set of fields used for -storing event data in Elasticsearch. ECS helps users normalize their event data -to better analyze, visualize, and correlate the data represented in their -events. {elastic-sec} supports events and indicator index data from any ECS-compliant data source. - -IMPORTANT: {elastic-sec} requires {ecs-ref}[ECS-compliant data]. If you use third-party data collectors to ship data to {es}, the data must be mapped to ECS. -{security-guide}/siem-field-reference.html[Elastic Security ECS field reference] lists ECS fields used in {elastic-sec}. diff --git a/examples/controls_example/common/options_list/ip_search.test.ts b/examples/controls_example/common/options_list/ip_search.test.ts deleted file mode 100644 index 1c935b1875311..0000000000000 --- a/examples/controls_example/common/options_list/ip_search.test.ts +++ /dev/null @@ -1,129 +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 { getIpRangeQuery, getIpSegments, getMinMaxIp } from './ip_search'; - -describe('test IP search functionality', () => { - test('get IP segments', () => { - expect(getIpSegments('')).toStrictEqual({ segments: [''], type: 'unknown' }); - expect(getIpSegments('test')).toStrictEqual({ segments: ['test'], type: 'unknown' }); - expect(getIpSegments('123.456')).toStrictEqual({ segments: ['123', '456'], type: 'ipv4' }); - expect(getIpSegments('123..456...')).toStrictEqual({ segments: ['123', '456'], type: 'ipv4' }); - expect(getIpSegments('abc:def:')).toStrictEqual({ segments: ['abc', 'def'], type: 'ipv6' }); - expect(getIpSegments(':::x:::abc:::def:::')).toStrictEqual({ - segments: ['x', 'abc', 'def'], - type: 'ipv6', - }); - }); - - test('get min/max IP', () => { - expect(getMinMaxIp('ipv4', ['123'])).toStrictEqual({ - min: '123.0.0.0', - max: '123.255.255.255', - }); - expect(getMinMaxIp('ipv4', ['123', '456', '789'])).toStrictEqual({ - min: '123.456.789.0', - max: '123.456.789.255', - }); - expect(getMinMaxIp('ipv6', ['abc', 'def'])).toStrictEqual({ - min: 'abc:def::', - max: 'abc:def:ffff:ffff:ffff:ffff:ffff:ffff', - }); - expect(getMinMaxIp('ipv6', ['a', 'b', 'c', 'd', 'e', 'f', 'g'])).toStrictEqual({ - min: 'a:b:c:d:e:f:g::', - max: 'a:b:c:d:e:f:g:ffff', - }); - }); - - test('get IP range query', () => { - // invalid searches - expect(getIpRangeQuery('xyz')).toStrictEqual({ - validSearch: false, - }); - expect(getIpRangeQuery('123.456.OVER 9000')).toStrictEqual({ - validSearch: false, - }); - expect(getIpRangeQuery('abc:def:ghi')).toStrictEqual({ - validSearch: false, - }); - - // full IP searches - expect(getIpRangeQuery('1.2.3.4')).toStrictEqual({ - validSearch: true, - rangeQuery: [ - { - key: 'ipv4', - mask: '1.2.3.4/32', - }, - ], - }); - expect(getIpRangeQuery('1.2.3.256')).toStrictEqual({ - validSearch: false, - rangeQuery: undefined, - }); - expect(getIpRangeQuery('fbbe:a363:9e14:987c:49cf:d4d0:d8c8:bc42')).toStrictEqual({ - validSearch: true, - rangeQuery: [ - { - key: 'ipv6', - mask: 'fbbe:a363:9e14:987c:49cf:d4d0:d8c8:bc42/128', - }, - ], - }); - - // partial IP searches - ipv4 - const partialIpv4 = getIpRangeQuery('12.34.'); - expect(partialIpv4.validSearch).toBe(true); - expect(partialIpv4.rangeQuery?.[0]).toStrictEqual({ - key: 'ipv4', - from: '12.34.0.0', - to: '12.34.255.255', - }); - expect(getIpRangeQuery('123.456.7')).toStrictEqual({ - validSearch: false, - rangeQuery: [], - }); - expect(getIpRangeQuery('12:34.56')).toStrictEqual({ - validSearch: false, - rangeQuery: [], - }); - - // partial IP searches - ipv6 - const partialIpv6 = getIpRangeQuery('fbbe:a363:9e14:987c:49cf'); - expect(partialIpv6.validSearch).toBe(true); - expect(partialIpv6.rangeQuery?.[0]).toStrictEqual({ - key: 'ipv6', - from: 'fbbe:a363:9e14:987c:49cf::', - to: 'fbbe:a363:9e14:987c:49cf:ffff:ffff:ffff', - }); - - // partial IP searches - unknown type - let partialUnknownIp = getIpRangeQuery('1234'); - expect(partialUnknownIp.validSearch).toBe(true); - expect(partialUnknownIp.rangeQuery?.length).toBe(1); - expect(partialUnknownIp.rangeQuery?.[0]).toStrictEqual({ - key: 'ipv6', - from: '1234::', - to: '1234:ffff:ffff:ffff:ffff:ffff:ffff:ffff', - }); - - partialUnknownIp = getIpRangeQuery('123'); - expect(partialUnknownIp.validSearch).toBe(true); - expect(partialUnknownIp.rangeQuery?.length).toBe(2); - expect(partialUnknownIp.rangeQuery?.[0]).toStrictEqual({ - key: 'ipv4', - from: '123.0.0.0', - to: '123.255.255.255', - }); - expect(partialUnknownIp.rangeQuery?.[1]).toStrictEqual({ - key: 'ipv6', - from: '123::', - to: '123:ffff:ffff:ffff:ffff:ffff:ffff:ffff', - }); - }); -}); diff --git a/examples/controls_example/common/options_list/ip_search.ts b/examples/controls_example/common/options_list/ip_search.ts deleted file mode 100644 index 565c2ed2a1df6..0000000000000 --- a/examples/controls_example/common/options_list/ip_search.ts +++ /dev/null @@ -1,122 +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 ipaddr from 'ipaddr.js'; - -export interface IpRangeQuery { - validSearch: boolean; - rangeQuery?: Array<{ key: string; from: string; to: string } | { key: string; mask: string }>; -} -interface IpSegments { - segments: string[]; - type: 'ipv4' | 'ipv6' | 'unknown'; -} - -export const getIsValidFullIp = (searchString: string) => { - return ipaddr.IPv4.isValidFourPartDecimal(searchString) || ipaddr.IPv6.isValid(searchString); -}; - -export const getIpSegments = (searchString: string): IpSegments => { - if (searchString.indexOf('.') !== -1) { - // ipv4 takes priority - so if search string contains both `.` and `:` then it will just be an invalid ipv4 search - const ipv4Segments = searchString.split('.').filter((segment) => segment !== ''); - return { segments: ipv4Segments, type: 'ipv4' }; - } else if (searchString.indexOf(':') !== -1) { - // note that currently, because of the logic of splitting here, searching for shorthand IPv6 IPs is not supported (for example, - // must search for `59fb:0:0:0:0:1005:cc57:6571` and not `59fb::1005:cc57:6571` to get the expected match) - const ipv6Segments = searchString.split(':').filter((segment) => segment !== ''); - return { segments: ipv6Segments, type: 'ipv6' }; - } - return { segments: [searchString], type: 'unknown' }; -}; - -export const getMinMaxIp = ( - type: 'ipv4' | 'ipv6', - segments: IpSegments['segments'] -): { min: string; max: string } => { - const isIpv4 = type === 'ipv4'; - const minIp = isIpv4 - ? segments.concat(Array(4 - segments.length).fill('0')).join('.') - : segments.join(':') + '::'; - const maxIp = isIpv4 - ? segments.concat(Array(4 - segments.length).fill('255')).join('.') - : segments.concat(Array(8 - segments.length).fill('ffff')).join(':'); - return { - min: minIp, - max: maxIp, - }; -}; - -const buildFullIpSearchRangeQuery = (segments: IpSegments): IpRangeQuery['rangeQuery'] => { - const { type: ipType, segments: ipSegments } = segments; - - const isIpv4 = ipType === 'ipv4'; - const searchIp = ipSegments.join(isIpv4 ? '.' : ':'); - if (ipaddr.isValid(searchIp)) { - return [ - { - key: ipType, - mask: isIpv4 ? searchIp + '/32' : searchIp + '/128', - }, - ]; - } - return undefined; -}; - -const buildPartialIpSearchRangeQuery = (segments: IpSegments): IpRangeQuery['rangeQuery'] => { - const { type: ipType, segments: ipSegments } = segments; - - const ranges = []; - if (ipType === 'unknown' || ipType === 'ipv4') { - const { min: minIpv4, max: maxIpv4 } = getMinMaxIp('ipv4', ipSegments); - - if (ipaddr.isValid(minIpv4) && ipaddr.isValid(maxIpv4)) { - ranges.push({ - key: 'ipv4', - from: minIpv4, - to: maxIpv4, - }); - } - } - - if (ipType === 'unknown' || ipType === 'ipv6') { - const { min: minIpv6, max: maxIpv6 } = getMinMaxIp('ipv6', ipSegments); - - if (ipaddr.isValid(minIpv6) && ipaddr.isValid(maxIpv6)) { - ranges.push({ - key: 'ipv6', - from: minIpv6, - to: maxIpv6, - }); - } - } - - return ranges; -}; - -export const getIpRangeQuery = (searchString: string): IpRangeQuery => { - if (searchString.match(/^[A-Fa-f0-9.:]*$/) === null) { - return { validSearch: false }; - } - - const ipSegments = getIpSegments(searchString); - if (ipSegments.type === 'ipv4' && ipSegments.segments.length === 4) { - const ipv4RangeQuery = buildFullIpSearchRangeQuery(ipSegments); - return { validSearch: Boolean(ipv4RangeQuery), rangeQuery: ipv4RangeQuery }; - } - if (ipSegments.type === 'ipv6' && ipSegments.segments.length === 8) { - const ipv6RangeQuery = buildFullIpSearchRangeQuery(ipSegments); - return { validSearch: Boolean(ipv6RangeQuery), rangeQuery: ipv6RangeQuery }; - } - - const partialRangeQuery = buildPartialIpSearchRangeQuery(ipSegments); - return { - validSearch: !(partialRangeQuery?.length === 0), - rangeQuery: partialRangeQuery, - }; -}; diff --git a/examples/controls_example/common/options_list/suggestions_searching.test.ts b/examples/controls_example/common/options_list/suggestions_searching.test.ts deleted file mode 100644 index fc78b3f97440d..0000000000000 --- a/examples/controls_example/common/options_list/suggestions_searching.test.ts +++ /dev/null @@ -1,118 +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 { isValidSearch } from './suggestions_searching'; - -describe('test validity of search strings', () => { - describe('number field', () => { - it('valid search - basic integer', () => { - expect(isValidSearch({ searchString: '123', fieldType: 'number' })).toBe(true); - }); - - it('valid search - floating point number', () => { - expect(isValidSearch({ searchString: '12.34', fieldType: 'number' })).toBe(true); - }); - - it('valid search - negative number', () => { - expect(isValidSearch({ searchString: '-42', fieldType: 'number' })).toBe(true); - }); - - it('invalid search - invalid character search string', () => { - expect(isValidSearch({ searchString: '1!a23', fieldType: 'number' })).toBe(false); - }); - }); - - // we do not currently support searching date fields, so they will always be invalid - describe('date field', () => { - it('invalid search - formatted date', () => { - expect(isValidSearch({ searchString: 'December 12, 2023', fieldType: 'date' })).toBe(false); - }); - - it('invalid search - invalid character search string', () => { - expect(isValidSearch({ searchString: '!!12/12/23?', fieldType: 'date' })).toBe(false); - }); - }); - - // only testing exact match validity here - the remainder of testing is covered by ./ip_search.test.ts - describe('ip field', () => { - it('valid search - ipv4', () => { - expect( - isValidSearch({ - searchString: '1.2.3.4', - fieldType: 'ip', - searchTechnique: 'exact', - }) - ).toBe(true); - }); - - it('valid search - full ipv6', () => { - expect( - isValidSearch({ - searchString: 'fbbe:a363:9e14:987c:49cf:d4d0:d8c8:bc42', - fieldType: 'ip', - searchTechnique: 'exact', - }) - ).toBe(true); - }); - - it('valid search - partial ipv6', () => { - expect( - isValidSearch({ - searchString: 'fbbe:a363::', - fieldType: 'ip', - searchTechnique: 'exact', - }) - ).toBe(true); - }); - - it('invalid search - invalid character search string', () => { - expect( - isValidSearch({ - searchString: '!!123.abc?', - fieldType: 'ip', - searchTechnique: 'exact', - }) - ).toBe(false); - }); - - it('invalid search - ipv4', () => { - expect( - isValidSearch({ - searchString: '1.2.3.256', - fieldType: 'ip', - searchTechnique: 'exact', - }) - ).toBe(false); - }); - - it('invalid search - ipv6', () => { - expect( - isValidSearch({ - searchString: '::fbbe:a363::', - fieldType: 'ip', - searchTechnique: 'exact', - }) - ).toBe(false); - }); - }); - - // string field searches can never be invalid - describe('string field', () => { - it('valid search - basic search string', () => { - expect(isValidSearch({ searchString: 'abc', fieldType: 'string' })).toBe(true); - }); - - it('valid search - numeric search string', () => { - expect(isValidSearch({ searchString: '123', fieldType: 'string' })).toBe(true); - }); - - it('valid search - complex search string', () => { - expect(isValidSearch({ searchString: '!+@abc*&[]', fieldType: 'string' })).toBe(true); - }); - }); -}); diff --git a/examples/controls_example/common/options_list/suggestions_searching.ts b/examples/controls_example/common/options_list/suggestions_searching.ts deleted file mode 100644 index c4b115e659b0c..0000000000000 --- a/examples/controls_example/common/options_list/suggestions_searching.ts +++ /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 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 { getIpRangeQuery, getIsValidFullIp } from './ip_search'; - -export type OptionsListSearchTechnique = 'prefix' | 'wildcard' | 'exact'; - -export const getDefaultSearchTechnique = (type: string): OptionsListSearchTechnique | undefined => { - const compatibleSearchTechniques = getCompatibleSearchTechniques(type); - return compatibleSearchTechniques.length > 0 ? compatibleSearchTechniques[0] : undefined; -}; - -export const getCompatibleSearchTechniques = (type?: string): OptionsListSearchTechnique[] => { - switch (type) { - case 'string': { - return ['prefix', 'wildcard', 'exact']; - } - case 'ip': { - return ['prefix', 'exact']; - } - case 'number': { - return ['exact']; - } - default: { - return []; - } - } -}; - -export const isValidSearch = ({ - searchString, - fieldType, - searchTechnique, -}: { - searchString?: string; - fieldType?: string; - searchTechnique?: OptionsListSearchTechnique; -}): boolean => { - if (!searchString || searchString.length === 0) return true; - - switch (fieldType) { - case 'number': { - return !isNaN(Number(searchString)); - } - case 'date': { - /** searching is not currently supported for date fields */ - return false; - } - case 'ip': { - if (searchTechnique === 'exact') { - /** - * exact match searching will throw an error if the search string isn't a **full** IP, - * so we need a slightly different validity check here than for other search techniques - */ - return getIsValidFullIp(searchString); - } - return getIpRangeQuery(searchString).validSearch; - } - default: { - /** string searches are always considered to be valid */ - return true; - } - } -}; diff --git a/examples/controls_example/common/options_list/suggestions_sorting.ts b/examples/controls_example/common/options_list/suggestions_sorting.ts deleted file mode 100644 index a66fe1bdf2891..0000000000000 --- a/examples/controls_example/common/options_list/suggestions_sorting.ts +++ /dev/null @@ -1,32 +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 { Direction } from '@elastic/eui'; - -export type OptionsListSortBy = '_count' | '_key'; - -export const OPTIONS_LIST_DEFAULT_SORT: OptionsListSortingType = { - by: '_count', - direction: 'desc', -}; - -export interface OptionsListSortingType { - by: OptionsListSortBy; - direction: Direction; -} - -export const getCompatibleSortingTypes = (type?: string): OptionsListSortBy[] => { - switch (type) { - case 'ip': { - return ['_count']; - } - default: { - return ['_count', '_key']; - } - } -}; diff --git a/examples/controls_example/public/app/react_control_example/react_control_example.tsx b/examples/controls_example/public/app/react_control_example/react_control_example.tsx index 76adcfb7e3c72..9436adc208ebd 100644 --- a/examples/controls_example/public/app/react_control_example/react_control_example.tsx +++ b/examples/controls_example/public/app/react_control_example/react_control_example.tsx @@ -23,11 +23,8 @@ import { EuiToolTip, OnTimeChangeProps, } from '@elastic/eui'; -import { - CONTROL_GROUP_TYPE, - DEFAULT_CONTROL_GROW, - DEFAULT_CONTROL_WIDTH, -} from '@kbn/controls-plugin/common'; +import { CONTROL_GROUP_TYPE } from '@kbn/controls-plugin/common'; +import { ControlGroupApi } from '@kbn/controls-plugin/public'; import { CoreStart } from '@kbn/core/public'; import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import { ReactEmbeddableRenderer, ViewMode } from '@kbn/embeddable-plugin/public'; @@ -53,8 +50,6 @@ import { getControlGroupRuntimeState, setControlGroupRuntimeState, } from './runtime_control_group_state'; -import { ControlGroupApi } from '../../react_controls/control_group/types'; -import { openDataControlEditor } from '../../react_controls/data_controls/open_data_control_editor'; const toggleViewButtons = [ { @@ -319,24 +314,7 @@ export const ReactControlExample = ({ { - openDataControlEditor({ - initialState: { - grow: DEFAULT_CONTROL_GROW, - width: DEFAULT_CONTROL_WIDTH, - dataViewId: dashboardApi.lastUsedDataViewId.getValue(), - }, - onSave: ({ type: controlType, state: initialState }) => { - controlGroupApi.addNewPanel({ - panelType: controlType, - initialState, - }); - }, - controlGroupApi, - services: { - core, - dataViews: dataViewsService, - }, - }); + controlGroupApi?.openAddDataControlFlyout(); }} size="s" > diff --git a/examples/controls_example/public/app/react_control_example/runtime_control_group_state.ts b/examples/controls_example/public/app/react_control_example/runtime_control_group_state.ts index ce4bf2e1c9310..50c4ad7ad1d91 100644 --- a/examples/controls_example/public/app/react_control_example/runtime_control_group_state.ts +++ b/examples/controls_example/public/app/react_control_example/runtime_control_group_state.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { ControlGroupRuntimeState } from '../../react_controls/control_group/types'; +import { ControlGroupRuntimeState } from '@kbn/controls-plugin/public'; const RUNTIME_STATE_SESSION_STORAGE_KEY = 'kibana.examples.controls.reactControlExample.controlGroupRuntimeState'; diff --git a/examples/controls_example/public/app/react_control_example/serialized_control_group_state.ts b/examples/controls_example/public/app/react_control_example/serialized_control_group_state.ts index 23071623b7ac0..b02cf450cdd73 100644 --- a/examples/controls_example/public/app/react_control_example/serialized_control_group_state.ts +++ b/examples/controls_example/public/app/react_control_example/serialized_control_group_state.ts @@ -7,11 +7,12 @@ */ import { SerializedPanelState } from '@kbn/presentation-containers'; -import { ControlGroupSerializedState } from '../../react_controls/control_group/types'; -import { OPTIONS_LIST_CONTROL_TYPE } from '../../react_controls/data_controls/options_list_control/constants'; -import { RANGE_SLIDER_CONTROL_TYPE } from '../../react_controls/data_controls/range_slider/types'; -import { SEARCH_CONTROL_TYPE } from '../../react_controls/data_controls/search_control/types'; -import { TIMESLIDER_CONTROL_TYPE } from '../../react_controls/timeslider_control/types'; +import { ControlGroupSerializedState } from '@kbn/controls-plugin/public'; +import { + OPTIONS_LIST_CONTROL, + RANGE_SLIDER_CONTROL, + TIME_SLIDER_CONTROL, +} from '@kbn/controls-plugin/common'; const SERIALIZED_STATE_SESSION_STORAGE_KEY = 'kibana.examples.controls.reactControlExample.controlGroupSerializedState'; @@ -37,22 +38,8 @@ const searchControlId = 'searchControl1'; const rangeSliderControlId = 'rangeSliderControl1'; const timesliderControlId = 'timesliderControl1'; const controlGroupPanels = { - [searchControlId]: { - type: SEARCH_CONTROL_TYPE, - order: 3, - grow: true, - width: 'medium', - explicitInput: { - id: searchControlId, - fieldName: 'message', - title: 'Message', - grow: true, - width: 'medium', - enhancements: {}, - }, - }, [rangeSliderControlId]: { - type: RANGE_SLIDER_CONTROL_TYPE, + type: RANGE_SLIDER_CONTROL, order: 1, grow: true, width: 'medium', @@ -66,7 +53,7 @@ const controlGroupPanels = { }, }, [timesliderControlId]: { - type: TIMESLIDER_CONTROL_TYPE, + type: TIME_SLIDER_CONTROL, order: 4, grow: true, width: 'medium', @@ -77,7 +64,7 @@ const controlGroupPanels = { }, }, [optionsListId]: { - type: OPTIONS_LIST_CONTROL_TYPE, + type: OPTIONS_LIST_CONTROL, order: 2, grow: true, width: 'medium', @@ -103,17 +90,12 @@ const initialSerializedControlGroupState = { } as object, references: [ { - name: `controlGroup_${searchControlId}:${SEARCH_CONTROL_TYPE}DataView`, - type: 'index-pattern', - id: WEB_LOGS_DATA_VIEW_ID, - }, - { - name: `controlGroup_${rangeSliderControlId}:${RANGE_SLIDER_CONTROL_TYPE}DataView`, + name: `controlGroup_${rangeSliderControlId}:${RANGE_SLIDER_CONTROL}DataView`, type: 'index-pattern', id: WEB_LOGS_DATA_VIEW_ID, }, { - name: `controlGroup_${optionsListId}:optionsListControlDataView`, + name: `controlGroup_${optionsListId}:${OPTIONS_LIST_CONTROL}DataView`, type: 'index-pattern', id: WEB_LOGS_DATA_VIEW_ID, }, diff --git a/examples/controls_example/public/plugin.tsx b/examples/controls_example/public/plugin.tsx index 15f587033cb81..40ba4b1140fab 100644 --- a/examples/controls_example/public/plugin.tsx +++ b/examples/controls_example/public/plugin.tsx @@ -6,25 +6,16 @@ * Side Public License, v 1. */ -import { CONTROL_GROUP_TYPE } from '@kbn/controls-plugin/common'; import { AppMountParameters, CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { DeveloperExamplesSetup } from '@kbn/developer-examples-plugin/public'; -import { EmbeddableSetup, PANEL_HOVER_TRIGGER } from '@kbn/embeddable-plugin/public'; import type { NavigationPublicPluginStart } from '@kbn/navigation-plugin/public'; import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; import { PLUGIN_ID } from './constants'; import img from './control_group_image.png'; -import { EditControlAction } from './react_controls/actions/edit_control_action'; -import { registerControlFactory } from './react_controls/control_factory_registry'; -import { OPTIONS_LIST_CONTROL_TYPE } from './react_controls/data_controls/options_list_control/constants'; -import { RANGE_SLIDER_CONTROL_TYPE } from './react_controls/data_controls/range_slider/types'; -import { SEARCH_CONTROL_TYPE } from './react_controls/data_controls/search_control/types'; -import { TIMESLIDER_CONTROL_TYPE } from './react_controls/timeslider_control/types'; interface SetupDeps { developerExamples: DeveloperExamplesSetup; - embeddable: EmbeddableSetup; } export interface ControlsExampleStartDeps { @@ -36,73 +27,7 @@ export interface ControlsExampleStartDeps { export class ControlsExamplePlugin implements Plugin { - public setup( - core: CoreSetup, - { developerExamples, embeddable }: SetupDeps - ) { - embeddable.registerReactEmbeddableFactory(CONTROL_GROUP_TYPE, async () => { - const [{ getControlGroupEmbeddableFactory }, [coreStart, depsStart]] = await Promise.all([ - import('./react_controls/control_group/get_control_group_factory'), - core.getStartServices(), - ]); - return getControlGroupEmbeddableFactory({ - core: coreStart, - dataViews: depsStart.data.dataViews, - }); - }); - - registerControlFactory(OPTIONS_LIST_CONTROL_TYPE, async () => { - const [{ getOptionsListControlFactory }, [coreStart, depsStart]] = await Promise.all([ - import( - './react_controls/data_controls/options_list_control/get_options_list_control_factory' - ), - core.getStartServices(), - ]); - return getOptionsListControlFactory({ - core: coreStart, - data: depsStart.data, - dataViews: depsStart.data.dataViews, - }); - }); - - registerControlFactory(SEARCH_CONTROL_TYPE, async () => { - const [{ getSearchControlFactory: getSearchEmbeddableFactory }, [coreStart, depsStart]] = - await Promise.all([ - import('./react_controls/data_controls/search_control/get_search_control_factory'), - core.getStartServices(), - ]); - - return getSearchEmbeddableFactory({ - core: coreStart, - data: depsStart.data, - dataViews: depsStart.data.dataViews, - }); - }); - - registerControlFactory(RANGE_SLIDER_CONTROL_TYPE, async () => { - const [{ getRangesliderControlFactory }, [coreStart, depsStart]] = await Promise.all([ - import('./react_controls/data_controls/range_slider/get_range_slider_control_factory'), - core.getStartServices(), - ]); - - return getRangesliderControlFactory({ - core: coreStart, - data: depsStart.data, - dataViews: depsStart.data.dataViews, - }); - }); - - registerControlFactory(TIMESLIDER_CONTROL_TYPE, async () => { - const [{ getTimesliderControlFactory }, [coreStart, depsStart]] = await Promise.all([ - import('./react_controls/timeslider_control/get_timeslider_control_factory'), - core.getStartServices(), - ]); - return getTimesliderControlFactory({ - core: coreStart, - data: depsStart.data, - }); - }); - + public setup(core: CoreSetup, { developerExamples }: SetupDeps) { core.application.register({ id: PLUGIN_ID, title: 'Controls examples', @@ -122,11 +47,7 @@ export class ControlsExamplePlugin }); } - public start(core: CoreStart, deps: ControlsExampleStartDeps) { - const editControlAction = new EditControlAction(); - deps.uiActions.registerAction(editControlAction); - deps.uiActions.attachAction(PANEL_HOVER_TRIGGER, editControlAction.id); - } + public start(core: CoreStart, deps: ControlsExampleStartDeps) {} public stop() {} } diff --git a/examples/controls_example/public/react_controls/data_controls/search_control/get_search_control_factory.tsx b/examples/controls_example/public/react_controls/data_controls/search_control/get_search_control_factory.tsx deleted file mode 100644 index 4d00e9834c349..0000000000000 --- a/examples/controls_example/public/react_controls/data_controls/search_control/get_search_control_factory.tsx +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React, { useEffect, useState } from 'react'; -import { BehaviorSubject, combineLatest, debounceTime, skip } from 'rxjs'; - -import { EuiFieldSearch, EuiFormRow, EuiRadioGroup } from '@elastic/eui'; -import { css } from '@emotion/react'; -import { i18n } from '@kbn/i18n'; -import { useStateFromPublishingSubject } from '@kbn/presentation-publishing'; -import { euiThemeVars } from '@kbn/ui-theme'; - -import { Filter } from '@kbn/es-query'; -import { initializeDataControl } from '../initialize_data_control'; -import { DataControlFactory, DataControlServices } from '../types'; -import { - SearchControlApi, - SearchControlState, - SearchControlTechniques, - SEARCH_CONTROL_TYPE, -} from './types'; -import { initializeSearchControlSelections } from './search_control_selections'; - -const allSearchOptions = [ - { - id: 'match', - label: i18n.translate('controlsExamples.searchControl.searchTechnique.match', { - defaultMessage: 'Fuzzy match', - }), - 'data-test-subj': 'searchControl__matchSearchOptionAdditionalSetting', - }, - { - id: 'simple_query_string', - label: i18n.translate('controlsExamples.searchControl.searchTechnique.simpleQueryString', { - defaultMessage: 'Query string', - }), - 'data-test-subj': 'optionsListControl__queryStringSearchOptionAdditionalSetting', - }, -]; - -const DEFAULT_SEARCH_TECHNIQUE = 'match'; - -export const getSearchControlFactory = ( - services: DataControlServices -): DataControlFactory => { - return { - type: SEARCH_CONTROL_TYPE, - getIconType: () => 'search', - getDisplayName: () => - i18n.translate('controlsExamples.searchControl.displayName', { defaultMessage: 'Search' }), - isFieldCompatible: (field) => { - return ( - field.searchable && - field.spec.type === 'string' && - (field.spec.esTypes ?? []).includes('text') - ); - }, - CustomOptionsComponent: ({ initialState, updateState }) => { - const [searchTechnique, setSearchTechnique] = useState( - initialState.searchTechnique ?? DEFAULT_SEARCH_TECHNIQUE - ); - - return ( - - { - const newSearchTechnique = id as SearchControlTechniques; - setSearchTechnique(newSearchTechnique); - updateState({ searchTechnique: newSearchTechnique }); - }} - /> - - ); - }, - buildControl: async (initialState, buildApi, uuid, parentApi) => { - const searchTechnique = new BehaviorSubject( - initialState.searchTechnique ?? DEFAULT_SEARCH_TECHNIQUE - ); - const editorStateManager = { searchTechnique }; - - const dataControl = initializeDataControl>( - uuid, - SEARCH_CONTROL_TYPE, - initialState, - editorStateManager, - parentApi, - services - ); - - const selections = initializeSearchControlSelections( - initialState, - dataControl.setters.onSelectionChange - ); - - const api = buildApi( - { - ...dataControl.api, - getTypeDisplayName: () => - i18n.translate('controlsExamples.searchControl.displayName', { - defaultMessage: 'Search', - }), - serializeState: () => { - const { rawState: dataControlState, references } = dataControl.serialize(); - return { - rawState: { - ...dataControlState, - searchString: selections.searchString$.getValue(), - searchTechnique: searchTechnique.getValue(), - }, - references, // does not have any references other than those provided by the data control serializer - }; - }, - clearSelections: () => { - selections.setSearchString(undefined); - }, - }, - { - ...dataControl.comparators, - ...selections.comparators, - searchTechnique: [ - searchTechnique, - (newTechnique: SearchControlTechniques | undefined) => - searchTechnique.next(newTechnique), - (a, b) => (a ?? DEFAULT_SEARCH_TECHNIQUE) === (b ?? DEFAULT_SEARCH_TECHNIQUE), - ], - } - ); - - /** - * If either the search string or the search technique changes, recalulate the output filter - */ - const onSearchStringChanged = combineLatest([selections.searchString$, searchTechnique]) - .pipe(debounceTime(200)) - .subscribe(([newSearchString, currentSearchTechnnique]) => { - const currentDataView = dataControl.api.dataViews.getValue()?.[0]; - const currentField = dataControl.stateManager.fieldName.getValue(); - - let filter: Filter | undefined; - if (currentDataView && currentField && newSearchString) { - filter = - currentSearchTechnnique === 'match' - ? { - query: { match: { [currentField]: { query: newSearchString } } }, - meta: { index: currentDataView.id }, - } - : { - query: { - simple_query_string: { - query: newSearchString, - fields: [currentField], - default_operator: 'and', - }, - }, - meta: { index: currentDataView.id }, - }; - } - - dataControl.setters.setOutputFilter(filter); - }); - - /** - * When the field changes (which can happen if either the field name or the dataview id changes), - * clear the previous search string. - */ - const onFieldChanged = combineLatest([ - dataControl.stateManager.fieldName, - dataControl.stateManager.dataViewId, - ]) - .pipe(skip(1)) - .subscribe(() => { - selections.setSearchString(undefined); - }); - - if (initialState.searchString?.length) { - await dataControl.api.untilFiltersReady(); - } - - return { - api, - /** - * The `controlPanelClassNamess` prop is necessary because it contains the class names from the generic - * ControlPanel that are necessary for styling - */ - Component: ({ className: controlPanelClassName }) => { - const currentSearch = useStateFromPublishingSubject(selections.searchString$); - - useEffect(() => { - return () => { - // cleanup on unmount - dataControl.cleanup(); - onSearchStringChanged.unsubscribe(); - onFieldChanged.unsubscribe(); - }; - }, []); - - return ( - { - selections.setSearchString(event.target.value); - }} - placeholder={i18n.translate('controls.searchControl.placeholder', { - defaultMessage: 'Search...', - })} - id={uuid} - fullWidth - /> - ); - }, - }; - }, - }; -}; diff --git a/examples/controls_example/public/react_controls/data_controls/search_control/search_control_selections.ts b/examples/controls_example/public/react_controls/data_controls/search_control/search_control_selections.ts deleted file mode 100644 index b36ac8aa4304c..0000000000000 --- a/examples/controls_example/public/react_controls/data_controls/search_control/search_control_selections.ts +++ /dev/null @@ -1,33 +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 { BehaviorSubject } from 'rxjs'; -import { PublishingSubject, StateComparators } from '@kbn/presentation-publishing'; -import { SearchControlState } from './types'; - -export function initializeSearchControlSelections( - initialState: SearchControlState, - onSelectionChange: () => void -) { - const searchString$ = new BehaviorSubject(initialState.searchString); - function setSearchString(next: string | undefined) { - if (searchString$.value !== next) { - searchString$.next(next); - onSelectionChange(); - } - } - - return { - comparators: { - searchString: [searchString$, setSearchString], - } as StateComparators>, - hasInitialSelections: initialState.searchString?.length, - searchString$: searchString$ as PublishingSubject, - setSearchString, - }; -} diff --git a/examples/controls_example/public/react_controls/data_controls/search_control/types.tsx b/examples/controls_example/public/react_controls/data_controls/search_control/types.tsx deleted file mode 100644 index d0b2d43b69f48..0000000000000 --- a/examples/controls_example/public/react_controls/data_controls/search_control/types.tsx +++ /dev/null @@ -1,20 +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 { DataControlApi, DefaultDataControlState } from '../types'; - -export const SEARCH_CONTROL_TYPE = 'searchControl'; - -export type SearchControlTechniques = 'match' | 'simple_query_string'; - -export interface SearchControlState extends DefaultDataControlState { - searchString?: string; - searchTechnique?: SearchControlTechniques; -} - -export type SearchControlApi = DataControlApi; diff --git a/examples/controls_example/tsconfig.json b/examples/controls_example/tsconfig.json index 9ddcdf1835213..d81aa3c1168fe 100644 --- a/examples/controls_example/tsconfig.json +++ b/examples/controls_example/tsconfig.json @@ -24,18 +24,7 @@ "@kbn/presentation-containers", "@kbn/presentation-publishing", "@kbn/ui-actions-plugin", - "@kbn/i18n-react", - "@kbn/shared-ux-markdown", - "@kbn/i18n", - "@kbn/core-mount-utils-browser", "@kbn/react-kibana-mount", - "@kbn/content-management-utils", - "@kbn/presentation-util-plugin", - "@kbn/core-lifecycle-browser", - "@kbn/presentation-panel-plugin", - "@kbn/datemath", - "@kbn/ui-theme", "@kbn/react-kibana-context-render", - "@kbn/field-formats-plugin", ] } diff --git a/fleet_packages.json b/fleet_packages.json index 20d46c35a8d03..1217c4f2ec861 100644 --- a/fleet_packages.json +++ b/fleet_packages.json @@ -30,7 +30,7 @@ }, { "name": "elastic_agent", - "version": "2.0.1" + "version": "2.0.2" }, { "name": "endpoint", diff --git a/package.json b/package.json index 6399bbf1ebae2..2864dd7970bf6 100644 --- a/package.json +++ b/package.json @@ -791,6 +791,7 @@ "@kbn/securitysolution-utils": "link:packages/kbn-securitysolution-utils", "@kbn/server-http-tools": "link:packages/kbn-server-http-tools", "@kbn/server-route-repository": "link:packages/kbn-server-route-repository", + "@kbn/server-route-repository-client": "link:packages/kbn-server-route-repository-client", "@kbn/server-route-repository-utils": "link:packages/kbn-server-route-repository-utils", "@kbn/serverless": "link:x-pack/plugins/serverless", "@kbn/serverless-common-settings": "link:packages/serverless/settings/common", @@ -870,6 +871,7 @@ "@kbn/status-plugin-b-plugin": "link:test/server_integration/plugins/status_plugin_b", "@kbn/std": "link:packages/kbn-std", "@kbn/synthetics-plugin": "link:x-pack/plugins/observability_solution/synthetics", + "@kbn/synthetics-private-location": "link:x-pack/packages/kbn-synthetics-private-location", "@kbn/task-manager-fixture-plugin": "link:x-pack/test/alerting_api_integration/common/plugins/task_manager_fixture", "@kbn/task-manager-performance-plugin": "link:x-pack/test/plugin_api_perf/plugins/task_manager_performance", "@kbn/task-manager-plugin": "link:x-pack/plugins/task_manager", @@ -1432,7 +1434,7 @@ "@mapbox/vector-tile": "1.3.1", "@octokit/rest": "^17.11.2", "@parcel/watcher": "^2.1.0", - "@redocly/cli": "^1.18.1", + "@redocly/cli": "^1.19.0", "@statoscope/webpack-plugin": "^5.28.2", "@storybook/addon-a11y": "^6.5.16", "@storybook/addon-actions": "^6.5.16", @@ -1649,6 +1651,7 @@ "eslint-config-prettier": "^9.1.0", "eslint-plugin-ban": "^1.6.0", "eslint-plugin-cypress": "^2.15.1", + "eslint-plugin-depend": "^0.9.0", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-formatjs": "^4.12.2", "eslint-plugin-import": "^2.28.0", @@ -1737,7 +1740,6 @@ "postcss-scss": "^4.0.4", "prettier": "^2.8.8", "proxy": "^2.1.1", - "q": "^1.5.1", "raw-loader": "^3.1.0", "react-test-renderer": "^17.0.2", "recast": "^0.23.9", diff --git a/packages/core/http/core-http-server-internal/src/https_redirect_server.test.ts b/packages/core/http/core-http-server-internal/src/https_redirect_server.test.ts index 3123fe8bba06c..6a755ff2af890 100644 --- a/packages/core/http/core-http-server-internal/src/https_redirect_server.test.ts +++ b/packages/core/http/core-http-server-internal/src/https_redirect_server.test.ts @@ -6,6 +6,8 @@ * Side Public License, v 1. */ +import * as net from 'node:net'; + jest.mock('fs', () => ({ readFileSync: jest.fn(), })); @@ -28,14 +30,34 @@ function getServerListener(httpServer: HttpsRedirectServer) { return (httpServer as any).server.listener; } -beforeEach(() => { +async function getRandomAvailablePort(opts: Chance.Options): Promise { + while (true) { + const candidatePort = chance.integer(opts); + try { + await new Promise((resolve, reject) => { + const svr = net.createServer(); + svr.once('error', reject); + svr.listen({ host: '127.0.0.1', port: candidatePort }, () => { + svr.close(() => { + resolve(); + }); + }); + }); + return candidatePort; + } catch (err) { + // just keep trying to find another port + } + } +} + +beforeEach(async () => { config = { host: '127.0.0.1', maxPayload: new ByteSizeValue(1024), - port: chance.integer({ min: 10000, max: 15000 }), + port: await getRandomAvailablePort({ min: 10000, max: 15000 }), ssl: { enabled: true, - redirectHttpFromPort: chance.integer({ min: 20000, max: 30000 }), + redirectHttpFromPort: await getRandomAvailablePort({ min: 20000, max: 30000 }), }, cors: { enabled: false, @@ -55,7 +77,7 @@ test('throws if SSL is not enabled', async () => { ...config, ssl: { enabled: false, - redirectHttpFromPort: chance.integer({ min: 20000, max: 30000 }), + redirectHttpFromPort: await getRandomAvailablePort({ min: 20000, max: 30000 }), }, } as HttpConfig) ).rejects.toMatchSnapshot(); diff --git a/packages/core/metrics/core-metrics-server-internal/src/routes/elu_history.ts b/packages/core/metrics/core-metrics-server-internal/src/routes/elu_history.ts index c7041427950d6..1c1825e94c11b 100644 --- a/packages/core/metrics/core-metrics-server-internal/src/routes/elu_history.ts +++ b/packages/core/metrics/core-metrics-server-internal/src/routes/elu_history.ts @@ -9,6 +9,7 @@ import type { IRouter } from '@kbn/core-http-server'; import type { OpsMetrics } from '@kbn/core-metrics-server'; import type { Observable } from 'rxjs'; +import apm from 'elastic-apm-node'; import { HistoryWindow } from './history_window'; interface ELUHistoryResponse { @@ -42,6 +43,17 @@ export function registerEluHistoryRoute(router: IRouter, metrics$: Observable + eluHistoryWindow.getAverage(HISTORY_WINDOW_SIZE_SHORT) + ); + apm.registerMetric('elu.history.medium', () => + eluHistoryWindow.getAverage(HISTORY_WINDOW_SIZE_MED) + ); + apm.registerMetric('elu.history.long', () => + eluHistoryWindow.getAverage(HISTORY_WINDOW_SIZE_LONG) + ); + router.versioned .get({ access: 'internal', diff --git a/packages/kbn-alerts-grouping/src/components/alerts_grouping.test.tsx b/packages/kbn-alerts-grouping/src/components/alerts_grouping.test.tsx index c60ef03ca35e5..87517def778cd 100644 --- a/packages/kbn-alerts-grouping/src/components/alerts_grouping.test.tsx +++ b/packages/kbn-alerts-grouping/src/components/alerts_grouping.test.tsx @@ -33,8 +33,8 @@ jest.mock('@kbn/alerts-ui-shared/src/common/hooks/use_get_alerts_group_aggregati useGetAlertsGroupAggregationsQuery: jest.fn(), })); -jest.mock('@kbn/alerts-ui-shared/src/common/hooks/use_alert_data_view', () => ({ - useAlertDataView: jest.fn().mockReturnValue({ dataViews: [{ fields: [] }] }), +jest.mock('@kbn/alerts-ui-shared/src/common/hooks/use_alerts_data_view', () => ({ + useAlertsDataView: jest.fn().mockReturnValue({ dataView: { fields: [] } }), })); jest.mock('../contexts/alerts_grouping_context', () => { diff --git a/packages/kbn-alerts-grouping/src/components/alerts_grouping.tsx b/packages/kbn-alerts-grouping/src/components/alerts_grouping.tsx index 130997dd393ce..f17d794668371 100644 --- a/packages/kbn-alerts-grouping/src/components/alerts_grouping.tsx +++ b/packages/kbn-alerts-grouping/src/components/alerts_grouping.tsx @@ -20,7 +20,7 @@ import type { Filter } from '@kbn/es-query'; import { isNoneGroup, useGrouping } from '@kbn/grouping'; import { isEqual } from 'lodash/fp'; import { i18n } from '@kbn/i18n'; -import { useAlertDataView } from '@kbn/alerts-ui-shared'; +import { useAlertsDataView } from '@kbn/alerts-ui-shared/src/common/hooks/use_alerts_data_view'; import useLocalStorage from 'react-use/lib/useLocalStorage'; import { AlertsGroupingLevel, AlertsGroupingLevelProps } from './alerts_grouping_level'; import { AlertsGroupingProps } from '../types'; @@ -72,13 +72,12 @@ const AlertsGroupingInternal = (props: AlertsGroupingProps) => { const { dataViews, notifications, http } = services; const { grouping, updateGrouping } = useAlertsGroupingState(groupingId); - const { dataViews: alertDataViews } = useAlertDataView({ + const { dataView } = useAlertsDataView({ featureIds, dataViewsService: dataViews, http, toasts: notifications.toasts, }); - const dataView = useMemo(() => alertDataViews?.[0], [alertDataViews]); const [pageSize, setPageSize] = useLocalStorage( `grouping-table-${groupingId}`, Array(MAX_GROUPING_LEVELS).fill(DEFAULT_PAGE_SIZE) diff --git a/packages/kbn-alerts-grouping/src/components/alerts_grouping_level.test.tsx b/packages/kbn-alerts-grouping/src/components/alerts_grouping_level.test.tsx index 45424f34d9cb4..f1295ee67dd73 100644 --- a/packages/kbn-alerts-grouping/src/components/alerts_grouping_level.test.tsx +++ b/packages/kbn-alerts-grouping/src/components/alerts_grouping_level.test.tsx @@ -24,7 +24,7 @@ mockUseGetAlertsGroupAggregationsQuery.mockReturnValue({ data: groupingSearchResponse, }); -jest.mock('@kbn/alerts-ui-shared/src/common/hooks/use_alert_data_view', () => ({ +jest.mock('@kbn/alerts-ui-shared/src/common/hooks/use_alerts_data_view', () => ({ useAlertDataView: jest.fn().mockReturnValue({ dataViews: [{ fields: [] }] }), })); diff --git a/packages/kbn-alerts-ui-shared/src/alert_filter_controls/alert_filter_controls.test.tsx b/packages/kbn-alerts-ui-shared/src/alert_filter_controls/alert_filter_controls.test.tsx new file mode 100644 index 0000000000000..54b74e4b2259a --- /dev/null +++ b/packages/kbn-alerts-ui-shared/src/alert_filter_controls/alert_filter_controls.test.tsx @@ -0,0 +1,84 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import { AlertFilterControls, AlertFilterControlsProps } from './alert_filter_controls'; +import { AlertConsumers } from '@kbn/rule-data-utils'; +import { DEFAULT_CONTROLS } from './constants'; +import { useAlertsDataView } from '../common/hooks/use_alerts_data_view'; +import { FilterGroup } from './filter_group'; +import { httpServiceMock } from '@kbn/core-http-browser-mocks'; +import { notificationServiceMock } from '@kbn/core-notifications-browser-mocks'; +import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; + +jest.mock('./filter_group'); +jest.mocked(FilterGroup).mockReturnValue(); + +jest.mock('../common/hooks/use_alerts_data_view'); +jest.mocked(useAlertsDataView).mockReturnValue({ + isLoading: false, + dataView: { + title: '.alerts-*', + fields: [ + { + name: 'event.action', + type: 'string', + aggregatable: true, + searchable: true, + }, + ], + }, +}); + +const mockServices = { + http: httpServiceMock.createStartContract(), + notifications: notificationServiceMock.createStartContract(), + dataViews: dataViewPluginMocks.createStartContract(), + storage: class { + get = jest.fn(); + set = jest.fn(); + } as unknown as AlertFilterControlsProps['services']['storage'], +}; +mockServices.dataViews.clearInstanceCache = jest.fn().mockResolvedValue(undefined); + +const setFilters = jest.fn(); + +const ControlGroupRenderer = (() => ( + +)) as unknown as AlertFilterControlsProps['ControlGroupRenderer']; + +describe('AlertFilterControls', () => { + const props: AlertFilterControlsProps = { + featureIds: [AlertConsumers.STACK_ALERTS], + defaultControls: DEFAULT_CONTROLS, + dataViewSpec: { + id: 'alerts-filters-dv', + }, + onFiltersChange: setFilters, + services: mockServices, + chainingSystem: 'HIERARCHICAL', + ControlGroupRenderer, + }; + + it('renders the filter group', async () => { + render(); + + expect(await screen.findByTestId('filter-group')).toBeInTheDocument(); + }); + + it('creates a data view if a spec with an id is provided', () => { + render(); + + expect(mockServices.dataViews.create).toHaveBeenCalledWith( + expect.objectContaining({ + id: 'alerts-filters-dv', + }) + ); + }); +}); diff --git a/packages/kbn-alerts-ui-shared/src/alert_filter_controls/alert_filter_controls.tsx b/packages/kbn-alerts-ui-shared/src/alert_filter_controls/alert_filter_controls.tsx index fc2b9fbbc207f..436480677d68b 100644 --- a/packages/kbn-alerts-ui-shared/src/alert_filter_controls/alert_filter_controls.tsx +++ b/packages/kbn-alerts-ui-shared/src/alert_filter_controls/alert_filter_controls.tsx @@ -15,7 +15,7 @@ import { AlertConsumers } from '@kbn/rule-data-utils'; import { HttpStart } from '@kbn/core-http-browser'; import { NotificationsStart } from '@kbn/core-notifications-browser'; import type { Storage } from '@kbn/kibana-utils-plugin/public'; -import { useAlertDataView } from '../..'; +import { useAlertsDataView } from '../..'; import { FilterGroupLoading } from './loading'; import { DEFAULT_CONTROLS } from './constants'; import { FilterGroup } from './filter_group'; @@ -94,7 +94,7 @@ export const AlertFilterControls = (props: AlertFilterControlsProps) => { ...restFilterItemGroupProps } = props; const [loadingPageFilters, setLoadingPageFilters] = useState(true); - const { dataViews: alertDataViews, loading: loadingDataViews } = useAlertDataView({ + const { dataView, isLoading: isLoadingDataView } = useAlertsDataView({ featureIds, dataViewsService: dataViews, http, @@ -102,14 +102,14 @@ export const AlertFilterControls = (props: AlertFilterControlsProps) => { }); useEffect(() => { - if (!loadingDataViews) { + if (!isLoadingDataView) { // If a data view spec is provided, create a new data view if (dataViewSpec?.id) { (async () => { // Creates an adhoc data view starting from the alert data view // and applying the overrides specified in the dataViewSpec const spec = { - ...(alertDataViews?.[0] ?? {}), + ...(dataView ?? {}), ...(dataViewSpec ?? {}), } as DataViewSpec; await dataViews.create(spec); @@ -121,7 +121,7 @@ export const AlertFilterControls = (props: AlertFilterControlsProps) => { } return () => dataViews.clearInstanceCache(); - }, [dataViewSpec, alertDataViews, dataViews, loadingDataViews]); + }, [dataView, dataViewSpec, dataViews, isLoadingDataView]); const handleFilterChanges = useCallback( (newFilters: Filter[]) => { diff --git a/packages/kbn-alerts-ui-shared/src/alerts_search_bar/index.tsx b/packages/kbn-alerts-ui-shared/src/alerts_search_bar/index.tsx index 9a095200a8506..c187ace912e30 100644 --- a/packages/kbn-alerts-ui-shared/src/alerts_search_bar/index.tsx +++ b/packages/kbn-alerts-ui-shared/src/alerts_search_bar/index.tsx @@ -6,21 +6,23 @@ * Side Public License, v 1. */ -import { useCallback, useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; import type { Query, TimeRange } from '@kbn/es-query'; import type { SuggestionsAbstraction } from '@kbn/unified-search-plugin/public/typeahead/suggestions_component'; -import { AlertConsumers } from '@kbn/rule-data-utils'; +import { AlertConsumers, ValidFeatureId } from '@kbn/rule-data-utils'; import { NO_INDEX_PATTERNS } from './constants'; import { SEARCH_BAR_PLACEHOLDER } from './translations'; import type { AlertsSearchBarProps, QueryLanguageType } from './types'; -import { useLoadRuleTypesQuery, useAlertDataView, useRuleAADFields } from '../common/hooks'; +import { useLoadRuleTypesQuery, useAlertsDataView, useRuleAADFields } from '../common/hooks'; const SA_ALERTS = { type: 'alerts', fields: {} } as SuggestionsAbstraction; +const EMPTY_FEATURE_IDS: ValidFeatureId[] = []; + export const AlertsSearchBar = ({ appName, disableQueryLanguageSwitcher = false, - featureIds, + featureIds = EMPTY_FEATURE_IDS, ruleTypeId, query, filters, @@ -40,8 +42,8 @@ export const AlertsSearchBar = ({ dataViewsService, }: AlertsSearchBarProps) => { const [queryLanguage, setQueryLanguage] = useState('kuery'); - const { dataViews, loading } = useAlertDataView({ - featureIds: featureIds ?? [], + const { dataView } = useAlertsDataView({ + featureIds, http, toasts, dataViewsService, @@ -52,8 +54,15 @@ export const AlertsSearchBar = ({ toasts, }); - const indexPatterns = - ruleTypeId && aadFields?.length ? [{ title: ruleTypeId, fields: aadFields }] : dataViews; + const indexPatterns = useMemo(() => { + if (ruleTypeId && aadFields?.length) { + return [{ title: ruleTypeId, fields: aadFields }]; + } + if (dataView) { + return [dataView]; + } + return null; + }, [aadFields, dataView, ruleTypeId]); const ruleType = useLoadRuleTypesQuery({ filteredRuleTypes: ruleTypeId !== undefined ? [ruleTypeId] : [], @@ -99,7 +108,7 @@ export const AlertsSearchBar = ({ appName, disableQueryLanguageSwitcher, // @ts-expect-error - DataView fields prop and SearchBar indexPatterns props are overly broad - indexPatterns: loading || fieldsLoading ? NO_INDEX_PATTERNS : indexPatterns, + indexPatterns: !indexPatterns || fieldsLoading ? NO_INDEX_PATTERNS : indexPatterns, placeholder, query: { query: query ?? '', language: queryLanguage }, filters, diff --git a/packages/kbn-alerts-ui-shared/src/common/apis/fetch_alerts_fields/fetch_alerts_fields.ts b/packages/kbn-alerts-ui-shared/src/common/apis/fetch_alerts_fields/fetch_alerts_fields.ts index 3deafc37e8ce4..abe38a8fa3ab6 100644 --- a/packages/kbn-alerts-ui-shared/src/common/apis/fetch_alerts_fields/fetch_alerts_fields.ts +++ b/packages/kbn-alerts-ui-shared/src/common/apis/fetch_alerts_fields/fetch_alerts_fields.ts @@ -11,10 +11,11 @@ import type { BrowserFields } from '@kbn/alerting-types'; import type { FetchAlertsFieldsParams } from './types'; import { BASE_RAC_ALERTS_API_PATH } from '../../constants'; -export const fetchAlertsFields = ({ http, featureIds }: FetchAlertsFieldsParams) => - http.get<{ browserFields: BrowserFields; fields: FieldDescriptor[] }>( +export const fetchAlertsFields = ({ http, featureIds }: FetchAlertsFieldsParams) => { + return http.get<{ browserFields: BrowserFields; fields: FieldDescriptor[] }>( `${BASE_RAC_ALERTS_API_PATH}/browser_fields`, { query: { featureIds }, } ); +}; diff --git a/packages/kbn-alerts-ui-shared/src/common/apis/fetch_alerts_index_names/fetch_alerts_index_names.test.ts b/packages/kbn-alerts-ui-shared/src/common/apis/fetch_alerts_index_names/fetch_alerts_index_names.test.ts new file mode 100644 index 0000000000000..0eaa288cf999f --- /dev/null +++ b/packages/kbn-alerts-ui-shared/src/common/apis/fetch_alerts_index_names/fetch_alerts_index_names.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 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 { httpServiceMock } from '@kbn/core/public/mocks'; +import { fetchAlertsIndexNames } from '.'; +import { AlertConsumers } from '@kbn/rule-data-utils'; +import { BASE_RAC_ALERTS_API_PATH } from '../../constants'; + +describe('fetchAlertsIndexNames', () => { + const http = httpServiceMock.createStartContract(); + + it('calls the alerts/index API with the correct parameters', async () => { + const featureIds = [AlertConsumers.STACK_ALERTS, AlertConsumers.APM]; + const indexNames = ['test-index']; + http.get.mockResolvedValueOnce({ + index_name: indexNames, + }); + const result = await fetchAlertsIndexNames({ http, featureIds }); + expect(result).toEqual(indexNames); + expect(http.get).toHaveBeenLastCalledWith(`${BASE_RAC_ALERTS_API_PATH}/index`, { + query: { features: featureIds.join(',') }, + }); + }); +}); diff --git a/packages/kbn-alerts-ui-shared/src/common/apis/fetch_alert_index_names.ts b/packages/kbn-alerts-ui-shared/src/common/apis/fetch_alerts_index_names/fetch_alerts_index_names.ts similarity index 52% rename from packages/kbn-alerts-ui-shared/src/common/apis/fetch_alert_index_names.ts rename to packages/kbn-alerts-ui-shared/src/common/apis/fetch_alerts_index_names/fetch_alerts_index_names.ts index 9cf7fe1d3ebc8..29b8f97a5cdee 100644 --- a/packages/kbn-alerts-ui-shared/src/common/apis/fetch_alert_index_names.ts +++ b/packages/kbn-alerts-ui-shared/src/common/apis/fetch_alerts_index_names/fetch_alerts_index_names.ts @@ -6,21 +6,15 @@ * Side Public License, v 1. */ -import { HttpSetup } from '@kbn/core/public'; -import { BASE_RAC_ALERTS_API_PATH } from '../constants'; +import { BASE_RAC_ALERTS_API_PATH } from '../../constants'; +import { FetchAlertsIndexNamesParams } from './types'; -export async function fetchAlertIndexNames({ - http, - features, -}: { - http: HttpSetup; - features: string; -}): Promise { - const { index_name: indexNamesStr = [] } = await http.get<{ index_name: string[] }>( +export const fetchAlertsIndexNames = async ({ http, featureIds }: FetchAlertsIndexNamesParams) => { + const { index_name: indexNames = [] } = await http.get<{ index_name: string[] }>( `${BASE_RAC_ALERTS_API_PATH}/index`, { - query: { features }, + query: { features: featureIds.join(',') }, } ); - return indexNamesStr; -} + return indexNames; +}; diff --git a/packages/kbn-alerts-ui-shared/src/common/apis/fetch_alerts_index_names/index.ts b/packages/kbn-alerts-ui-shared/src/common/apis/fetch_alerts_index_names/index.ts new file mode 100644 index 0000000000000..c1f3202108554 --- /dev/null +++ b/packages/kbn-alerts-ui-shared/src/common/apis/fetch_alerts_index_names/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 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 * from './fetch_alerts_index_names'; +export * from './types'; diff --git a/packages/kbn-alerts-ui-shared/src/common/apis/fetch_alerts_index_names/types.ts b/packages/kbn-alerts-ui-shared/src/common/apis/fetch_alerts_index_names/types.ts new file mode 100644 index 0000000000000..ef74ad7dd09f6 --- /dev/null +++ b/packages/kbn-alerts-ui-shared/src/common/apis/fetch_alerts_index_names/types.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 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 { HttpSetup } from '@kbn/core-http-browser'; +import { ValidFeatureId } from '@kbn/rule-data-utils'; + +export interface FetchAlertsIndexNamesParams { + // Dependencies + http: HttpSetup; + + // Params + /** + * Array of feature ids used for authorization and area-based filtering + */ + featureIds: ValidFeatureId[]; +} diff --git a/packages/kbn-alerts-ui-shared/src/common/constants/alerts.ts b/packages/kbn-alerts-ui-shared/src/common/constants/alerts.ts new file mode 100644 index 0000000000000..858d5a3d53425 --- /dev/null +++ b/packages/kbn-alerts-ui-shared/src/common/constants/alerts.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { DataViewField } from '@kbn/data-views-plugin/common'; + +export const DEFAULT_ALERTS_PAGE_SIZE = 10; +export const EMPTY_AAD_FIELDS: DataViewField[] = []; diff --git a/packages/kbn-alerts-ui-shared/src/common/constants/index.ts b/packages/kbn-alerts-ui-shared/src/common/constants/index.ts index c3619df3ef99d..da5117831d092 100644 --- a/packages/kbn-alerts-ui-shared/src/common/constants/index.ts +++ b/packages/kbn-alerts-ui-shared/src/common/constants/index.ts @@ -6,5 +6,6 @@ * Side Public License, v 1. */ +export * from './alerts'; export * from './i18n_weekdays'; export * from './routes'; diff --git a/packages/kbn-alerts-ui-shared/src/common/constants/routes.ts b/packages/kbn-alerts-ui-shared/src/common/constants/routes.ts index 3bd42bbfd3f81..90ba57feb128b 100644 --- a/packages/kbn-alerts-ui-shared/src/common/constants/routes.ts +++ b/packages/kbn-alerts-ui-shared/src/common/constants/routes.ts @@ -6,14 +6,10 @@ * Side Public License, v 1. */ -import type { DataViewField } from '@kbn/data-views-plugin/common'; - export const ALERTS_FEATURE_ID = 'alerts'; export const BASE_ALERTING_API_PATH = '/api/alerting'; export const INTERNAL_BASE_ALERTING_API_PATH = '/internal/alerting'; export const BASE_RAC_ALERTS_API_PATH = '/internal/rac/alerts'; -export const EMPTY_AAD_FIELDS: DataViewField[] = []; export const BASE_TRIGGERS_ACTIONS_UI_API_PATH = '/internal/triggers_actions_ui'; -export const DEFAULT_ALERTS_PAGE_SIZE = 10; export const BASE_ACTION_API_PATH = '/api/actions'; export const INTERNAL_BASE_ACTION_API_PATH = '/internal/actions'; diff --git a/packages/kbn-alerts-ui-shared/src/common/hooks/index.ts b/packages/kbn-alerts-ui-shared/src/common/hooks/index.ts index ac7504eac2f82..06b1c77d5d3de 100644 --- a/packages/kbn-alerts-ui-shared/src/common/hooks/index.ts +++ b/packages/kbn-alerts-ui-shared/src/common/hooks/index.ts @@ -6,16 +6,14 @@ * Side Public License, v 1. */ -export * from './use_alert_data_view'; -export * from './use_find_alerts_query'; +export * from './use_alerts_data_view'; +export * from './use_create_rule'; +export * from './use_get_alerts_group_aggregations_query'; +export * from './use_health_check'; +export * from './use_load_alerting_framework_health'; export * from './use_load_rule_types_query'; -export * from './use_rule_aad_fields'; export * from './use_load_ui_config'; -export * from './use_health_check'; export * from './use_load_ui_health'; -export * from './use_load_alerting_framework_health'; -export * from './use_create_rule'; -export * from './use_update_rule'; export * from './use_resolve_rule'; -export * from './use_search_alerts_query'; -export * from './use_get_alerts_group_aggregations_query'; +export * from './use_rule_aad_fields'; +export * from './use_update_rule'; diff --git a/packages/kbn-alerts-ui-shared/src/common/hooks/use_alert_data_view.ts b/packages/kbn-alerts-ui-shared/src/common/hooks/use_alert_data_view.ts deleted file mode 100644 index dfa0bd12f85ae..0000000000000 --- a/packages/kbn-alerts-ui-shared/src/common/hooks/use_alert_data_view.ts +++ /dev/null @@ -1,166 +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 { useEffect, useMemo, useState } from 'react'; -import { i18n } from '@kbn/i18n'; -import type { DataView, DataViewsContract } from '@kbn/data-views-plugin/common'; -import { AlertConsumers, ValidFeatureId } from '@kbn/rule-data-utils'; -import type { ToastsStart, HttpStart } from '@kbn/core/public'; - -import { useQuery } from '@tanstack/react-query'; -import { useFetchAlertsFieldsQuery } from './use_fetch_alerts_fields_query'; -import { fetchAlertIndexNames } from '../apis/fetch_alert_index_names'; - -export interface UseAlertDataViewResult { - dataViews?: DataView[]; - loading: boolean; -} - -export interface UseAlertDataViewProps { - featureIds: ValidFeatureId[]; - http: HttpStart; - dataViewsService: DataViewsContract; - toasts: ToastsStart; -} - -export function useAlertDataView(props: UseAlertDataViewProps): UseAlertDataViewResult { - const { http, dataViewsService, toasts, featureIds } = props; - - const [dataViews, setDataViews] = useState([]); - const features = featureIds.sort().join(','); - const isOnlySecurity = featureIds.length === 1 && featureIds.includes(AlertConsumers.SIEM); - - const hasSecurityAndO11yFeatureIds = - featureIds.length > 1 && featureIds.includes(AlertConsumers.SIEM); - - const hasNoSecuritySolution = - featureIds.length > 0 && !isOnlySecurity && !hasSecurityAndO11yFeatureIds; - - const queryIndexNameFn = () => { - return fetchAlertIndexNames({ http, features }); - }; - - const onErrorFn = () => { - toasts.addDanger( - i18n.translate('alertsUIShared.hooks.useAlertDataView.useAlertDataMessage', { - defaultMessage: 'Unable to load alert data view', - }) - ); - }; - - const { - data: indexNames, - isSuccess: isIndexNameSuccess, - isInitialLoading: isIndexNameInitialLoading, - isLoading: isIndexNameLoading, - } = useQuery({ - queryKey: ['loadAlertIndexNames', features], - queryFn: queryIndexNameFn, - onError: onErrorFn, - refetchOnWindowFocus: false, - staleTime: 60 * 1000, // To prevent duplicated requests - enabled: featureIds.length > 0 && !hasSecurityAndO11yFeatureIds, - }); - - const { - data: { fields: alertFields }, - isSuccess: isAlertFieldsSuccess, - isInitialLoading: isAlertFieldsInitialLoading, - isLoading: isAlertFieldsLoading, - } = useFetchAlertsFieldsQuery( - { http, featureIds }, - { - onError: onErrorFn, - refetchOnWindowFocus: false, - staleTime: 60 * 1000, - enabled: hasNoSecuritySolution, - } - ); - - useEffect(() => { - return () => { - dataViews.map((dv) => { - dataViewsService.clearInstanceCache(dv.id); - }); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [dataViews]); - - // FUTURE ENGINEER this useEffect is for security solution user since - // we are using the user privilege to access the security alert index - useEffect(() => { - async function createDataView() { - const localDataview = await dataViewsService.create({ - title: (indexNames ?? []).join(','), - allowNoIndex: true, - }); - setDataViews([localDataview]); - } - - if (isOnlySecurity && isIndexNameSuccess) { - createDataView(); - } - }, [dataViewsService, indexNames, isIndexNameSuccess, isOnlySecurity]); - - // FUTURE ENGINEER this useEffect is for o11y and stack solution user since - // we are using the kibana user privilege to access the alert index - useEffect(() => { - if ( - indexNames && - alertFields && - !isOnlySecurity && - isAlertFieldsSuccess && - isIndexNameSuccess - ) { - setDataViews([ - { - title: (indexNames ?? []).join(','), - fieldFormatMap: {}, - fields: (alertFields ?? [])?.map((field) => { - return { - ...field, - ...(field.esTypes && field.esTypes.includes('flattened') ? { type: 'string' } : {}), - }; - }), - }, - ] as unknown as DataView[]); - } - }, [ - alertFields, - dataViewsService, - indexNames, - isIndexNameSuccess, - isOnlySecurity, - isAlertFieldsSuccess, - ]); - - return useMemo( - () => ({ - dataViews, - loading: - featureIds.length === 0 || hasSecurityAndO11yFeatureIds - ? false - : isOnlySecurity - ? isIndexNameInitialLoading || isIndexNameLoading || dataViews.length === 0 - : isIndexNameInitialLoading || - isIndexNameLoading || - isAlertFieldsInitialLoading || - isAlertFieldsLoading, - }), - [ - dataViews, - featureIds.length, - hasSecurityAndO11yFeatureIds, - isOnlySecurity, - isIndexNameInitialLoading, - isIndexNameLoading, - isAlertFieldsInitialLoading, - isAlertFieldsLoading, - ] - ); -} diff --git a/packages/kbn-alerts-ui-shared/src/common/hooks/use_alerts_data_view.test.tsx b/packages/kbn-alerts-ui-shared/src/common/hooks/use_alerts_data_view.test.tsx new file mode 100644 index 0000000000000..dbe46a9dbeefa --- /dev/null +++ b/packages/kbn-alerts-ui-shared/src/common/hooks/use_alerts_data_view.test.tsx @@ -0,0 +1,170 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { FunctionComponent } from 'react'; +import { AlertConsumers } from '@kbn/rule-data-utils'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { renderHook } from '@testing-library/react-hooks/dom'; +import { DataView } from '@kbn/data-views-plugin/common'; +import { httpServiceMock } from '@kbn/core-http-browser-mocks'; +import { notificationServiceMock } from '@kbn/core-notifications-browser-mocks'; +import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; +import { fetchAlertsIndexNames } from '../apis/fetch_alerts_index_names'; +import { fetchAlertsFields } from '../apis/fetch_alerts_fields'; +import { testQueryClientConfig } from '../test_utils/test_query_client_config'; +import { useAlertsDataView } from './use_alerts_data_view'; + +jest.mock('../apis/fetch_alerts_index_names'); +const mockFetchAlertsIndexNames = jest + .mocked(fetchAlertsIndexNames) + .mockResolvedValue([ + '.alerts-observability.uptime.alerts-*', + '.alerts-observability.metrics.alerts-*', + '.alerts-observability.logs.alerts-*', + '.alerts-observability.apm.alerts-*', + ]); + +jest.mock('../apis/fetch_alerts_fields'); +const mockFetchAlertsFields = jest + .mocked(fetchAlertsFields) + .mockResolvedValue({ browserFields: {}, fields: [] }); + +const mockDataView = { fields: [] } as unknown as DataView; + +const mockServices = { + http: httpServiceMock.createStartContract(), + toasts: notificationServiceMock.createStartContract().toasts, + dataViewsService: dataViewPluginMocks.createStartContract(), +}; +mockServices.dataViewsService.create.mockResolvedValue(mockDataView); + +const queryClient = new QueryClient(testQueryClientConfig); + +const wrapper: FunctionComponent = ({ children }) => ( + {children} +); + +describe('useAlertsDataView', () => { + const observabilityFeatureIds = [ + AlertConsumers.APM, + AlertConsumers.INFRASTRUCTURE, + AlertConsumers.LOGS, + AlertConsumers.UPTIME, + ]; + + beforeEach(() => { + jest.clearAllMocks(); + queryClient.clear(); + }); + + it('starts with a loading state and without data', async () => { + const mockedAsyncDataView = { + isLoading: true, + dataView: undefined, + }; + + const { result, waitFor } = renderHook( + () => + useAlertsDataView({ + ...mockServices, + featureIds: observabilityFeatureIds, + }), + { + wrapper, + } + ); + + await waitFor(() => expect(result.current).toEqual(mockedAsyncDataView)); + }); + + it('fetches indexes and fields for non-siem feature ids, returning a DataViewBase object', async () => { + const { result, waitForValueToChange } = renderHook( + () => + useAlertsDataView({ + ...mockServices, + featureIds: observabilityFeatureIds, + }), + { + wrapper, + } + ); + + await waitForValueToChange(() => result.current.isLoading, { timeout: 5000 }); + + expect(mockFetchAlertsFields).toHaveBeenCalledTimes(1); + expect(mockFetchAlertsIndexNames).toHaveBeenCalledTimes(1); + expect(result.current.dataView).not.toBe(mockDataView); + }); + + it('only fetches index names for the siem feature id, returning a DataView', async () => { + const { result, waitFor } = renderHook( + () => useAlertsDataView({ ...mockServices, featureIds: [AlertConsumers.SIEM] }), + { + wrapper, + } + ); + + await waitFor(() => expect(mockFetchAlertsIndexNames).toHaveBeenCalledTimes(1)); + expect(mockFetchAlertsFields).toHaveBeenCalledTimes(0); + + await waitFor(() => expect(result.current.dataView).toBe(mockDataView)); + }); + + it('does not fetch anything if siem and other feature ids are mixed together', async () => { + const { result, waitFor } = renderHook( + () => + useAlertsDataView({ + ...mockServices, + featureIds: [AlertConsumers.SIEM, AlertConsumers.LOGS], + }), + { + wrapper, + } + ); + + await waitFor(() => + expect(result.current).toEqual({ + isLoading: false, + dataView: undefined, + }) + ); + expect(mockFetchAlertsIndexNames).toHaveBeenCalledTimes(0); + expect(mockFetchAlertsFields).toHaveBeenCalledTimes(0); + }); + + it('returns an undefined data view if any of the queries fails', async () => { + mockFetchAlertsIndexNames.mockRejectedValue('error'); + + const { result, waitFor } = renderHook( + () => useAlertsDataView({ ...mockServices, featureIds: observabilityFeatureIds }), + { + wrapper, + } + ); + + await waitFor(() => + expect(result.current).toEqual({ + isLoading: false, + dataView: undefined, + }) + ); + }); + + it('shows an error toast if any of the queries fails', async () => { + mockFetchAlertsIndexNames.mockRejectedValue('error'); + + const { waitFor } = renderHook( + () => useAlertsDataView({ ...mockServices, featureIds: observabilityFeatureIds }), + { + wrapper, + } + ); + + await waitFor(() => expect(mockServices.toasts.addDanger).toHaveBeenCalled()); + }); +}); diff --git a/packages/kbn-alerts-ui-shared/src/common/hooks/use_alerts_data_view.ts b/packages/kbn-alerts-ui-shared/src/common/hooks/use_alerts_data_view.ts new file mode 100644 index 0000000000000..5d8b3a9ee109f --- /dev/null +++ b/packages/kbn-alerts-ui-shared/src/common/hooks/use_alerts_data_view.ts @@ -0,0 +1,196 @@ +/* + * 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 { useEffect, useMemo } from 'react'; +import { i18n } from '@kbn/i18n'; +import { DataView, DataViewsContract, FieldSpec } from '@kbn/data-views-plugin/common'; +import { AlertConsumers, ValidFeatureId } from '@kbn/rule-data-utils'; +import type { ToastsStart, HttpStart } from '@kbn/core/public'; + +import { DataViewBase } from '@kbn/es-query'; +import { useVirtualDataViewQuery } from './use_virtual_data_view_query'; +import { useFetchAlertsFieldsQuery } from './use_fetch_alerts_fields_query'; +import { useFetchAlertsIndexNamesQuery } from './use_fetch_alerts_index_names_query'; + +export interface UseAlertsDataViewParams { + // Dependencies + http: HttpStart; + dataViewsService: DataViewsContract; + toasts: ToastsStart; + + // Params + /** + * Array of feature ids used for authorization and area-based filtering + * + * Security data views must be requested in isolation (i.e. `['siem']`). If mixed with + * other feature ids, the resulting data view will be empty. + */ + featureIds: ValidFeatureId[]; +} + +export interface UseAlertsDataViewResult { + isLoading: boolean; + dataView?: Omit & { fields: FieldSpec[] }; +} + +/** + * Resolves the DataView or DataViewBase object + * + * Returns undefined if any of the dependencies are in error state + */ +const resolveDataView = ({ + isError, + fields, + indexNames, + virtualDataView, +}: { + isError: boolean; + virtualDataView?: DataView; + indexNames?: string[]; + fields?: { fields: FieldSpec[] }; +}) => { + if (isError) { + return; + } + // When the only feature id is Security Solution, use an in-memory data view: + // their alerting authorization is based on end-user privileges, which allows us to create + // an actual data view + if (virtualDataView) { + return virtualDataView; + } + // For all other feature id combinations, compute the data view from the fetched index names and + // fields since the Kibana-user-based authorization wouldn't allow us to create a data view + if (indexNames) { + return { + title: indexNames.join(','), + fieldFormatMap: {}, + fields: (fields?.fields ?? []).map((field) => { + return { + ...field, + ...(field.esTypes && field.esTypes.includes('flattened') ? { type: 'string' } : {}), + }; + }), + }; + } +}; + +/** + * Computes a {@link DataViewBase} object for alerts indices based on the provided feature ids + * + * @returns + * A {@link DataViewBase} object, intentionally not typed as a complete {@link DataView} object + * since only Security Solution uses an actual in-memory data view (when `featureIds = ['siem']). + * In all other cases the data view is computed from the index names and fields fetched from the + * alerting APIs. + */ +export const useAlertsDataView = ({ + http, + dataViewsService, + toasts, + featureIds, +}: UseAlertsDataViewParams): UseAlertsDataViewResult => { + const includesSecurity = featureIds.includes(AlertConsumers.SIEM); + const isOnlySecurity = featureIds.length === 1 && includesSecurity; + const hasMixedFeatureIds = featureIds.length > 1 && includesSecurity; + + const { + data: indexNames, + isError: isIndexNamesError, + isLoading: isLoadingIndexNames, + isInitialLoading: isInitialLoadingIndexNames, + } = useFetchAlertsIndexNamesQuery( + { http, featureIds }, + { + // Don't fetch index names when featureIds includes both Security Solution and other features + enabled: !!featureIds.length && (isOnlySecurity || !includesSecurity), + } + ); + + const { + data: fields, + isError: isFieldsError, + isLoading: isLoadingFields, + isInitialLoading: isInitialLoadingFields, + } = useFetchAlertsFieldsQuery( + { http, featureIds }, + { + // Don't fetch fields when featureIds includes Security Solution + enabled: !!featureIds.length && !includesSecurity, + } + ); + + const { data: virtualDataView, isError: isVirtualDataViewError } = useVirtualDataViewQuery( + { + dataViewsService, + indexNames, + }, + { + // Create data view only when featureIds = ['siem'] and indexNames have been fetched + enabled: isOnlySecurity && !!indexNames?.length, + } + ); + + useEffect(() => { + if (isIndexNamesError || isFieldsError || isVirtualDataViewError) { + toasts.addDanger( + i18n.translate('alertsUIShared.hooks.useAlertDataView.fetchErrorMessage', { + defaultMessage: 'Unable to load alert data view', + }) + ); + } + }, [isFieldsError, isIndexNamesError, isVirtualDataViewError, toasts]); + + const dataView = useMemo( + () => + resolveDataView({ + isError: isIndexNamesError || isFieldsError || isVirtualDataViewError, + fields, + indexNames, + virtualDataView: !isOnlySecurity ? undefined : virtualDataView, + }), + [ + fields, + indexNames, + isFieldsError, + isIndexNamesError, + isOnlySecurity, + isVirtualDataViewError, + virtualDataView, + ] + ); + + return useMemo(() => { + let isLoading: boolean; + if (!featureIds.length || hasMixedFeatureIds) { + isLoading = false; + } else { + if (isOnlySecurity) { + isLoading = isInitialLoadingIndexNames || isLoadingIndexNames || !dataView; + } else { + isLoading = + isInitialLoadingIndexNames || + isLoadingIndexNames || + isInitialLoadingFields || + isLoadingFields; + } + } + return { + dataView, + isLoading, + }; + }, [ + dataView, + featureIds.length, + hasMixedFeatureIds, + isInitialLoadingFields, + isInitialLoadingIndexNames, + isLoadingFields, + isLoadingIndexNames, + isOnlySecurity, + ]); +}; diff --git a/packages/kbn-alerts-ui-shared/src/common/hooks/use_fetch_alerts_fields_query.test.tsx b/packages/kbn-alerts-ui-shared/src/common/hooks/use_fetch_alerts_fields_query.test.tsx index adcf3b37e38cb..20bdc513fa617 100644 --- a/packages/kbn-alerts-ui-shared/src/common/hooks/use_fetch_alerts_fields_query.test.tsx +++ b/packages/kbn-alerts-ui-shared/src/common/hooks/use_fetch_alerts_fields_query.test.tsx @@ -7,12 +7,14 @@ */ import React, { FunctionComponent } from 'react'; -import type { HttpSetup } from '@kbn/core-http-browser'; import { AlertConsumers } from '@kbn/rule-data-utils'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import * as ReactQuery from '@tanstack/react-query'; import { renderHook } from '@testing-library/react-hooks'; import { testQueryClientConfig } from '../test_utils/test_query_client_config'; import { useFetchAlertsFieldsQuery } from './use_fetch_alerts_fields_query'; +import { httpServiceMock } from '@kbn/core-http-browser-mocks'; + +const { QueryClient, QueryClientProvider } = ReactQuery; const queryClient = new QueryClient(testQueryClientConfig); @@ -20,9 +22,9 @@ const wrapper: FunctionComponent = ({ children }) => ( {children} ); -const mockHttpClient = { - get: jest.fn(), -} as unknown as HttpSetup; +const useQuerySpy = jest.spyOn(ReactQuery, 'useQuery'); + +const mockHttpClient = httpServiceMock.createStartContract(); const emptyData = { browserFields: {}, fields: [] }; @@ -57,6 +59,30 @@ describe('useFetchAlertsFieldsQuery', () => { expect(result.current.data).toEqual(emptyData); }); + it('should correctly override the `enabled` option', () => { + const { rerender } = renderHook( + ({ featureIds, enabled }: { featureIds: AlertConsumers[]; enabled?: boolean }) => + useFetchAlertsFieldsQuery({ http: mockHttpClient, featureIds }, { enabled }), + { + wrapper, + initialProps: { + featureIds: ['apm'], + enabled: false, + }, + } + ); + + expect(useQuerySpy).toHaveBeenCalledWith(expect.objectContaining({ enabled: false })); + + rerender({ featureIds: [], enabled: true }); + + expect(useQuerySpy).toHaveBeenCalledWith(expect.objectContaining({ enabled: false })); + + rerender({ featureIds: ['apm'] }); + + expect(useQuerySpy).toHaveBeenCalledWith(expect.objectContaining({ enabled: true })); + }); + it('should call the api only once', async () => { const { result, rerender, waitForValueToChange } = renderHook( () => useFetchAlertsFieldsQuery({ http: mockHttpClient, featureIds: ['apm'] }), diff --git a/packages/kbn-alerts-ui-shared/src/common/hooks/use_fetch_alerts_fields_query.ts b/packages/kbn-alerts-ui-shared/src/common/hooks/use_fetch_alerts_fields_query.ts index 5d0f785335b22..f22ea573baf15 100644 --- a/packages/kbn-alerts-ui-shared/src/common/hooks/use_fetch_alerts_fields_query.ts +++ b/packages/kbn-alerts-ui-shared/src/common/hooks/use_fetch_alerts_fields_query.ts @@ -27,7 +27,7 @@ export const useFetchAlertsFieldsQuery = ( { http, ...params }: UseFetchAlertsFieldsQueryParams, options?: Pick< QueryOptionsOverrides, - 'context' | 'onError' | 'refetchOnWindowFocus' | 'staleTime' | 'enabled' + 'placeholderData' | 'context' | 'onError' | 'refetchOnWindowFocus' | 'staleTime' | 'enabled' > ) => { const { featureIds } = params; @@ -37,10 +37,12 @@ export const useFetchAlertsFieldsQuery = ( ); return useQuery({ - queryKey: queryKeyPrefix.concat(JSON.stringify(featureIds)), + queryKey: queryKeyPrefix.concat(featureIds), queryFn: () => fetchAlertsFields({ http, featureIds: validFeatureIds }), - enabled: validFeatureIds.length > 0, - initialData: { browserFields: {}, fields: [] }, + placeholderData: { browserFields: {}, fields: [] }, + staleTime: 60 * 1000, + refetchOnWindowFocus: false, ...options, + enabled: validFeatureIds.length > 0 && (options?.enabled == null || options.enabled), }); }; diff --git a/packages/kbn-alerts-ui-shared/src/common/hooks/use_fetch_alerts_index_names_query.test.tsx b/packages/kbn-alerts-ui-shared/src/common/hooks/use_fetch_alerts_index_names_query.test.tsx new file mode 100644 index 0000000000000..ebd4d534e09ee --- /dev/null +++ b/packages/kbn-alerts-ui-shared/src/common/hooks/use_fetch_alerts_index_names_query.test.tsx @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { FunctionComponent } from 'react'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { renderHook } from '@testing-library/react-hooks'; +import { testQueryClientConfig } from '../test_utils/test_query_client_config'; +import { useFetchAlertsIndexNamesQuery } from './use_fetch_alerts_index_names_query'; +import { fetchAlertsIndexNames } from '../apis/fetch_alerts_index_names'; +import { httpServiceMock } from '@kbn/core-http-browser-mocks'; + +jest.mock('../apis/fetch_alerts_index_names'); + +const queryClient = new QueryClient(testQueryClientConfig); + +const wrapper: FunctionComponent = ({ children }) => ( + {children} +); + +const mockHttpClient = httpServiceMock.createStartContract(); +const mockFetchAlertsIndexNames = jest.mocked(fetchAlertsIndexNames); + +describe('useFetchAlertsIndexNamesQuery', () => { + beforeEach(() => { + mockFetchAlertsIndexNames.mockResolvedValue(['test-index']); + }); + + afterEach(() => { + jest.clearAllMocks(); + queryClient.clear(); + }); + + it('does not fetch if featureIds is empty', () => { + renderHook(() => useFetchAlertsIndexNamesQuery({ http: mockHttpClient, featureIds: [] }), { + wrapper, + }); + + expect(mockFetchAlertsIndexNames).not.toHaveBeenCalled(); + }); + + it('calls fetchAlertsIndexNames with the correct parameters', () => { + renderHook(() => useFetchAlertsIndexNamesQuery({ http: mockHttpClient, featureIds: ['apm'] }), { + wrapper, + }); + + expect(mockFetchAlertsIndexNames).toHaveBeenCalledWith({ + http: mockHttpClient, + featureIds: ['apm'], + }); + }); + + it('correctly caches the index names', async () => { + const { result, rerender, waitForValueToChange } = renderHook( + () => useFetchAlertsIndexNamesQuery({ http: mockHttpClient, featureIds: ['apm'] }), + { + wrapper, + } + ); + + await waitForValueToChange(() => result.current.data); + + expect(mockFetchAlertsIndexNames).toHaveBeenCalledTimes(1); + + rerender(); + + expect(mockFetchAlertsIndexNames).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/kbn-alerts-ui-shared/src/common/hooks/use_fetch_alerts_index_names_query.ts b/packages/kbn-alerts-ui-shared/src/common/hooks/use_fetch_alerts_index_names_query.ts new file mode 100644 index 0000000000000..bc4c277ba5059 --- /dev/null +++ b/packages/kbn-alerts-ui-shared/src/common/hooks/use_fetch_alerts_index_names_query.ts @@ -0,0 +1,41 @@ +/* + * 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 { useQuery } from '@tanstack/react-query'; +import { + fetchAlertsIndexNames, + FetchAlertsIndexNamesParams, +} from '../apis/fetch_alerts_index_names'; +import type { QueryOptionsOverrides } from '../types/tanstack_query_utility_types'; + +export type UseFetchAlertsIndexNamesQueryParams = FetchAlertsIndexNamesParams; + +export const queryKeyPrefix = ['alerts', fetchAlertsIndexNames.name]; + +/** + * Fetch alerts index names feature ids + * + * When testing components that depend on this hook, prefer mocking the {@link fetchAlertsIndexNames} function instead of the hook itself. + * @external https://tanstack.com/query/v4/docs/framework/react/guides/testing + */ +export const useFetchAlertsIndexNamesQuery = ( + { http, featureIds }: UseFetchAlertsIndexNamesQueryParams, + options?: Pick< + QueryOptionsOverrides, + 'context' | 'onError' | 'refetchOnWindowFocus' | 'staleTime' | 'enabled' + > +) => { + return useQuery({ + queryKey: queryKeyPrefix.concat(featureIds), + queryFn: () => fetchAlertsIndexNames({ http, featureIds }), + enabled: featureIds.length > 0, + staleTime: 60 * 1000, + refetchOnWindowFocus: false, + ...options, + }); +}; diff --git a/packages/kbn-alerts-ui-shared/src/common/hooks/use_search_alerts_query.test.tsx b/packages/kbn-alerts-ui-shared/src/common/hooks/use_search_alerts_query.test.tsx index 30624b22772cb..893e28c6dc4f9 100644 --- a/packages/kbn-alerts-ui-shared/src/common/hooks/use_search_alerts_query.test.tsx +++ b/packages/kbn-alerts-ui-shared/src/common/hooks/use_search_alerts_query.test.tsx @@ -12,9 +12,10 @@ import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { IKibanaSearchResponse } from '@kbn/search-types'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { renderHook } from '@testing-library/react-hooks'; -import type { UseSearchAlertsQueryParams } from '../../..'; +import type { UseSearchAlertsQueryParams } from './use_search_alerts_query'; import { AlertsQueryContext } from '../contexts/alerts_query_context'; import { useSearchAlertsQuery } from './use_search_alerts_query'; +import { testQueryClientConfig } from '../test_utils/test_query_client_config'; const searchResponse = { id: '0', @@ -84,15 +85,7 @@ const expectedResponse: ReturnType['data'] = { ecsAlertsData: [], }; -const queryClient = new QueryClient({ - defaultOptions: { - queries: { - cacheTime: 0, - staleTime: 0, - retry: false, - }, - }, -}); +const queryClient = new QueryClient(testQueryClientConfig); describe('useSearchAlertsQuery', () => { const mockDataPlugin = { diff --git a/packages/kbn-alerts-ui-shared/src/common/hooks/use_virtual_data_view_query.test.tsx b/packages/kbn-alerts-ui-shared/src/common/hooks/use_virtual_data_view_query.test.tsx new file mode 100644 index 0000000000000..4bf57fc918393 --- /dev/null +++ b/packages/kbn-alerts-ui-shared/src/common/hooks/use_virtual_data_view_query.test.tsx @@ -0,0 +1,108 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { FunctionComponent } from 'react'; +import * as ReactQuery from '@tanstack/react-query'; +import { renderHook } from '@testing-library/react-hooks'; +import { testQueryClientConfig } from '../test_utils/test_query_client_config'; +import { queryKeyPrefix, useVirtualDataViewQuery } from './use_virtual_data_view_query'; +import { DataView } from '@kbn/data-views-plugin/common'; +import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; + +const { QueryClient, QueryClientProvider } = ReactQuery; +const useQuerySpy = jest.spyOn(ReactQuery, 'useQuery'); + +const queryClient = new QueryClient(testQueryClientConfig); + +const wrapper: FunctionComponent = ({ children }) => ( + {children} +); + +const mockDataView = { fields: [] } as unknown as DataView; + +const mockDataViewsService = dataViewPluginMocks.createStartContract(); +mockDataViewsService.create.mockResolvedValue(mockDataView); +mockDataViewsService.clearInstanceCache = jest.fn(); + +describe('useVirtualDataViewQuery', () => { + afterEach(() => { + jest.clearAllMocks(); + queryClient.clear(); + }); + + it('does not create a data view if indexNames is empty or nullish', () => { + const { rerender } = renderHook( + ({ indexNames }: { indexNames: string[] }) => + useVirtualDataViewQuery({ dataViewsService: mockDataViewsService, indexNames }), + { + wrapper, + } + ); + + expect(mockDataViewsService.create).not.toHaveBeenCalled(); + rerender({ indexNames: [] }); + expect(useQuerySpy).toHaveBeenCalledWith( + expect.objectContaining({ enabled: false, queryKey: queryKeyPrefix.concat([]) }) + ); + + expect(mockDataViewsService.create).not.toHaveBeenCalled(); + }); + + it('calls dataViewsService.create with the correct index names', () => { + const indexNames = ['.alerts-stack*', '.alerts-o11y*']; + renderHook( + () => useVirtualDataViewQuery({ dataViewsService: mockDataViewsService, indexNames }), + { + wrapper, + } + ); + + expect(mockDataViewsService.create).toHaveBeenCalledWith({ + title: indexNames.join(','), + allowNoIndex: true, + }); + }); + + it('correctly caches the data view', () => { + const { rerender } = renderHook( + () => + useVirtualDataViewQuery({ + dataViewsService: mockDataViewsService, + indexNames: ['.alerts-*'], + }), + { + wrapper, + } + ); + + expect(mockDataViewsService.create).toHaveBeenCalledTimes(1); + + rerender(); + + expect(mockDataViewsService.create).toHaveBeenCalledTimes(1); + }); + + it('removes the data view from the instance cache on unmount', async () => { + const { result, waitForValueToChange, unmount } = renderHook( + () => + useVirtualDataViewQuery({ + dataViewsService: mockDataViewsService, + indexNames: ['.alerts-*'], + }), + { + wrapper, + } + ); + + await waitForValueToChange(() => result.current.data); + + unmount(); + + expect(mockDataViewsService.clearInstanceCache).toHaveBeenCalled(); + }); +}); diff --git a/packages/kbn-alerts-ui-shared/src/common/hooks/use_virtual_data_view_query.ts b/packages/kbn-alerts-ui-shared/src/common/hooks/use_virtual_data_view_query.ts new file mode 100644 index 0000000000000..46eeb8f3065ff --- /dev/null +++ b/packages/kbn-alerts-ui-shared/src/common/hooks/use_virtual_data_view_query.ts @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { DataViewsContract } from '@kbn/data-views-plugin/common'; +import { useQuery } from '@tanstack/react-query'; +import { useEffect } from 'react'; +import { QueryOptionsOverrides } from '../types/tanstack_query_utility_types'; + +export interface UseVirtualDataViewParams { + // Dependencies + dataViewsService: DataViewsContract; + + // Params + /** + * The index names to create the data view for + */ + indexNames?: string[]; +} + +export const queryKeyPrefix = ['alerts', 'dataView']; + +/** + * Creates an in-memory data view, cached by index names + * + * When testing components that depend on this hook, prefer mocking {@link DataViewsContract}'s + * create and clearInstanceCache method instead of the hook itself. + * @external https://tanstack.com/query/v4/docs/framework/react/guides/testing + */ +export const useVirtualDataViewQuery = ( + { dataViewsService, indexNames }: UseVirtualDataViewParams, + options?: QueryOptionsOverrides +) => { + const query = useQuery({ + queryKey: queryKeyPrefix.concat(indexNames ?? []), + queryFn: () => + dataViewsService.create({ + title: (indexNames ?? []).join(','), + allowNoIndex: true, + }), + enabled: !!indexNames?.length, + staleTime: Infinity, + refetchOnWindowFocus: false, + ...options, + }); + + useEffect(() => { + // Cleanup the data view instance cache on unmount + if (query.data) { + return () => { + dataViewsService.clearInstanceCache(query.data.id); + }; + } + }, [dataViewsService, query.data]); + + return query; +}; diff --git a/packages/kbn-alerts-ui-shared/tsconfig.json b/packages/kbn-alerts-ui-shared/tsconfig.json index 653f26692bab1..79fc9d6fc9bdb 100644 --- a/packages/kbn-alerts-ui-shared/tsconfig.json +++ b/packages/kbn-alerts-ui-shared/tsconfig.json @@ -47,5 +47,7 @@ "@kbn/alerts-as-data-utils", "@kbn/test-jest-helpers", "@kbn/core-ui-settings-browser", + "@kbn/core-http-browser-mocks", + "@kbn/core-notifications-browser-mocks", ] } diff --git a/packages/kbn-discover-utils/index.ts b/packages/kbn-discover-utils/index.ts index 8194b8ddfc3a3..656d3e1cf0fec 100644 --- a/packages/kbn-discover-utils/index.ts +++ b/packages/kbn-discover-utils/index.ts @@ -28,6 +28,7 @@ export { SHOW_MULTIFIELDS, SORT_DEFAULT_ORDER_SETTING, TRUNCATE_MAX_HEIGHT, + TRUNCATE_MAX_HEIGHT_DEFAULT_VALUE, IgnoredReason, buildDataTableRecord, buildDataTableRecordList, @@ -43,6 +44,7 @@ export { isNestedFieldParent, isLegacyTableEnabled, usePager, + calcFieldCounts, getLogLevelColor, getLogLevelCoalescedValue, getLogLevelCoalescedValueLabel, diff --git a/packages/kbn-discover-utils/src/constants.ts b/packages/kbn-discover-utils/src/constants.ts index acd34290d29de..133621720aaf5 100644 --- a/packages/kbn-discover-utils/src/constants.ts +++ b/packages/kbn-discover-utils/src/constants.ts @@ -26,3 +26,4 @@ export const SHOW_FIELD_STATISTICS = 'discover:showFieldStatistics'; export const SHOW_MULTIFIELDS = 'discover:showMultiFields'; export const SORT_DEFAULT_ORDER_SETTING = 'discover:sort:defaultOrder'; export const TRUNCATE_MAX_HEIGHT = 'truncate:maxHeight'; +export const TRUNCATE_MAX_HEIGHT_DEFAULT_VALUE = 115; diff --git a/src/plugins/discover/public/application/main/utils/calc_field_counts.test.ts b/packages/kbn-discover-utils/src/utils/calc_field_counts.test.ts similarity index 95% rename from src/plugins/discover/public/application/main/utils/calc_field_counts.test.ts rename to packages/kbn-discover-utils/src/utils/calc_field_counts.test.ts index c1740cf3a4fd4..d9ab0a2e14bb8 100644 --- a/src/plugins/discover/public/application/main/utils/calc_field_counts.test.ts +++ b/packages/kbn-discover-utils/src/utils/calc_field_counts.test.ts @@ -7,7 +7,7 @@ */ import { calcFieldCounts } from './calc_field_counts'; -import { buildDataTableRecord } from '@kbn/discover-utils'; +import { buildDataTableRecord } from './build_data_record'; describe('calcFieldCounts', () => { test('returns valid field count data', async () => { diff --git a/src/plugins/discover/public/application/main/utils/calc_field_counts.ts b/packages/kbn-discover-utils/src/utils/calc_field_counts.ts similarity index 92% rename from src/plugins/discover/public/application/main/utils/calc_field_counts.ts rename to packages/kbn-discover-utils/src/utils/calc_field_counts.ts index 8f4fe80762795..5d218c17eff34 100644 --- a/src/plugins/discover/public/application/main/utils/calc_field_counts.ts +++ b/packages/kbn-discover-utils/src/utils/calc_field_counts.ts @@ -5,7 +5,7 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import type { DataTableRecord } from '@kbn/discover-utils/types'; +import type { DataTableRecord } from '../types'; /** * This function is calculating stats of the available fields, for usage in sidebar and sharing diff --git a/packages/kbn-discover-utils/src/utils/index.ts b/packages/kbn-discover-utils/src/utils/index.ts index 399d4e8ba298e..fd368beda5d7c 100644 --- a/packages/kbn-discover-utils/src/utils/index.ts +++ b/packages/kbn-discover-utils/src/utils/index.ts @@ -15,4 +15,5 @@ export * from './get_log_document_overview'; export * from './get_message_field_with_fallbacks'; export * from './get_should_show_field_handler'; export * from './nested_fields'; +export * from './calc_field_counts'; export { isLegacyTableEnabled } from './is_legacy_table_enabled'; diff --git a/packages/kbn-eslint-config/.eslintrc.js b/packages/kbn-eslint-config/.eslintrc.js index b14cd62dbf7ab..1391c842b235a 100644 --- a/packages/kbn-eslint-config/.eslintrc.js +++ b/packages/kbn-eslint-config/.eslintrc.js @@ -1,3 +1,22 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + const { USES_STYLED_COMPONENTS } = require('@kbn/babel-preset/styled_components_files'); module.exports = { @@ -9,6 +28,7 @@ module.exports = { '@kbn/eslint-plugin-imports', '@kbn/eslint-plugin-telemetry', '@kbn/eslint-plugin-i18n', + 'eslint-plugin-depend', 'prettier', ], @@ -21,6 +41,19 @@ module.exports = { }, rules: { + // Suggests better replacements for packages: https://github.com/es-tooling/module-replacements/tree/main/docs/modules + 'depend/ban-dependencies': [ + 'error', + { + allowed: [ + '^@kbn/*', // internal packages + 'lodash', // https://github.com/es-tooling/module-replacements/blob/main/docs/modules/lodash-underscore.md + 'moment', // https://github.com/es-tooling/module-replacements/blob/main/docs/modules/momentjs.md + 'jquery', // https://github.com/es-tooling/module-replacements/blob/main/docs/modules/jquery.md + ], + }, + ], + 'prettier/prettier': [ 'error', { @@ -80,9 +113,7 @@ module.exports = { from: 'react-intl', to: '@kbn/i18n-react', disallowedMessage: `import from @kbn/i18n-react instead`, - exclude: [ - /packages[\/\\]kbn-i18n-react[\/\\]/, - ] + exclude: [/packages[\/\\]kbn-i18n-react[\/\\]/], }, { from: 'styled-components', diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 b/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 index f5d535e430b62..f9aa94252ee4d 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 @@ -30,6 +30,7 @@ SHOW : 'show' -> pushMode(SHOW_MODE); SORT : 'sort' -> pushMode(EXPRESSION_MODE); STATS : 'stats' -> pushMode(EXPRESSION_MODE); WHERE : 'where' -> pushMode(EXPRESSION_MODE); +MATCH : 'match' -> pushMode(EXPRESSION_MODE); UNKNOWN_CMD : ~[ \r\n\t[\]/]+ -> pushMode(EXPRESSION_MODE); LINE_COMMENT @@ -145,7 +146,7 @@ IS: 'is'; LAST : 'last'; LIKE: 'like'; LP : '('; -MATCH: 'match'; +MATCH_OPERATOR: 'match'; NOT : 'not'; NULL : 'null'; NULLS : 'nulls'; diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.interp b/packages/kbn-esql-ast/src/antlr/esql_lexer.interp index 2eb135a257955..079b01d721517 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.interp +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.interp @@ -28,6 +28,7 @@ null null null null +null '|' null null @@ -47,7 +48,7 @@ null 'last' 'like' '(' -'match' +null 'not' 'null' 'nulls' @@ -148,6 +149,7 @@ SHOW SORT STATS WHERE +MATCH UNKNOWN_CMD LINE_COMMENT MULTILINE_COMMENT @@ -175,7 +177,7 @@ IS LAST LIKE LP -MATCH +MATCH_OPERATOR NOT NULL NULLS @@ -275,6 +277,7 @@ SHOW SORT STATS WHERE +MATCH UNKNOWN_CMD LINE_COMMENT MULTILINE_COMMENT @@ -315,7 +318,7 @@ IS LAST LIKE LP -MATCH +MATCH_OPERATOR NOT NULL NULLS @@ -474,4 +477,4 @@ METRICS_MODE CLOSING_METRICS_MODE atn: -[4, 0, 125, 1458, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 4, 20, 577, 8, 20, 11, 20, 12, 20, 578, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 587, 8, 21, 10, 21, 12, 21, 590, 9, 21, 1, 21, 3, 21, 593, 8, 21, 1, 21, 3, 21, 596, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 605, 8, 22, 10, 22, 12, 22, 608, 9, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 4, 23, 616, 8, 23, 11, 23, 12, 23, 617, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 3, 24, 625, 8, 24, 1, 25, 4, 25, 628, 8, 25, 11, 25, 12, 25, 629, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 3, 36, 669, 8, 36, 1, 36, 4, 36, 672, 8, 36, 11, 36, 12, 36, 673, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 3, 39, 683, 8, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 3, 41, 690, 8, 41, 1, 42, 1, 42, 1, 42, 5, 42, 695, 8, 42, 10, 42, 12, 42, 698, 9, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 706, 8, 42, 10, 42, 12, 42, 709, 9, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 716, 8, 42, 1, 42, 3, 42, 719, 8, 42, 3, 42, 721, 8, 42, 1, 43, 4, 43, 724, 8, 43, 11, 43, 12, 43, 725, 1, 44, 4, 44, 729, 8, 44, 11, 44, 12, 44, 730, 1, 44, 1, 44, 5, 44, 735, 8, 44, 10, 44, 12, 44, 738, 9, 44, 1, 44, 1, 44, 4, 44, 742, 8, 44, 11, 44, 12, 44, 743, 1, 44, 4, 44, 747, 8, 44, 11, 44, 12, 44, 748, 1, 44, 1, 44, 5, 44, 753, 8, 44, 10, 44, 12, 44, 756, 9, 44, 3, 44, 758, 8, 44, 1, 44, 1, 44, 1, 44, 1, 44, 4, 44, 764, 8, 44, 11, 44, 12, 44, 765, 1, 44, 1, 44, 3, 44, 770, 8, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 78, 1, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 5, 81, 898, 8, 81, 10, 81, 12, 81, 901, 9, 81, 1, 81, 1, 81, 4, 81, 905, 8, 81, 11, 81, 12, 81, 906, 3, 81, 909, 8, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 5, 84, 923, 8, 84, 10, 84, 12, 84, 926, 9, 84, 1, 84, 1, 84, 3, 84, 930, 8, 84, 1, 84, 4, 84, 933, 8, 84, 11, 84, 12, 84, 934, 3, 84, 937, 8, 84, 1, 85, 1, 85, 4, 85, 941, 8, 85, 11, 85, 12, 85, 942, 1, 85, 1, 85, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 3, 105, 1032, 8, 105, 1, 106, 1, 106, 3, 106, 1036, 8, 106, 1, 106, 5, 106, 1039, 8, 106, 10, 106, 12, 106, 1042, 9, 106, 1, 106, 1, 106, 3, 106, 1046, 8, 106, 1, 106, 4, 106, 1049, 8, 106, 11, 106, 12, 106, 1050, 3, 106, 1053, 8, 106, 1, 107, 1, 107, 4, 107, 1057, 8, 107, 11, 107, 12, 107, 1058, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 125, 4, 125, 1134, 8, 125, 11, 125, 12, 125, 1135, 1, 125, 1, 125, 3, 125, 1140, 8, 125, 1, 125, 4, 125, 1143, 8, 125, 11, 125, 12, 125, 1144, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 4, 176, 1367, 8, 176, 11, 176, 12, 176, 1368, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 2, 606, 707, 0, 195, 16, 1, 18, 2, 20, 3, 22, 4, 24, 5, 26, 6, 28, 7, 30, 8, 32, 9, 34, 10, 36, 11, 38, 12, 40, 13, 42, 14, 44, 15, 46, 16, 48, 17, 50, 18, 52, 19, 54, 20, 56, 21, 58, 22, 60, 23, 62, 24, 64, 0, 66, 25, 68, 0, 70, 0, 72, 26, 74, 27, 76, 28, 78, 29, 80, 0, 82, 0, 84, 0, 86, 0, 88, 0, 90, 0, 92, 0, 94, 0, 96, 0, 98, 0, 100, 30, 102, 31, 104, 32, 106, 33, 108, 34, 110, 35, 112, 36, 114, 37, 116, 38, 118, 39, 120, 40, 122, 41, 124, 42, 126, 43, 128, 44, 130, 45, 132, 46, 134, 47, 136, 48, 138, 49, 140, 50, 142, 51, 144, 52, 146, 53, 148, 54, 150, 55, 152, 56, 154, 57, 156, 58, 158, 59, 160, 60, 162, 61, 164, 62, 166, 63, 168, 64, 170, 65, 172, 66, 174, 67, 176, 68, 178, 69, 180, 70, 182, 71, 184, 72, 186, 0, 188, 73, 190, 74, 192, 75, 194, 76, 196, 0, 198, 0, 200, 0, 202, 0, 204, 0, 206, 0, 208, 77, 210, 0, 212, 0, 214, 78, 216, 79, 218, 80, 220, 0, 222, 0, 224, 0, 226, 0, 228, 0, 230, 81, 232, 82, 234, 83, 236, 84, 238, 0, 240, 0, 242, 0, 244, 0, 246, 85, 248, 0, 250, 86, 252, 87, 254, 88, 256, 0, 258, 0, 260, 89, 262, 90, 264, 0, 266, 91, 268, 0, 270, 92, 272, 93, 274, 94, 276, 0, 278, 0, 280, 0, 282, 0, 284, 0, 286, 0, 288, 0, 290, 95, 292, 96, 294, 97, 296, 0, 298, 0, 300, 0, 302, 0, 304, 0, 306, 0, 308, 0, 310, 98, 312, 99, 314, 100, 316, 0, 318, 0, 320, 0, 322, 0, 324, 101, 326, 102, 328, 103, 330, 0, 332, 0, 334, 0, 336, 0, 338, 104, 340, 105, 342, 106, 344, 0, 346, 107, 348, 108, 350, 109, 352, 110, 354, 0, 356, 111, 358, 112, 360, 113, 362, 114, 364, 0, 366, 115, 368, 116, 370, 117, 372, 118, 374, 119, 376, 0, 378, 0, 380, 0, 382, 120, 384, 121, 386, 122, 388, 0, 390, 0, 392, 123, 394, 124, 396, 125, 398, 0, 400, 0, 402, 0, 404, 0, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 85, 85, 117, 117, 2, 0, 87, 87, 119, 119, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 11, 0, 9, 10, 13, 13, 32, 32, 34, 34, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1484, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 1, 68, 1, 0, 0, 0, 1, 70, 1, 0, 0, 0, 1, 72, 1, 0, 0, 0, 1, 74, 1, 0, 0, 0, 1, 76, 1, 0, 0, 0, 2, 78, 1, 0, 0, 0, 2, 100, 1, 0, 0, 0, 2, 102, 1, 0, 0, 0, 2, 104, 1, 0, 0, 0, 2, 106, 1, 0, 0, 0, 2, 108, 1, 0, 0, 0, 2, 110, 1, 0, 0, 0, 2, 112, 1, 0, 0, 0, 2, 114, 1, 0, 0, 0, 2, 116, 1, 0, 0, 0, 2, 118, 1, 0, 0, 0, 2, 120, 1, 0, 0, 0, 2, 122, 1, 0, 0, 0, 2, 124, 1, 0, 0, 0, 2, 126, 1, 0, 0, 0, 2, 128, 1, 0, 0, 0, 2, 130, 1, 0, 0, 0, 2, 132, 1, 0, 0, 0, 2, 134, 1, 0, 0, 0, 2, 136, 1, 0, 0, 0, 2, 138, 1, 0, 0, 0, 2, 140, 1, 0, 0, 0, 2, 142, 1, 0, 0, 0, 2, 144, 1, 0, 0, 0, 2, 146, 1, 0, 0, 0, 2, 148, 1, 0, 0, 0, 2, 150, 1, 0, 0, 0, 2, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 2, 156, 1, 0, 0, 0, 2, 158, 1, 0, 0, 0, 2, 160, 1, 0, 0, 0, 2, 162, 1, 0, 0, 0, 2, 164, 1, 0, 0, 0, 2, 166, 1, 0, 0, 0, 2, 168, 1, 0, 0, 0, 2, 170, 1, 0, 0, 0, 2, 172, 1, 0, 0, 0, 2, 174, 1, 0, 0, 0, 2, 176, 1, 0, 0, 0, 2, 178, 1, 0, 0, 0, 2, 180, 1, 0, 0, 0, 2, 182, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 2, 188, 1, 0, 0, 0, 2, 190, 1, 0, 0, 0, 2, 192, 1, 0, 0, 0, 2, 194, 1, 0, 0, 0, 3, 196, 1, 0, 0, 0, 3, 198, 1, 0, 0, 0, 3, 200, 1, 0, 0, 0, 3, 202, 1, 0, 0, 0, 3, 204, 1, 0, 0, 0, 3, 206, 1, 0, 0, 0, 3, 208, 1, 0, 0, 0, 3, 210, 1, 0, 0, 0, 3, 212, 1, 0, 0, 0, 3, 214, 1, 0, 0, 0, 3, 216, 1, 0, 0, 0, 3, 218, 1, 0, 0, 0, 4, 220, 1, 0, 0, 0, 4, 222, 1, 0, 0, 0, 4, 224, 1, 0, 0, 0, 4, 230, 1, 0, 0, 0, 4, 232, 1, 0, 0, 0, 4, 234, 1, 0, 0, 0, 4, 236, 1, 0, 0, 0, 5, 238, 1, 0, 0, 0, 5, 240, 1, 0, 0, 0, 5, 242, 1, 0, 0, 0, 5, 244, 1, 0, 0, 0, 5, 246, 1, 0, 0, 0, 5, 248, 1, 0, 0, 0, 5, 250, 1, 0, 0, 0, 5, 252, 1, 0, 0, 0, 5, 254, 1, 0, 0, 0, 6, 256, 1, 0, 0, 0, 6, 258, 1, 0, 0, 0, 6, 260, 1, 0, 0, 0, 6, 262, 1, 0, 0, 0, 6, 266, 1, 0, 0, 0, 6, 268, 1, 0, 0, 0, 6, 270, 1, 0, 0, 0, 6, 272, 1, 0, 0, 0, 6, 274, 1, 0, 0, 0, 7, 276, 1, 0, 0, 0, 7, 278, 1, 0, 0, 0, 7, 280, 1, 0, 0, 0, 7, 282, 1, 0, 0, 0, 7, 284, 1, 0, 0, 0, 7, 286, 1, 0, 0, 0, 7, 288, 1, 0, 0, 0, 7, 290, 1, 0, 0, 0, 7, 292, 1, 0, 0, 0, 7, 294, 1, 0, 0, 0, 8, 296, 1, 0, 0, 0, 8, 298, 1, 0, 0, 0, 8, 300, 1, 0, 0, 0, 8, 302, 1, 0, 0, 0, 8, 304, 1, 0, 0, 0, 8, 306, 1, 0, 0, 0, 8, 308, 1, 0, 0, 0, 8, 310, 1, 0, 0, 0, 8, 312, 1, 0, 0, 0, 8, 314, 1, 0, 0, 0, 9, 316, 1, 0, 0, 0, 9, 318, 1, 0, 0, 0, 9, 320, 1, 0, 0, 0, 9, 322, 1, 0, 0, 0, 9, 324, 1, 0, 0, 0, 9, 326, 1, 0, 0, 0, 9, 328, 1, 0, 0, 0, 10, 330, 1, 0, 0, 0, 10, 332, 1, 0, 0, 0, 10, 334, 1, 0, 0, 0, 10, 336, 1, 0, 0, 0, 10, 338, 1, 0, 0, 0, 10, 340, 1, 0, 0, 0, 10, 342, 1, 0, 0, 0, 11, 344, 1, 0, 0, 0, 11, 346, 1, 0, 0, 0, 11, 348, 1, 0, 0, 0, 11, 350, 1, 0, 0, 0, 11, 352, 1, 0, 0, 0, 12, 354, 1, 0, 0, 0, 12, 356, 1, 0, 0, 0, 12, 358, 1, 0, 0, 0, 12, 360, 1, 0, 0, 0, 12, 362, 1, 0, 0, 0, 13, 364, 1, 0, 0, 0, 13, 366, 1, 0, 0, 0, 13, 368, 1, 0, 0, 0, 13, 370, 1, 0, 0, 0, 13, 372, 1, 0, 0, 0, 13, 374, 1, 0, 0, 0, 14, 376, 1, 0, 0, 0, 14, 378, 1, 0, 0, 0, 14, 380, 1, 0, 0, 0, 14, 382, 1, 0, 0, 0, 14, 384, 1, 0, 0, 0, 14, 386, 1, 0, 0, 0, 15, 388, 1, 0, 0, 0, 15, 390, 1, 0, 0, 0, 15, 392, 1, 0, 0, 0, 15, 394, 1, 0, 0, 0, 15, 396, 1, 0, 0, 0, 15, 398, 1, 0, 0, 0, 15, 400, 1, 0, 0, 0, 15, 402, 1, 0, 0, 0, 15, 404, 1, 0, 0, 0, 16, 406, 1, 0, 0, 0, 18, 416, 1, 0, 0, 0, 20, 423, 1, 0, 0, 0, 22, 432, 1, 0, 0, 0, 24, 439, 1, 0, 0, 0, 26, 449, 1, 0, 0, 0, 28, 456, 1, 0, 0, 0, 30, 463, 1, 0, 0, 0, 32, 477, 1, 0, 0, 0, 34, 484, 1, 0, 0, 0, 36, 492, 1, 0, 0, 0, 38, 501, 1, 0, 0, 0, 40, 508, 1, 0, 0, 0, 42, 518, 1, 0, 0, 0, 44, 530, 1, 0, 0, 0, 46, 539, 1, 0, 0, 0, 48, 545, 1, 0, 0, 0, 50, 552, 1, 0, 0, 0, 52, 559, 1, 0, 0, 0, 54, 567, 1, 0, 0, 0, 56, 576, 1, 0, 0, 0, 58, 582, 1, 0, 0, 0, 60, 599, 1, 0, 0, 0, 62, 615, 1, 0, 0, 0, 64, 624, 1, 0, 0, 0, 66, 627, 1, 0, 0, 0, 68, 631, 1, 0, 0, 0, 70, 636, 1, 0, 0, 0, 72, 641, 1, 0, 0, 0, 74, 645, 1, 0, 0, 0, 76, 649, 1, 0, 0, 0, 78, 653, 1, 0, 0, 0, 80, 657, 1, 0, 0, 0, 82, 659, 1, 0, 0, 0, 84, 661, 1, 0, 0, 0, 86, 664, 1, 0, 0, 0, 88, 666, 1, 0, 0, 0, 90, 675, 1, 0, 0, 0, 92, 677, 1, 0, 0, 0, 94, 682, 1, 0, 0, 0, 96, 684, 1, 0, 0, 0, 98, 689, 1, 0, 0, 0, 100, 720, 1, 0, 0, 0, 102, 723, 1, 0, 0, 0, 104, 769, 1, 0, 0, 0, 106, 771, 1, 0, 0, 0, 108, 774, 1, 0, 0, 0, 110, 778, 1, 0, 0, 0, 112, 782, 1, 0, 0, 0, 114, 784, 1, 0, 0, 0, 116, 787, 1, 0, 0, 0, 118, 789, 1, 0, 0, 0, 120, 794, 1, 0, 0, 0, 122, 796, 1, 0, 0, 0, 124, 802, 1, 0, 0, 0, 126, 808, 1, 0, 0, 0, 128, 811, 1, 0, 0, 0, 130, 814, 1, 0, 0, 0, 132, 819, 1, 0, 0, 0, 134, 824, 1, 0, 0, 0, 136, 826, 1, 0, 0, 0, 138, 832, 1, 0, 0, 0, 140, 836, 1, 0, 0, 0, 142, 841, 1, 0, 0, 0, 144, 847, 1, 0, 0, 0, 146, 850, 1, 0, 0, 0, 148, 852, 1, 0, 0, 0, 150, 858, 1, 0, 0, 0, 152, 860, 1, 0, 0, 0, 154, 865, 1, 0, 0, 0, 156, 868, 1, 0, 0, 0, 158, 871, 1, 0, 0, 0, 160, 874, 1, 0, 0, 0, 162, 876, 1, 0, 0, 0, 164, 879, 1, 0, 0, 0, 166, 881, 1, 0, 0, 0, 168, 884, 1, 0, 0, 0, 170, 886, 1, 0, 0, 0, 172, 888, 1, 0, 0, 0, 174, 890, 1, 0, 0, 0, 176, 892, 1, 0, 0, 0, 178, 908, 1, 0, 0, 0, 180, 910, 1, 0, 0, 0, 182, 915, 1, 0, 0, 0, 184, 936, 1, 0, 0, 0, 186, 938, 1, 0, 0, 0, 188, 946, 1, 0, 0, 0, 190, 948, 1, 0, 0, 0, 192, 952, 1, 0, 0, 0, 194, 956, 1, 0, 0, 0, 196, 960, 1, 0, 0, 0, 198, 965, 1, 0, 0, 0, 200, 969, 1, 0, 0, 0, 202, 973, 1, 0, 0, 0, 204, 977, 1, 0, 0, 0, 206, 981, 1, 0, 0, 0, 208, 985, 1, 0, 0, 0, 210, 994, 1, 0, 0, 0, 212, 998, 1, 0, 0, 0, 214, 1002, 1, 0, 0, 0, 216, 1006, 1, 0, 0, 0, 218, 1010, 1, 0, 0, 0, 220, 1014, 1, 0, 0, 0, 222, 1019, 1, 0, 0, 0, 224, 1023, 1, 0, 0, 0, 226, 1031, 1, 0, 0, 0, 228, 1052, 1, 0, 0, 0, 230, 1056, 1, 0, 0, 0, 232, 1060, 1, 0, 0, 0, 234, 1064, 1, 0, 0, 0, 236, 1068, 1, 0, 0, 0, 238, 1072, 1, 0, 0, 0, 240, 1077, 1, 0, 0, 0, 242, 1081, 1, 0, 0, 0, 244, 1085, 1, 0, 0, 0, 246, 1089, 1, 0, 0, 0, 248, 1092, 1, 0, 0, 0, 250, 1096, 1, 0, 0, 0, 252, 1100, 1, 0, 0, 0, 254, 1104, 1, 0, 0, 0, 256, 1108, 1, 0, 0, 0, 258, 1113, 1, 0, 0, 0, 260, 1118, 1, 0, 0, 0, 262, 1123, 1, 0, 0, 0, 264, 1130, 1, 0, 0, 0, 266, 1139, 1, 0, 0, 0, 268, 1146, 1, 0, 0, 0, 270, 1150, 1, 0, 0, 0, 272, 1154, 1, 0, 0, 0, 274, 1158, 1, 0, 0, 0, 276, 1162, 1, 0, 0, 0, 278, 1168, 1, 0, 0, 0, 280, 1172, 1, 0, 0, 0, 282, 1176, 1, 0, 0, 0, 284, 1180, 1, 0, 0, 0, 286, 1184, 1, 0, 0, 0, 288, 1188, 1, 0, 0, 0, 290, 1192, 1, 0, 0, 0, 292, 1196, 1, 0, 0, 0, 294, 1200, 1, 0, 0, 0, 296, 1204, 1, 0, 0, 0, 298, 1209, 1, 0, 0, 0, 300, 1213, 1, 0, 0, 0, 302, 1217, 1, 0, 0, 0, 304, 1221, 1, 0, 0, 0, 306, 1226, 1, 0, 0, 0, 308, 1230, 1, 0, 0, 0, 310, 1234, 1, 0, 0, 0, 312, 1238, 1, 0, 0, 0, 314, 1242, 1, 0, 0, 0, 316, 1246, 1, 0, 0, 0, 318, 1252, 1, 0, 0, 0, 320, 1256, 1, 0, 0, 0, 322, 1260, 1, 0, 0, 0, 324, 1264, 1, 0, 0, 0, 326, 1268, 1, 0, 0, 0, 328, 1272, 1, 0, 0, 0, 330, 1276, 1, 0, 0, 0, 332, 1281, 1, 0, 0, 0, 334, 1285, 1, 0, 0, 0, 336, 1289, 1, 0, 0, 0, 338, 1293, 1, 0, 0, 0, 340, 1297, 1, 0, 0, 0, 342, 1301, 1, 0, 0, 0, 344, 1305, 1, 0, 0, 0, 346, 1310, 1, 0, 0, 0, 348, 1315, 1, 0, 0, 0, 350, 1319, 1, 0, 0, 0, 352, 1323, 1, 0, 0, 0, 354, 1327, 1, 0, 0, 0, 356, 1332, 1, 0, 0, 0, 358, 1342, 1, 0, 0, 0, 360, 1346, 1, 0, 0, 0, 362, 1350, 1, 0, 0, 0, 364, 1354, 1, 0, 0, 0, 366, 1359, 1, 0, 0, 0, 368, 1366, 1, 0, 0, 0, 370, 1370, 1, 0, 0, 0, 372, 1374, 1, 0, 0, 0, 374, 1378, 1, 0, 0, 0, 376, 1382, 1, 0, 0, 0, 378, 1387, 1, 0, 0, 0, 380, 1393, 1, 0, 0, 0, 382, 1399, 1, 0, 0, 0, 384, 1403, 1, 0, 0, 0, 386, 1407, 1, 0, 0, 0, 388, 1411, 1, 0, 0, 0, 390, 1417, 1, 0, 0, 0, 392, 1423, 1, 0, 0, 0, 394, 1427, 1, 0, 0, 0, 396, 1431, 1, 0, 0, 0, 398, 1435, 1, 0, 0, 0, 400, 1441, 1, 0, 0, 0, 402, 1447, 1, 0, 0, 0, 404, 1453, 1, 0, 0, 0, 406, 407, 7, 0, 0, 0, 407, 408, 7, 1, 0, 0, 408, 409, 7, 2, 0, 0, 409, 410, 7, 2, 0, 0, 410, 411, 7, 3, 0, 0, 411, 412, 7, 4, 0, 0, 412, 413, 7, 5, 0, 0, 413, 414, 1, 0, 0, 0, 414, 415, 6, 0, 0, 0, 415, 17, 1, 0, 0, 0, 416, 417, 7, 0, 0, 0, 417, 418, 7, 6, 0, 0, 418, 419, 7, 7, 0, 0, 419, 420, 7, 8, 0, 0, 420, 421, 1, 0, 0, 0, 421, 422, 6, 1, 1, 0, 422, 19, 1, 0, 0, 0, 423, 424, 7, 3, 0, 0, 424, 425, 7, 9, 0, 0, 425, 426, 7, 6, 0, 0, 426, 427, 7, 1, 0, 0, 427, 428, 7, 4, 0, 0, 428, 429, 7, 10, 0, 0, 429, 430, 1, 0, 0, 0, 430, 431, 6, 2, 2, 0, 431, 21, 1, 0, 0, 0, 432, 433, 7, 3, 0, 0, 433, 434, 7, 11, 0, 0, 434, 435, 7, 12, 0, 0, 435, 436, 7, 13, 0, 0, 436, 437, 1, 0, 0, 0, 437, 438, 6, 3, 0, 0, 438, 23, 1, 0, 0, 0, 439, 440, 7, 3, 0, 0, 440, 441, 7, 14, 0, 0, 441, 442, 7, 8, 0, 0, 442, 443, 7, 13, 0, 0, 443, 444, 7, 12, 0, 0, 444, 445, 7, 1, 0, 0, 445, 446, 7, 9, 0, 0, 446, 447, 1, 0, 0, 0, 447, 448, 6, 4, 3, 0, 448, 25, 1, 0, 0, 0, 449, 450, 7, 15, 0, 0, 450, 451, 7, 6, 0, 0, 451, 452, 7, 7, 0, 0, 452, 453, 7, 16, 0, 0, 453, 454, 1, 0, 0, 0, 454, 455, 6, 5, 4, 0, 455, 27, 1, 0, 0, 0, 456, 457, 7, 17, 0, 0, 457, 458, 7, 6, 0, 0, 458, 459, 7, 7, 0, 0, 459, 460, 7, 18, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 6, 6, 0, 0, 462, 29, 1, 0, 0, 0, 463, 464, 7, 1, 0, 0, 464, 465, 7, 9, 0, 0, 465, 466, 7, 13, 0, 0, 466, 467, 7, 1, 0, 0, 467, 468, 7, 9, 0, 0, 468, 469, 7, 3, 0, 0, 469, 470, 7, 2, 0, 0, 470, 471, 7, 5, 0, 0, 471, 472, 7, 12, 0, 0, 472, 473, 7, 5, 0, 0, 473, 474, 7, 2, 0, 0, 474, 475, 1, 0, 0, 0, 475, 476, 6, 7, 0, 0, 476, 31, 1, 0, 0, 0, 477, 478, 7, 18, 0, 0, 478, 479, 7, 3, 0, 0, 479, 480, 7, 3, 0, 0, 480, 481, 7, 8, 0, 0, 481, 482, 1, 0, 0, 0, 482, 483, 6, 8, 1, 0, 483, 33, 1, 0, 0, 0, 484, 485, 7, 13, 0, 0, 485, 486, 7, 1, 0, 0, 486, 487, 7, 16, 0, 0, 487, 488, 7, 1, 0, 0, 488, 489, 7, 5, 0, 0, 489, 490, 1, 0, 0, 0, 490, 491, 6, 9, 0, 0, 491, 35, 1, 0, 0, 0, 492, 493, 7, 13, 0, 0, 493, 494, 7, 7, 0, 0, 494, 495, 7, 7, 0, 0, 495, 496, 7, 18, 0, 0, 496, 497, 7, 19, 0, 0, 497, 498, 7, 8, 0, 0, 498, 499, 1, 0, 0, 0, 499, 500, 6, 10, 5, 0, 500, 37, 1, 0, 0, 0, 501, 502, 7, 16, 0, 0, 502, 503, 7, 3, 0, 0, 503, 504, 7, 5, 0, 0, 504, 505, 7, 12, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 6, 11, 6, 0, 507, 39, 1, 0, 0, 0, 508, 509, 7, 16, 0, 0, 509, 510, 7, 3, 0, 0, 510, 511, 7, 5, 0, 0, 511, 512, 7, 6, 0, 0, 512, 513, 7, 1, 0, 0, 513, 514, 7, 4, 0, 0, 514, 515, 7, 2, 0, 0, 515, 516, 1, 0, 0, 0, 516, 517, 6, 12, 7, 0, 517, 41, 1, 0, 0, 0, 518, 519, 7, 16, 0, 0, 519, 520, 7, 11, 0, 0, 520, 521, 5, 95, 0, 0, 521, 522, 7, 3, 0, 0, 522, 523, 7, 14, 0, 0, 523, 524, 7, 8, 0, 0, 524, 525, 7, 12, 0, 0, 525, 526, 7, 9, 0, 0, 526, 527, 7, 0, 0, 0, 527, 528, 1, 0, 0, 0, 528, 529, 6, 13, 8, 0, 529, 43, 1, 0, 0, 0, 530, 531, 7, 6, 0, 0, 531, 532, 7, 3, 0, 0, 532, 533, 7, 9, 0, 0, 533, 534, 7, 12, 0, 0, 534, 535, 7, 16, 0, 0, 535, 536, 7, 3, 0, 0, 536, 537, 1, 0, 0, 0, 537, 538, 6, 14, 9, 0, 538, 45, 1, 0, 0, 0, 539, 540, 7, 6, 0, 0, 540, 541, 7, 7, 0, 0, 541, 542, 7, 20, 0, 0, 542, 543, 1, 0, 0, 0, 543, 544, 6, 15, 0, 0, 544, 47, 1, 0, 0, 0, 545, 546, 7, 2, 0, 0, 546, 547, 7, 10, 0, 0, 547, 548, 7, 7, 0, 0, 548, 549, 7, 20, 0, 0, 549, 550, 1, 0, 0, 0, 550, 551, 6, 16, 10, 0, 551, 49, 1, 0, 0, 0, 552, 553, 7, 2, 0, 0, 553, 554, 7, 7, 0, 0, 554, 555, 7, 6, 0, 0, 555, 556, 7, 5, 0, 0, 556, 557, 1, 0, 0, 0, 557, 558, 6, 17, 0, 0, 558, 51, 1, 0, 0, 0, 559, 560, 7, 2, 0, 0, 560, 561, 7, 5, 0, 0, 561, 562, 7, 12, 0, 0, 562, 563, 7, 5, 0, 0, 563, 564, 7, 2, 0, 0, 564, 565, 1, 0, 0, 0, 565, 566, 6, 18, 0, 0, 566, 53, 1, 0, 0, 0, 567, 568, 7, 20, 0, 0, 568, 569, 7, 10, 0, 0, 569, 570, 7, 3, 0, 0, 570, 571, 7, 6, 0, 0, 571, 572, 7, 3, 0, 0, 572, 573, 1, 0, 0, 0, 573, 574, 6, 19, 0, 0, 574, 55, 1, 0, 0, 0, 575, 577, 8, 21, 0, 0, 576, 575, 1, 0, 0, 0, 577, 578, 1, 0, 0, 0, 578, 576, 1, 0, 0, 0, 578, 579, 1, 0, 0, 0, 579, 580, 1, 0, 0, 0, 580, 581, 6, 20, 0, 0, 581, 57, 1, 0, 0, 0, 582, 583, 5, 47, 0, 0, 583, 584, 5, 47, 0, 0, 584, 588, 1, 0, 0, 0, 585, 587, 8, 22, 0, 0, 586, 585, 1, 0, 0, 0, 587, 590, 1, 0, 0, 0, 588, 586, 1, 0, 0, 0, 588, 589, 1, 0, 0, 0, 589, 592, 1, 0, 0, 0, 590, 588, 1, 0, 0, 0, 591, 593, 5, 13, 0, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 595, 1, 0, 0, 0, 594, 596, 5, 10, 0, 0, 595, 594, 1, 0, 0, 0, 595, 596, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 598, 6, 21, 11, 0, 598, 59, 1, 0, 0, 0, 599, 600, 5, 47, 0, 0, 600, 601, 5, 42, 0, 0, 601, 606, 1, 0, 0, 0, 602, 605, 3, 60, 22, 0, 603, 605, 9, 0, 0, 0, 604, 602, 1, 0, 0, 0, 604, 603, 1, 0, 0, 0, 605, 608, 1, 0, 0, 0, 606, 607, 1, 0, 0, 0, 606, 604, 1, 0, 0, 0, 607, 609, 1, 0, 0, 0, 608, 606, 1, 0, 0, 0, 609, 610, 5, 42, 0, 0, 610, 611, 5, 47, 0, 0, 611, 612, 1, 0, 0, 0, 612, 613, 6, 22, 11, 0, 613, 61, 1, 0, 0, 0, 614, 616, 7, 23, 0, 0, 615, 614, 1, 0, 0, 0, 616, 617, 1, 0, 0, 0, 617, 615, 1, 0, 0, 0, 617, 618, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 620, 6, 23, 11, 0, 620, 63, 1, 0, 0, 0, 621, 625, 8, 24, 0, 0, 622, 623, 5, 47, 0, 0, 623, 625, 8, 25, 0, 0, 624, 621, 1, 0, 0, 0, 624, 622, 1, 0, 0, 0, 625, 65, 1, 0, 0, 0, 626, 628, 3, 64, 24, 0, 627, 626, 1, 0, 0, 0, 628, 629, 1, 0, 0, 0, 629, 627, 1, 0, 0, 0, 629, 630, 1, 0, 0, 0, 630, 67, 1, 0, 0, 0, 631, 632, 3, 180, 82, 0, 632, 633, 1, 0, 0, 0, 633, 634, 6, 26, 12, 0, 634, 635, 6, 26, 13, 0, 635, 69, 1, 0, 0, 0, 636, 637, 3, 78, 31, 0, 637, 638, 1, 0, 0, 0, 638, 639, 6, 27, 14, 0, 639, 640, 6, 27, 15, 0, 640, 71, 1, 0, 0, 0, 641, 642, 3, 62, 23, 0, 642, 643, 1, 0, 0, 0, 643, 644, 6, 28, 11, 0, 644, 73, 1, 0, 0, 0, 645, 646, 3, 58, 21, 0, 646, 647, 1, 0, 0, 0, 647, 648, 6, 29, 11, 0, 648, 75, 1, 0, 0, 0, 649, 650, 3, 60, 22, 0, 650, 651, 1, 0, 0, 0, 651, 652, 6, 30, 11, 0, 652, 77, 1, 0, 0, 0, 653, 654, 5, 124, 0, 0, 654, 655, 1, 0, 0, 0, 655, 656, 6, 31, 15, 0, 656, 79, 1, 0, 0, 0, 657, 658, 7, 26, 0, 0, 658, 81, 1, 0, 0, 0, 659, 660, 7, 27, 0, 0, 660, 83, 1, 0, 0, 0, 661, 662, 5, 92, 0, 0, 662, 663, 7, 28, 0, 0, 663, 85, 1, 0, 0, 0, 664, 665, 8, 29, 0, 0, 665, 87, 1, 0, 0, 0, 666, 668, 7, 3, 0, 0, 667, 669, 7, 30, 0, 0, 668, 667, 1, 0, 0, 0, 668, 669, 1, 0, 0, 0, 669, 671, 1, 0, 0, 0, 670, 672, 3, 80, 32, 0, 671, 670, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 671, 1, 0, 0, 0, 673, 674, 1, 0, 0, 0, 674, 89, 1, 0, 0, 0, 675, 676, 5, 64, 0, 0, 676, 91, 1, 0, 0, 0, 677, 678, 5, 96, 0, 0, 678, 93, 1, 0, 0, 0, 679, 683, 8, 31, 0, 0, 680, 681, 5, 96, 0, 0, 681, 683, 5, 96, 0, 0, 682, 679, 1, 0, 0, 0, 682, 680, 1, 0, 0, 0, 683, 95, 1, 0, 0, 0, 684, 685, 5, 95, 0, 0, 685, 97, 1, 0, 0, 0, 686, 690, 3, 82, 33, 0, 687, 690, 3, 80, 32, 0, 688, 690, 3, 96, 40, 0, 689, 686, 1, 0, 0, 0, 689, 687, 1, 0, 0, 0, 689, 688, 1, 0, 0, 0, 690, 99, 1, 0, 0, 0, 691, 696, 5, 34, 0, 0, 692, 695, 3, 84, 34, 0, 693, 695, 3, 86, 35, 0, 694, 692, 1, 0, 0, 0, 694, 693, 1, 0, 0, 0, 695, 698, 1, 0, 0, 0, 696, 694, 1, 0, 0, 0, 696, 697, 1, 0, 0, 0, 697, 699, 1, 0, 0, 0, 698, 696, 1, 0, 0, 0, 699, 721, 5, 34, 0, 0, 700, 701, 5, 34, 0, 0, 701, 702, 5, 34, 0, 0, 702, 703, 5, 34, 0, 0, 703, 707, 1, 0, 0, 0, 704, 706, 8, 22, 0, 0, 705, 704, 1, 0, 0, 0, 706, 709, 1, 0, 0, 0, 707, 708, 1, 0, 0, 0, 707, 705, 1, 0, 0, 0, 708, 710, 1, 0, 0, 0, 709, 707, 1, 0, 0, 0, 710, 711, 5, 34, 0, 0, 711, 712, 5, 34, 0, 0, 712, 713, 5, 34, 0, 0, 713, 715, 1, 0, 0, 0, 714, 716, 5, 34, 0, 0, 715, 714, 1, 0, 0, 0, 715, 716, 1, 0, 0, 0, 716, 718, 1, 0, 0, 0, 717, 719, 5, 34, 0, 0, 718, 717, 1, 0, 0, 0, 718, 719, 1, 0, 0, 0, 719, 721, 1, 0, 0, 0, 720, 691, 1, 0, 0, 0, 720, 700, 1, 0, 0, 0, 721, 101, 1, 0, 0, 0, 722, 724, 3, 80, 32, 0, 723, 722, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 723, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 103, 1, 0, 0, 0, 727, 729, 3, 80, 32, 0, 728, 727, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 728, 1, 0, 0, 0, 730, 731, 1, 0, 0, 0, 731, 732, 1, 0, 0, 0, 732, 736, 3, 120, 52, 0, 733, 735, 3, 80, 32, 0, 734, 733, 1, 0, 0, 0, 735, 738, 1, 0, 0, 0, 736, 734, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 770, 1, 0, 0, 0, 738, 736, 1, 0, 0, 0, 739, 741, 3, 120, 52, 0, 740, 742, 3, 80, 32, 0, 741, 740, 1, 0, 0, 0, 742, 743, 1, 0, 0, 0, 743, 741, 1, 0, 0, 0, 743, 744, 1, 0, 0, 0, 744, 770, 1, 0, 0, 0, 745, 747, 3, 80, 32, 0, 746, 745, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 746, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 757, 1, 0, 0, 0, 750, 754, 3, 120, 52, 0, 751, 753, 3, 80, 32, 0, 752, 751, 1, 0, 0, 0, 753, 756, 1, 0, 0, 0, 754, 752, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 758, 1, 0, 0, 0, 756, 754, 1, 0, 0, 0, 757, 750, 1, 0, 0, 0, 757, 758, 1, 0, 0, 0, 758, 759, 1, 0, 0, 0, 759, 760, 3, 88, 36, 0, 760, 770, 1, 0, 0, 0, 761, 763, 3, 120, 52, 0, 762, 764, 3, 80, 32, 0, 763, 762, 1, 0, 0, 0, 764, 765, 1, 0, 0, 0, 765, 763, 1, 0, 0, 0, 765, 766, 1, 0, 0, 0, 766, 767, 1, 0, 0, 0, 767, 768, 3, 88, 36, 0, 768, 770, 1, 0, 0, 0, 769, 728, 1, 0, 0, 0, 769, 739, 1, 0, 0, 0, 769, 746, 1, 0, 0, 0, 769, 761, 1, 0, 0, 0, 770, 105, 1, 0, 0, 0, 771, 772, 7, 32, 0, 0, 772, 773, 7, 33, 0, 0, 773, 107, 1, 0, 0, 0, 774, 775, 7, 12, 0, 0, 775, 776, 7, 9, 0, 0, 776, 777, 7, 0, 0, 0, 777, 109, 1, 0, 0, 0, 778, 779, 7, 12, 0, 0, 779, 780, 7, 2, 0, 0, 780, 781, 7, 4, 0, 0, 781, 111, 1, 0, 0, 0, 782, 783, 5, 61, 0, 0, 783, 113, 1, 0, 0, 0, 784, 785, 5, 58, 0, 0, 785, 786, 5, 58, 0, 0, 786, 115, 1, 0, 0, 0, 787, 788, 5, 44, 0, 0, 788, 117, 1, 0, 0, 0, 789, 790, 7, 0, 0, 0, 790, 791, 7, 3, 0, 0, 791, 792, 7, 2, 0, 0, 792, 793, 7, 4, 0, 0, 793, 119, 1, 0, 0, 0, 794, 795, 5, 46, 0, 0, 795, 121, 1, 0, 0, 0, 796, 797, 7, 15, 0, 0, 797, 798, 7, 12, 0, 0, 798, 799, 7, 13, 0, 0, 799, 800, 7, 2, 0, 0, 800, 801, 7, 3, 0, 0, 801, 123, 1, 0, 0, 0, 802, 803, 7, 15, 0, 0, 803, 804, 7, 1, 0, 0, 804, 805, 7, 6, 0, 0, 805, 806, 7, 2, 0, 0, 806, 807, 7, 5, 0, 0, 807, 125, 1, 0, 0, 0, 808, 809, 7, 1, 0, 0, 809, 810, 7, 9, 0, 0, 810, 127, 1, 0, 0, 0, 811, 812, 7, 1, 0, 0, 812, 813, 7, 2, 0, 0, 813, 129, 1, 0, 0, 0, 814, 815, 7, 13, 0, 0, 815, 816, 7, 12, 0, 0, 816, 817, 7, 2, 0, 0, 817, 818, 7, 5, 0, 0, 818, 131, 1, 0, 0, 0, 819, 820, 7, 13, 0, 0, 820, 821, 7, 1, 0, 0, 821, 822, 7, 18, 0, 0, 822, 823, 7, 3, 0, 0, 823, 133, 1, 0, 0, 0, 824, 825, 5, 40, 0, 0, 825, 135, 1, 0, 0, 0, 826, 827, 7, 16, 0, 0, 827, 828, 7, 12, 0, 0, 828, 829, 7, 5, 0, 0, 829, 830, 7, 4, 0, 0, 830, 831, 7, 10, 0, 0, 831, 137, 1, 0, 0, 0, 832, 833, 7, 9, 0, 0, 833, 834, 7, 7, 0, 0, 834, 835, 7, 5, 0, 0, 835, 139, 1, 0, 0, 0, 836, 837, 7, 9, 0, 0, 837, 838, 7, 19, 0, 0, 838, 839, 7, 13, 0, 0, 839, 840, 7, 13, 0, 0, 840, 141, 1, 0, 0, 0, 841, 842, 7, 9, 0, 0, 842, 843, 7, 19, 0, 0, 843, 844, 7, 13, 0, 0, 844, 845, 7, 13, 0, 0, 845, 846, 7, 2, 0, 0, 846, 143, 1, 0, 0, 0, 847, 848, 7, 7, 0, 0, 848, 849, 7, 6, 0, 0, 849, 145, 1, 0, 0, 0, 850, 851, 5, 63, 0, 0, 851, 147, 1, 0, 0, 0, 852, 853, 7, 6, 0, 0, 853, 854, 7, 13, 0, 0, 854, 855, 7, 1, 0, 0, 855, 856, 7, 18, 0, 0, 856, 857, 7, 3, 0, 0, 857, 149, 1, 0, 0, 0, 858, 859, 5, 41, 0, 0, 859, 151, 1, 0, 0, 0, 860, 861, 7, 5, 0, 0, 861, 862, 7, 6, 0, 0, 862, 863, 7, 19, 0, 0, 863, 864, 7, 3, 0, 0, 864, 153, 1, 0, 0, 0, 865, 866, 5, 61, 0, 0, 866, 867, 5, 61, 0, 0, 867, 155, 1, 0, 0, 0, 868, 869, 5, 61, 0, 0, 869, 870, 5, 126, 0, 0, 870, 157, 1, 0, 0, 0, 871, 872, 5, 33, 0, 0, 872, 873, 5, 61, 0, 0, 873, 159, 1, 0, 0, 0, 874, 875, 5, 60, 0, 0, 875, 161, 1, 0, 0, 0, 876, 877, 5, 60, 0, 0, 877, 878, 5, 61, 0, 0, 878, 163, 1, 0, 0, 0, 879, 880, 5, 62, 0, 0, 880, 165, 1, 0, 0, 0, 881, 882, 5, 62, 0, 0, 882, 883, 5, 61, 0, 0, 883, 167, 1, 0, 0, 0, 884, 885, 5, 43, 0, 0, 885, 169, 1, 0, 0, 0, 886, 887, 5, 45, 0, 0, 887, 171, 1, 0, 0, 0, 888, 889, 5, 42, 0, 0, 889, 173, 1, 0, 0, 0, 890, 891, 5, 47, 0, 0, 891, 175, 1, 0, 0, 0, 892, 893, 5, 37, 0, 0, 893, 177, 1, 0, 0, 0, 894, 895, 3, 146, 65, 0, 895, 899, 3, 82, 33, 0, 896, 898, 3, 98, 41, 0, 897, 896, 1, 0, 0, 0, 898, 901, 1, 0, 0, 0, 899, 897, 1, 0, 0, 0, 899, 900, 1, 0, 0, 0, 900, 909, 1, 0, 0, 0, 901, 899, 1, 0, 0, 0, 902, 904, 3, 146, 65, 0, 903, 905, 3, 80, 32, 0, 904, 903, 1, 0, 0, 0, 905, 906, 1, 0, 0, 0, 906, 904, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 909, 1, 0, 0, 0, 908, 894, 1, 0, 0, 0, 908, 902, 1, 0, 0, 0, 909, 179, 1, 0, 0, 0, 910, 911, 5, 91, 0, 0, 911, 912, 1, 0, 0, 0, 912, 913, 6, 82, 0, 0, 913, 914, 6, 82, 0, 0, 914, 181, 1, 0, 0, 0, 915, 916, 5, 93, 0, 0, 916, 917, 1, 0, 0, 0, 917, 918, 6, 83, 15, 0, 918, 919, 6, 83, 15, 0, 919, 183, 1, 0, 0, 0, 920, 924, 3, 82, 33, 0, 921, 923, 3, 98, 41, 0, 922, 921, 1, 0, 0, 0, 923, 926, 1, 0, 0, 0, 924, 922, 1, 0, 0, 0, 924, 925, 1, 0, 0, 0, 925, 937, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 927, 930, 3, 96, 40, 0, 928, 930, 3, 90, 37, 0, 929, 927, 1, 0, 0, 0, 929, 928, 1, 0, 0, 0, 930, 932, 1, 0, 0, 0, 931, 933, 3, 98, 41, 0, 932, 931, 1, 0, 0, 0, 933, 934, 1, 0, 0, 0, 934, 932, 1, 0, 0, 0, 934, 935, 1, 0, 0, 0, 935, 937, 1, 0, 0, 0, 936, 920, 1, 0, 0, 0, 936, 929, 1, 0, 0, 0, 937, 185, 1, 0, 0, 0, 938, 940, 3, 92, 38, 0, 939, 941, 3, 94, 39, 0, 940, 939, 1, 0, 0, 0, 941, 942, 1, 0, 0, 0, 942, 940, 1, 0, 0, 0, 942, 943, 1, 0, 0, 0, 943, 944, 1, 0, 0, 0, 944, 945, 3, 92, 38, 0, 945, 187, 1, 0, 0, 0, 946, 947, 3, 186, 85, 0, 947, 189, 1, 0, 0, 0, 948, 949, 3, 58, 21, 0, 949, 950, 1, 0, 0, 0, 950, 951, 6, 87, 11, 0, 951, 191, 1, 0, 0, 0, 952, 953, 3, 60, 22, 0, 953, 954, 1, 0, 0, 0, 954, 955, 6, 88, 11, 0, 955, 193, 1, 0, 0, 0, 956, 957, 3, 62, 23, 0, 957, 958, 1, 0, 0, 0, 958, 959, 6, 89, 11, 0, 959, 195, 1, 0, 0, 0, 960, 961, 3, 78, 31, 0, 961, 962, 1, 0, 0, 0, 962, 963, 6, 90, 14, 0, 963, 964, 6, 90, 15, 0, 964, 197, 1, 0, 0, 0, 965, 966, 3, 180, 82, 0, 966, 967, 1, 0, 0, 0, 967, 968, 6, 91, 12, 0, 968, 199, 1, 0, 0, 0, 969, 970, 3, 182, 83, 0, 970, 971, 1, 0, 0, 0, 971, 972, 6, 92, 16, 0, 972, 201, 1, 0, 0, 0, 973, 974, 3, 366, 175, 0, 974, 975, 1, 0, 0, 0, 975, 976, 6, 93, 17, 0, 976, 203, 1, 0, 0, 0, 977, 978, 3, 116, 50, 0, 978, 979, 1, 0, 0, 0, 979, 980, 6, 94, 18, 0, 980, 205, 1, 0, 0, 0, 981, 982, 3, 112, 48, 0, 982, 983, 1, 0, 0, 0, 983, 984, 6, 95, 19, 0, 984, 207, 1, 0, 0, 0, 985, 986, 7, 16, 0, 0, 986, 987, 7, 3, 0, 0, 987, 988, 7, 5, 0, 0, 988, 989, 7, 12, 0, 0, 989, 990, 7, 0, 0, 0, 990, 991, 7, 12, 0, 0, 991, 992, 7, 5, 0, 0, 992, 993, 7, 12, 0, 0, 993, 209, 1, 0, 0, 0, 994, 995, 3, 66, 25, 0, 995, 996, 1, 0, 0, 0, 996, 997, 6, 97, 20, 0, 997, 211, 1, 0, 0, 0, 998, 999, 3, 100, 42, 0, 999, 1000, 1, 0, 0, 0, 1000, 1001, 6, 98, 21, 0, 1001, 213, 1, 0, 0, 0, 1002, 1003, 3, 58, 21, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1005, 6, 99, 11, 0, 1005, 215, 1, 0, 0, 0, 1006, 1007, 3, 60, 22, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1009, 6, 100, 11, 0, 1009, 217, 1, 0, 0, 0, 1010, 1011, 3, 62, 23, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1013, 6, 101, 11, 0, 1013, 219, 1, 0, 0, 0, 1014, 1015, 3, 78, 31, 0, 1015, 1016, 1, 0, 0, 0, 1016, 1017, 6, 102, 14, 0, 1017, 1018, 6, 102, 15, 0, 1018, 221, 1, 0, 0, 0, 1019, 1020, 3, 120, 52, 0, 1020, 1021, 1, 0, 0, 0, 1021, 1022, 6, 103, 22, 0, 1022, 223, 1, 0, 0, 0, 1023, 1024, 3, 116, 50, 0, 1024, 1025, 1, 0, 0, 0, 1025, 1026, 6, 104, 18, 0, 1026, 225, 1, 0, 0, 0, 1027, 1032, 3, 82, 33, 0, 1028, 1032, 3, 80, 32, 0, 1029, 1032, 3, 96, 40, 0, 1030, 1032, 3, 172, 78, 0, 1031, 1027, 1, 0, 0, 0, 1031, 1028, 1, 0, 0, 0, 1031, 1029, 1, 0, 0, 0, 1031, 1030, 1, 0, 0, 0, 1032, 227, 1, 0, 0, 0, 1033, 1036, 3, 82, 33, 0, 1034, 1036, 3, 172, 78, 0, 1035, 1033, 1, 0, 0, 0, 1035, 1034, 1, 0, 0, 0, 1036, 1040, 1, 0, 0, 0, 1037, 1039, 3, 226, 105, 0, 1038, 1037, 1, 0, 0, 0, 1039, 1042, 1, 0, 0, 0, 1040, 1038, 1, 0, 0, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1053, 1, 0, 0, 0, 1042, 1040, 1, 0, 0, 0, 1043, 1046, 3, 96, 40, 0, 1044, 1046, 3, 90, 37, 0, 1045, 1043, 1, 0, 0, 0, 1045, 1044, 1, 0, 0, 0, 1046, 1048, 1, 0, 0, 0, 1047, 1049, 3, 226, 105, 0, 1048, 1047, 1, 0, 0, 0, 1049, 1050, 1, 0, 0, 0, 1050, 1048, 1, 0, 0, 0, 1050, 1051, 1, 0, 0, 0, 1051, 1053, 1, 0, 0, 0, 1052, 1035, 1, 0, 0, 0, 1052, 1045, 1, 0, 0, 0, 1053, 229, 1, 0, 0, 0, 1054, 1057, 3, 228, 106, 0, 1055, 1057, 3, 186, 85, 0, 1056, 1054, 1, 0, 0, 0, 1056, 1055, 1, 0, 0, 0, 1057, 1058, 1, 0, 0, 0, 1058, 1056, 1, 0, 0, 0, 1058, 1059, 1, 0, 0, 0, 1059, 231, 1, 0, 0, 0, 1060, 1061, 3, 58, 21, 0, 1061, 1062, 1, 0, 0, 0, 1062, 1063, 6, 108, 11, 0, 1063, 233, 1, 0, 0, 0, 1064, 1065, 3, 60, 22, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1067, 6, 109, 11, 0, 1067, 235, 1, 0, 0, 0, 1068, 1069, 3, 62, 23, 0, 1069, 1070, 1, 0, 0, 0, 1070, 1071, 6, 110, 11, 0, 1071, 237, 1, 0, 0, 0, 1072, 1073, 3, 78, 31, 0, 1073, 1074, 1, 0, 0, 0, 1074, 1075, 6, 111, 14, 0, 1075, 1076, 6, 111, 15, 0, 1076, 239, 1, 0, 0, 0, 1077, 1078, 3, 112, 48, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1080, 6, 112, 19, 0, 1080, 241, 1, 0, 0, 0, 1081, 1082, 3, 116, 50, 0, 1082, 1083, 1, 0, 0, 0, 1083, 1084, 6, 113, 18, 0, 1084, 243, 1, 0, 0, 0, 1085, 1086, 3, 120, 52, 0, 1086, 1087, 1, 0, 0, 0, 1087, 1088, 6, 114, 22, 0, 1088, 245, 1, 0, 0, 0, 1089, 1090, 7, 12, 0, 0, 1090, 1091, 7, 2, 0, 0, 1091, 247, 1, 0, 0, 0, 1092, 1093, 3, 230, 107, 0, 1093, 1094, 1, 0, 0, 0, 1094, 1095, 6, 116, 23, 0, 1095, 249, 1, 0, 0, 0, 1096, 1097, 3, 58, 21, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 6, 117, 11, 0, 1099, 251, 1, 0, 0, 0, 1100, 1101, 3, 60, 22, 0, 1101, 1102, 1, 0, 0, 0, 1102, 1103, 6, 118, 11, 0, 1103, 253, 1, 0, 0, 0, 1104, 1105, 3, 62, 23, 0, 1105, 1106, 1, 0, 0, 0, 1106, 1107, 6, 119, 11, 0, 1107, 255, 1, 0, 0, 0, 1108, 1109, 3, 78, 31, 0, 1109, 1110, 1, 0, 0, 0, 1110, 1111, 6, 120, 14, 0, 1111, 1112, 6, 120, 15, 0, 1112, 257, 1, 0, 0, 0, 1113, 1114, 3, 180, 82, 0, 1114, 1115, 1, 0, 0, 0, 1115, 1116, 6, 121, 12, 0, 1116, 1117, 6, 121, 24, 0, 1117, 259, 1, 0, 0, 0, 1118, 1119, 7, 7, 0, 0, 1119, 1120, 7, 9, 0, 0, 1120, 1121, 1, 0, 0, 0, 1121, 1122, 6, 122, 25, 0, 1122, 261, 1, 0, 0, 0, 1123, 1124, 7, 20, 0, 0, 1124, 1125, 7, 1, 0, 0, 1125, 1126, 7, 5, 0, 0, 1126, 1127, 7, 10, 0, 0, 1127, 1128, 1, 0, 0, 0, 1128, 1129, 6, 123, 25, 0, 1129, 263, 1, 0, 0, 0, 1130, 1131, 8, 34, 0, 0, 1131, 265, 1, 0, 0, 0, 1132, 1134, 3, 264, 124, 0, 1133, 1132, 1, 0, 0, 0, 1134, 1135, 1, 0, 0, 0, 1135, 1133, 1, 0, 0, 0, 1135, 1136, 1, 0, 0, 0, 1136, 1137, 1, 0, 0, 0, 1137, 1138, 3, 366, 175, 0, 1138, 1140, 1, 0, 0, 0, 1139, 1133, 1, 0, 0, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1142, 1, 0, 0, 0, 1141, 1143, 3, 264, 124, 0, 1142, 1141, 1, 0, 0, 0, 1143, 1144, 1, 0, 0, 0, 1144, 1142, 1, 0, 0, 0, 1144, 1145, 1, 0, 0, 0, 1145, 267, 1, 0, 0, 0, 1146, 1147, 3, 266, 125, 0, 1147, 1148, 1, 0, 0, 0, 1148, 1149, 6, 126, 26, 0, 1149, 269, 1, 0, 0, 0, 1150, 1151, 3, 58, 21, 0, 1151, 1152, 1, 0, 0, 0, 1152, 1153, 6, 127, 11, 0, 1153, 271, 1, 0, 0, 0, 1154, 1155, 3, 60, 22, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1157, 6, 128, 11, 0, 1157, 273, 1, 0, 0, 0, 1158, 1159, 3, 62, 23, 0, 1159, 1160, 1, 0, 0, 0, 1160, 1161, 6, 129, 11, 0, 1161, 275, 1, 0, 0, 0, 1162, 1163, 3, 78, 31, 0, 1163, 1164, 1, 0, 0, 0, 1164, 1165, 6, 130, 14, 0, 1165, 1166, 6, 130, 15, 0, 1166, 1167, 6, 130, 15, 0, 1167, 277, 1, 0, 0, 0, 1168, 1169, 3, 112, 48, 0, 1169, 1170, 1, 0, 0, 0, 1170, 1171, 6, 131, 19, 0, 1171, 279, 1, 0, 0, 0, 1172, 1173, 3, 116, 50, 0, 1173, 1174, 1, 0, 0, 0, 1174, 1175, 6, 132, 18, 0, 1175, 281, 1, 0, 0, 0, 1176, 1177, 3, 120, 52, 0, 1177, 1178, 1, 0, 0, 0, 1178, 1179, 6, 133, 22, 0, 1179, 283, 1, 0, 0, 0, 1180, 1181, 3, 262, 123, 0, 1181, 1182, 1, 0, 0, 0, 1182, 1183, 6, 134, 27, 0, 1183, 285, 1, 0, 0, 0, 1184, 1185, 3, 230, 107, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1187, 6, 135, 23, 0, 1187, 287, 1, 0, 0, 0, 1188, 1189, 3, 188, 86, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1191, 6, 136, 28, 0, 1191, 289, 1, 0, 0, 0, 1192, 1193, 3, 58, 21, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1195, 6, 137, 11, 0, 1195, 291, 1, 0, 0, 0, 1196, 1197, 3, 60, 22, 0, 1197, 1198, 1, 0, 0, 0, 1198, 1199, 6, 138, 11, 0, 1199, 293, 1, 0, 0, 0, 1200, 1201, 3, 62, 23, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 6, 139, 11, 0, 1203, 295, 1, 0, 0, 0, 1204, 1205, 3, 78, 31, 0, 1205, 1206, 1, 0, 0, 0, 1206, 1207, 6, 140, 14, 0, 1207, 1208, 6, 140, 15, 0, 1208, 297, 1, 0, 0, 0, 1209, 1210, 3, 366, 175, 0, 1210, 1211, 1, 0, 0, 0, 1211, 1212, 6, 141, 17, 0, 1212, 299, 1, 0, 0, 0, 1213, 1214, 3, 116, 50, 0, 1214, 1215, 1, 0, 0, 0, 1215, 1216, 6, 142, 18, 0, 1216, 301, 1, 0, 0, 0, 1217, 1218, 3, 120, 52, 0, 1218, 1219, 1, 0, 0, 0, 1219, 1220, 6, 143, 22, 0, 1220, 303, 1, 0, 0, 0, 1221, 1222, 3, 260, 122, 0, 1222, 1223, 1, 0, 0, 0, 1223, 1224, 6, 144, 29, 0, 1224, 1225, 6, 144, 30, 0, 1225, 305, 1, 0, 0, 0, 1226, 1227, 3, 66, 25, 0, 1227, 1228, 1, 0, 0, 0, 1228, 1229, 6, 145, 20, 0, 1229, 307, 1, 0, 0, 0, 1230, 1231, 3, 100, 42, 0, 1231, 1232, 1, 0, 0, 0, 1232, 1233, 6, 146, 21, 0, 1233, 309, 1, 0, 0, 0, 1234, 1235, 3, 58, 21, 0, 1235, 1236, 1, 0, 0, 0, 1236, 1237, 6, 147, 11, 0, 1237, 311, 1, 0, 0, 0, 1238, 1239, 3, 60, 22, 0, 1239, 1240, 1, 0, 0, 0, 1240, 1241, 6, 148, 11, 0, 1241, 313, 1, 0, 0, 0, 1242, 1243, 3, 62, 23, 0, 1243, 1244, 1, 0, 0, 0, 1244, 1245, 6, 149, 11, 0, 1245, 315, 1, 0, 0, 0, 1246, 1247, 3, 78, 31, 0, 1247, 1248, 1, 0, 0, 0, 1248, 1249, 6, 150, 14, 0, 1249, 1250, 6, 150, 15, 0, 1250, 1251, 6, 150, 15, 0, 1251, 317, 1, 0, 0, 0, 1252, 1253, 3, 116, 50, 0, 1253, 1254, 1, 0, 0, 0, 1254, 1255, 6, 151, 18, 0, 1255, 319, 1, 0, 0, 0, 1256, 1257, 3, 120, 52, 0, 1257, 1258, 1, 0, 0, 0, 1258, 1259, 6, 152, 22, 0, 1259, 321, 1, 0, 0, 0, 1260, 1261, 3, 230, 107, 0, 1261, 1262, 1, 0, 0, 0, 1262, 1263, 6, 153, 23, 0, 1263, 323, 1, 0, 0, 0, 1264, 1265, 3, 58, 21, 0, 1265, 1266, 1, 0, 0, 0, 1266, 1267, 6, 154, 11, 0, 1267, 325, 1, 0, 0, 0, 1268, 1269, 3, 60, 22, 0, 1269, 1270, 1, 0, 0, 0, 1270, 1271, 6, 155, 11, 0, 1271, 327, 1, 0, 0, 0, 1272, 1273, 3, 62, 23, 0, 1273, 1274, 1, 0, 0, 0, 1274, 1275, 6, 156, 11, 0, 1275, 329, 1, 0, 0, 0, 1276, 1277, 3, 78, 31, 0, 1277, 1278, 1, 0, 0, 0, 1278, 1279, 6, 157, 14, 0, 1279, 1280, 6, 157, 15, 0, 1280, 331, 1, 0, 0, 0, 1281, 1282, 3, 120, 52, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1284, 6, 158, 22, 0, 1284, 333, 1, 0, 0, 0, 1285, 1286, 3, 188, 86, 0, 1286, 1287, 1, 0, 0, 0, 1287, 1288, 6, 159, 28, 0, 1288, 335, 1, 0, 0, 0, 1289, 1290, 3, 184, 84, 0, 1290, 1291, 1, 0, 0, 0, 1291, 1292, 6, 160, 31, 0, 1292, 337, 1, 0, 0, 0, 1293, 1294, 3, 58, 21, 0, 1294, 1295, 1, 0, 0, 0, 1295, 1296, 6, 161, 11, 0, 1296, 339, 1, 0, 0, 0, 1297, 1298, 3, 60, 22, 0, 1298, 1299, 1, 0, 0, 0, 1299, 1300, 6, 162, 11, 0, 1300, 341, 1, 0, 0, 0, 1301, 1302, 3, 62, 23, 0, 1302, 1303, 1, 0, 0, 0, 1303, 1304, 6, 163, 11, 0, 1304, 343, 1, 0, 0, 0, 1305, 1306, 3, 78, 31, 0, 1306, 1307, 1, 0, 0, 0, 1307, 1308, 6, 164, 14, 0, 1308, 1309, 6, 164, 15, 0, 1309, 345, 1, 0, 0, 0, 1310, 1311, 7, 1, 0, 0, 1311, 1312, 7, 9, 0, 0, 1312, 1313, 7, 15, 0, 0, 1313, 1314, 7, 7, 0, 0, 1314, 347, 1, 0, 0, 0, 1315, 1316, 3, 58, 21, 0, 1316, 1317, 1, 0, 0, 0, 1317, 1318, 6, 166, 11, 0, 1318, 349, 1, 0, 0, 0, 1319, 1320, 3, 60, 22, 0, 1320, 1321, 1, 0, 0, 0, 1321, 1322, 6, 167, 11, 0, 1322, 351, 1, 0, 0, 0, 1323, 1324, 3, 62, 23, 0, 1324, 1325, 1, 0, 0, 0, 1325, 1326, 6, 168, 11, 0, 1326, 353, 1, 0, 0, 0, 1327, 1328, 3, 78, 31, 0, 1328, 1329, 1, 0, 0, 0, 1329, 1330, 6, 169, 14, 0, 1330, 1331, 6, 169, 15, 0, 1331, 355, 1, 0, 0, 0, 1332, 1333, 7, 15, 0, 0, 1333, 1334, 7, 19, 0, 0, 1334, 1335, 7, 9, 0, 0, 1335, 1336, 7, 4, 0, 0, 1336, 1337, 7, 5, 0, 0, 1337, 1338, 7, 1, 0, 0, 1338, 1339, 7, 7, 0, 0, 1339, 1340, 7, 9, 0, 0, 1340, 1341, 7, 2, 0, 0, 1341, 357, 1, 0, 0, 0, 1342, 1343, 3, 58, 21, 0, 1343, 1344, 1, 0, 0, 0, 1344, 1345, 6, 171, 11, 0, 1345, 359, 1, 0, 0, 0, 1346, 1347, 3, 60, 22, 0, 1347, 1348, 1, 0, 0, 0, 1348, 1349, 6, 172, 11, 0, 1349, 361, 1, 0, 0, 0, 1350, 1351, 3, 62, 23, 0, 1351, 1352, 1, 0, 0, 0, 1352, 1353, 6, 173, 11, 0, 1353, 363, 1, 0, 0, 0, 1354, 1355, 3, 182, 83, 0, 1355, 1356, 1, 0, 0, 0, 1356, 1357, 6, 174, 16, 0, 1357, 1358, 6, 174, 15, 0, 1358, 365, 1, 0, 0, 0, 1359, 1360, 5, 58, 0, 0, 1360, 367, 1, 0, 0, 0, 1361, 1367, 3, 90, 37, 0, 1362, 1367, 3, 80, 32, 0, 1363, 1367, 3, 120, 52, 0, 1364, 1367, 3, 82, 33, 0, 1365, 1367, 3, 96, 40, 0, 1366, 1361, 1, 0, 0, 0, 1366, 1362, 1, 0, 0, 0, 1366, 1363, 1, 0, 0, 0, 1366, 1364, 1, 0, 0, 0, 1366, 1365, 1, 0, 0, 0, 1367, 1368, 1, 0, 0, 0, 1368, 1366, 1, 0, 0, 0, 1368, 1369, 1, 0, 0, 0, 1369, 369, 1, 0, 0, 0, 1370, 1371, 3, 58, 21, 0, 1371, 1372, 1, 0, 0, 0, 1372, 1373, 6, 177, 11, 0, 1373, 371, 1, 0, 0, 0, 1374, 1375, 3, 60, 22, 0, 1375, 1376, 1, 0, 0, 0, 1376, 1377, 6, 178, 11, 0, 1377, 373, 1, 0, 0, 0, 1378, 1379, 3, 62, 23, 0, 1379, 1380, 1, 0, 0, 0, 1380, 1381, 6, 179, 11, 0, 1381, 375, 1, 0, 0, 0, 1382, 1383, 3, 78, 31, 0, 1383, 1384, 1, 0, 0, 0, 1384, 1385, 6, 180, 14, 0, 1385, 1386, 6, 180, 15, 0, 1386, 377, 1, 0, 0, 0, 1387, 1388, 3, 66, 25, 0, 1388, 1389, 1, 0, 0, 0, 1389, 1390, 6, 181, 20, 0, 1390, 1391, 6, 181, 15, 0, 1391, 1392, 6, 181, 32, 0, 1392, 379, 1, 0, 0, 0, 1393, 1394, 3, 100, 42, 0, 1394, 1395, 1, 0, 0, 0, 1395, 1396, 6, 182, 21, 0, 1396, 1397, 6, 182, 15, 0, 1397, 1398, 6, 182, 32, 0, 1398, 381, 1, 0, 0, 0, 1399, 1400, 3, 58, 21, 0, 1400, 1401, 1, 0, 0, 0, 1401, 1402, 6, 183, 11, 0, 1402, 383, 1, 0, 0, 0, 1403, 1404, 3, 60, 22, 0, 1404, 1405, 1, 0, 0, 0, 1405, 1406, 6, 184, 11, 0, 1406, 385, 1, 0, 0, 0, 1407, 1408, 3, 62, 23, 0, 1408, 1409, 1, 0, 0, 0, 1409, 1410, 6, 185, 11, 0, 1410, 387, 1, 0, 0, 0, 1411, 1412, 3, 366, 175, 0, 1412, 1413, 1, 0, 0, 0, 1413, 1414, 6, 186, 17, 0, 1414, 1415, 6, 186, 15, 0, 1415, 1416, 6, 186, 7, 0, 1416, 389, 1, 0, 0, 0, 1417, 1418, 3, 116, 50, 0, 1418, 1419, 1, 0, 0, 0, 1419, 1420, 6, 187, 18, 0, 1420, 1421, 6, 187, 15, 0, 1421, 1422, 6, 187, 7, 0, 1422, 391, 1, 0, 0, 0, 1423, 1424, 3, 58, 21, 0, 1424, 1425, 1, 0, 0, 0, 1425, 1426, 6, 188, 11, 0, 1426, 393, 1, 0, 0, 0, 1427, 1428, 3, 60, 22, 0, 1428, 1429, 1, 0, 0, 0, 1429, 1430, 6, 189, 11, 0, 1430, 395, 1, 0, 0, 0, 1431, 1432, 3, 62, 23, 0, 1432, 1433, 1, 0, 0, 0, 1433, 1434, 6, 190, 11, 0, 1434, 397, 1, 0, 0, 0, 1435, 1436, 3, 188, 86, 0, 1436, 1437, 1, 0, 0, 0, 1437, 1438, 6, 191, 15, 0, 1438, 1439, 6, 191, 0, 0, 1439, 1440, 6, 191, 28, 0, 1440, 399, 1, 0, 0, 0, 1441, 1442, 3, 184, 84, 0, 1442, 1443, 1, 0, 0, 0, 1443, 1444, 6, 192, 15, 0, 1444, 1445, 6, 192, 0, 0, 1445, 1446, 6, 192, 31, 0, 1446, 401, 1, 0, 0, 0, 1447, 1448, 3, 106, 45, 0, 1448, 1449, 1, 0, 0, 0, 1449, 1450, 6, 193, 15, 0, 1450, 1451, 6, 193, 0, 0, 1451, 1452, 6, 193, 33, 0, 1452, 403, 1, 0, 0, 0, 1453, 1454, 3, 78, 31, 0, 1454, 1455, 1, 0, 0, 0, 1455, 1456, 6, 194, 14, 0, 1456, 1457, 6, 194, 15, 0, 1457, 405, 1, 0, 0, 0, 65, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 578, 588, 592, 595, 604, 606, 617, 624, 629, 668, 673, 682, 689, 694, 696, 707, 715, 718, 720, 725, 730, 736, 743, 748, 754, 757, 765, 769, 899, 906, 908, 924, 929, 934, 936, 942, 1031, 1035, 1040, 1045, 1050, 1052, 1056, 1058, 1135, 1139, 1144, 1366, 1368, 34, 5, 2, 0, 5, 4, 0, 5, 6, 0, 5, 1, 0, 5, 3, 0, 5, 8, 0, 5, 12, 0, 5, 14, 0, 5, 10, 0, 5, 5, 0, 5, 11, 0, 0, 1, 0, 7, 70, 0, 5, 0, 0, 7, 29, 0, 4, 0, 0, 7, 71, 0, 7, 115, 0, 7, 38, 0, 7, 36, 0, 7, 25, 0, 7, 30, 0, 7, 40, 0, 7, 81, 0, 5, 13, 0, 5, 7, 0, 7, 91, 0, 7, 90, 0, 7, 73, 0, 7, 89, 0, 5, 9, 0, 7, 72, 0, 5, 15, 0, 7, 33, 0] \ No newline at end of file +[4, 0, 126, 1468, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 4, 21, 587, 8, 21, 11, 21, 12, 21, 588, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 597, 8, 22, 10, 22, 12, 22, 600, 9, 22, 1, 22, 3, 22, 603, 8, 22, 1, 22, 3, 22, 606, 8, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 615, 8, 23, 10, 23, 12, 23, 618, 9, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 4, 24, 626, 8, 24, 11, 24, 12, 24, 627, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 3, 25, 635, 8, 25, 1, 26, 4, 26, 638, 8, 26, 11, 26, 12, 26, 639, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 3, 37, 679, 8, 37, 1, 37, 4, 37, 682, 8, 37, 11, 37, 12, 37, 683, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 3, 40, 693, 8, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 3, 42, 700, 8, 42, 1, 43, 1, 43, 1, 43, 5, 43, 705, 8, 43, 10, 43, 12, 43, 708, 9, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 5, 43, 716, 8, 43, 10, 43, 12, 43, 719, 9, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 726, 8, 43, 1, 43, 3, 43, 729, 8, 43, 3, 43, 731, 8, 43, 1, 44, 4, 44, 734, 8, 44, 11, 44, 12, 44, 735, 1, 45, 4, 45, 739, 8, 45, 11, 45, 12, 45, 740, 1, 45, 1, 45, 5, 45, 745, 8, 45, 10, 45, 12, 45, 748, 9, 45, 1, 45, 1, 45, 4, 45, 752, 8, 45, 11, 45, 12, 45, 753, 1, 45, 4, 45, 757, 8, 45, 11, 45, 12, 45, 758, 1, 45, 1, 45, 5, 45, 763, 8, 45, 10, 45, 12, 45, 766, 9, 45, 3, 45, 768, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 4, 45, 774, 8, 45, 11, 45, 12, 45, 775, 1, 45, 1, 45, 3, 45, 780, 8, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 78, 1, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 5, 82, 908, 8, 82, 10, 82, 12, 82, 911, 9, 82, 1, 82, 1, 82, 4, 82, 915, 8, 82, 11, 82, 12, 82, 916, 3, 82, 919, 8, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 5, 85, 933, 8, 85, 10, 85, 12, 85, 936, 9, 85, 1, 85, 1, 85, 3, 85, 940, 8, 85, 1, 85, 4, 85, 943, 8, 85, 11, 85, 12, 85, 944, 3, 85, 947, 8, 85, 1, 86, 1, 86, 4, 86, 951, 8, 86, 11, 86, 12, 86, 952, 1, 86, 1, 86, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1042, 8, 106, 1, 107, 1, 107, 3, 107, 1046, 8, 107, 1, 107, 5, 107, 1049, 8, 107, 10, 107, 12, 107, 1052, 9, 107, 1, 107, 1, 107, 3, 107, 1056, 8, 107, 1, 107, 4, 107, 1059, 8, 107, 11, 107, 12, 107, 1060, 3, 107, 1063, 8, 107, 1, 108, 1, 108, 4, 108, 1067, 8, 108, 11, 108, 12, 108, 1068, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 4, 126, 1144, 8, 126, 11, 126, 12, 126, 1145, 1, 126, 1, 126, 3, 126, 1150, 8, 126, 1, 126, 4, 126, 1153, 8, 126, 11, 126, 12, 126, 1154, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 4, 177, 1377, 8, 177, 11, 177, 12, 177, 1378, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 2, 616, 717, 0, 196, 16, 1, 18, 2, 20, 3, 22, 4, 24, 5, 26, 6, 28, 7, 30, 8, 32, 9, 34, 10, 36, 11, 38, 12, 40, 13, 42, 14, 44, 15, 46, 16, 48, 17, 50, 18, 52, 19, 54, 20, 56, 21, 58, 22, 60, 23, 62, 24, 64, 25, 66, 0, 68, 26, 70, 0, 72, 0, 74, 27, 76, 28, 78, 29, 80, 30, 82, 0, 84, 0, 86, 0, 88, 0, 90, 0, 92, 0, 94, 0, 96, 0, 98, 0, 100, 0, 102, 31, 104, 32, 106, 33, 108, 34, 110, 35, 112, 36, 114, 37, 116, 38, 118, 39, 120, 40, 122, 41, 124, 42, 126, 43, 128, 44, 130, 45, 132, 46, 134, 47, 136, 48, 138, 49, 140, 50, 142, 51, 144, 52, 146, 53, 148, 54, 150, 55, 152, 56, 154, 57, 156, 58, 158, 59, 160, 60, 162, 61, 164, 62, 166, 63, 168, 64, 170, 65, 172, 66, 174, 67, 176, 68, 178, 69, 180, 70, 182, 71, 184, 72, 186, 73, 188, 0, 190, 74, 192, 75, 194, 76, 196, 77, 198, 0, 200, 0, 202, 0, 204, 0, 206, 0, 208, 0, 210, 78, 212, 0, 214, 0, 216, 79, 218, 80, 220, 81, 222, 0, 224, 0, 226, 0, 228, 0, 230, 0, 232, 82, 234, 83, 236, 84, 238, 85, 240, 0, 242, 0, 244, 0, 246, 0, 248, 86, 250, 0, 252, 87, 254, 88, 256, 89, 258, 0, 260, 0, 262, 90, 264, 91, 266, 0, 268, 92, 270, 0, 272, 93, 274, 94, 276, 95, 278, 0, 280, 0, 282, 0, 284, 0, 286, 0, 288, 0, 290, 0, 292, 96, 294, 97, 296, 98, 298, 0, 300, 0, 302, 0, 304, 0, 306, 0, 308, 0, 310, 0, 312, 99, 314, 100, 316, 101, 318, 0, 320, 0, 322, 0, 324, 0, 326, 102, 328, 103, 330, 104, 332, 0, 334, 0, 336, 0, 338, 0, 340, 105, 342, 106, 344, 107, 346, 0, 348, 108, 350, 109, 352, 110, 354, 111, 356, 0, 358, 112, 360, 113, 362, 114, 364, 115, 366, 0, 368, 116, 370, 117, 372, 118, 374, 119, 376, 120, 378, 0, 380, 0, 382, 0, 384, 121, 386, 122, 388, 123, 390, 0, 392, 0, 394, 124, 396, 125, 398, 126, 400, 0, 402, 0, 404, 0, 406, 0, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 85, 85, 117, 117, 2, 0, 87, 87, 119, 119, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 11, 0, 9, 10, 13, 13, 32, 32, 34, 34, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1494, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 68, 1, 0, 0, 0, 1, 70, 1, 0, 0, 0, 1, 72, 1, 0, 0, 0, 1, 74, 1, 0, 0, 0, 1, 76, 1, 0, 0, 0, 1, 78, 1, 0, 0, 0, 2, 80, 1, 0, 0, 0, 2, 102, 1, 0, 0, 0, 2, 104, 1, 0, 0, 0, 2, 106, 1, 0, 0, 0, 2, 108, 1, 0, 0, 0, 2, 110, 1, 0, 0, 0, 2, 112, 1, 0, 0, 0, 2, 114, 1, 0, 0, 0, 2, 116, 1, 0, 0, 0, 2, 118, 1, 0, 0, 0, 2, 120, 1, 0, 0, 0, 2, 122, 1, 0, 0, 0, 2, 124, 1, 0, 0, 0, 2, 126, 1, 0, 0, 0, 2, 128, 1, 0, 0, 0, 2, 130, 1, 0, 0, 0, 2, 132, 1, 0, 0, 0, 2, 134, 1, 0, 0, 0, 2, 136, 1, 0, 0, 0, 2, 138, 1, 0, 0, 0, 2, 140, 1, 0, 0, 0, 2, 142, 1, 0, 0, 0, 2, 144, 1, 0, 0, 0, 2, 146, 1, 0, 0, 0, 2, 148, 1, 0, 0, 0, 2, 150, 1, 0, 0, 0, 2, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 2, 156, 1, 0, 0, 0, 2, 158, 1, 0, 0, 0, 2, 160, 1, 0, 0, 0, 2, 162, 1, 0, 0, 0, 2, 164, 1, 0, 0, 0, 2, 166, 1, 0, 0, 0, 2, 168, 1, 0, 0, 0, 2, 170, 1, 0, 0, 0, 2, 172, 1, 0, 0, 0, 2, 174, 1, 0, 0, 0, 2, 176, 1, 0, 0, 0, 2, 178, 1, 0, 0, 0, 2, 180, 1, 0, 0, 0, 2, 182, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 2, 186, 1, 0, 0, 0, 2, 190, 1, 0, 0, 0, 2, 192, 1, 0, 0, 0, 2, 194, 1, 0, 0, 0, 2, 196, 1, 0, 0, 0, 3, 198, 1, 0, 0, 0, 3, 200, 1, 0, 0, 0, 3, 202, 1, 0, 0, 0, 3, 204, 1, 0, 0, 0, 3, 206, 1, 0, 0, 0, 3, 208, 1, 0, 0, 0, 3, 210, 1, 0, 0, 0, 3, 212, 1, 0, 0, 0, 3, 214, 1, 0, 0, 0, 3, 216, 1, 0, 0, 0, 3, 218, 1, 0, 0, 0, 3, 220, 1, 0, 0, 0, 4, 222, 1, 0, 0, 0, 4, 224, 1, 0, 0, 0, 4, 226, 1, 0, 0, 0, 4, 232, 1, 0, 0, 0, 4, 234, 1, 0, 0, 0, 4, 236, 1, 0, 0, 0, 4, 238, 1, 0, 0, 0, 5, 240, 1, 0, 0, 0, 5, 242, 1, 0, 0, 0, 5, 244, 1, 0, 0, 0, 5, 246, 1, 0, 0, 0, 5, 248, 1, 0, 0, 0, 5, 250, 1, 0, 0, 0, 5, 252, 1, 0, 0, 0, 5, 254, 1, 0, 0, 0, 5, 256, 1, 0, 0, 0, 6, 258, 1, 0, 0, 0, 6, 260, 1, 0, 0, 0, 6, 262, 1, 0, 0, 0, 6, 264, 1, 0, 0, 0, 6, 268, 1, 0, 0, 0, 6, 270, 1, 0, 0, 0, 6, 272, 1, 0, 0, 0, 6, 274, 1, 0, 0, 0, 6, 276, 1, 0, 0, 0, 7, 278, 1, 0, 0, 0, 7, 280, 1, 0, 0, 0, 7, 282, 1, 0, 0, 0, 7, 284, 1, 0, 0, 0, 7, 286, 1, 0, 0, 0, 7, 288, 1, 0, 0, 0, 7, 290, 1, 0, 0, 0, 7, 292, 1, 0, 0, 0, 7, 294, 1, 0, 0, 0, 7, 296, 1, 0, 0, 0, 8, 298, 1, 0, 0, 0, 8, 300, 1, 0, 0, 0, 8, 302, 1, 0, 0, 0, 8, 304, 1, 0, 0, 0, 8, 306, 1, 0, 0, 0, 8, 308, 1, 0, 0, 0, 8, 310, 1, 0, 0, 0, 8, 312, 1, 0, 0, 0, 8, 314, 1, 0, 0, 0, 8, 316, 1, 0, 0, 0, 9, 318, 1, 0, 0, 0, 9, 320, 1, 0, 0, 0, 9, 322, 1, 0, 0, 0, 9, 324, 1, 0, 0, 0, 9, 326, 1, 0, 0, 0, 9, 328, 1, 0, 0, 0, 9, 330, 1, 0, 0, 0, 10, 332, 1, 0, 0, 0, 10, 334, 1, 0, 0, 0, 10, 336, 1, 0, 0, 0, 10, 338, 1, 0, 0, 0, 10, 340, 1, 0, 0, 0, 10, 342, 1, 0, 0, 0, 10, 344, 1, 0, 0, 0, 11, 346, 1, 0, 0, 0, 11, 348, 1, 0, 0, 0, 11, 350, 1, 0, 0, 0, 11, 352, 1, 0, 0, 0, 11, 354, 1, 0, 0, 0, 12, 356, 1, 0, 0, 0, 12, 358, 1, 0, 0, 0, 12, 360, 1, 0, 0, 0, 12, 362, 1, 0, 0, 0, 12, 364, 1, 0, 0, 0, 13, 366, 1, 0, 0, 0, 13, 368, 1, 0, 0, 0, 13, 370, 1, 0, 0, 0, 13, 372, 1, 0, 0, 0, 13, 374, 1, 0, 0, 0, 13, 376, 1, 0, 0, 0, 14, 378, 1, 0, 0, 0, 14, 380, 1, 0, 0, 0, 14, 382, 1, 0, 0, 0, 14, 384, 1, 0, 0, 0, 14, 386, 1, 0, 0, 0, 14, 388, 1, 0, 0, 0, 15, 390, 1, 0, 0, 0, 15, 392, 1, 0, 0, 0, 15, 394, 1, 0, 0, 0, 15, 396, 1, 0, 0, 0, 15, 398, 1, 0, 0, 0, 15, 400, 1, 0, 0, 0, 15, 402, 1, 0, 0, 0, 15, 404, 1, 0, 0, 0, 15, 406, 1, 0, 0, 0, 16, 408, 1, 0, 0, 0, 18, 418, 1, 0, 0, 0, 20, 425, 1, 0, 0, 0, 22, 434, 1, 0, 0, 0, 24, 441, 1, 0, 0, 0, 26, 451, 1, 0, 0, 0, 28, 458, 1, 0, 0, 0, 30, 465, 1, 0, 0, 0, 32, 479, 1, 0, 0, 0, 34, 486, 1, 0, 0, 0, 36, 494, 1, 0, 0, 0, 38, 503, 1, 0, 0, 0, 40, 510, 1, 0, 0, 0, 42, 520, 1, 0, 0, 0, 44, 532, 1, 0, 0, 0, 46, 541, 1, 0, 0, 0, 48, 547, 1, 0, 0, 0, 50, 554, 1, 0, 0, 0, 52, 561, 1, 0, 0, 0, 54, 569, 1, 0, 0, 0, 56, 577, 1, 0, 0, 0, 58, 586, 1, 0, 0, 0, 60, 592, 1, 0, 0, 0, 62, 609, 1, 0, 0, 0, 64, 625, 1, 0, 0, 0, 66, 634, 1, 0, 0, 0, 68, 637, 1, 0, 0, 0, 70, 641, 1, 0, 0, 0, 72, 646, 1, 0, 0, 0, 74, 651, 1, 0, 0, 0, 76, 655, 1, 0, 0, 0, 78, 659, 1, 0, 0, 0, 80, 663, 1, 0, 0, 0, 82, 667, 1, 0, 0, 0, 84, 669, 1, 0, 0, 0, 86, 671, 1, 0, 0, 0, 88, 674, 1, 0, 0, 0, 90, 676, 1, 0, 0, 0, 92, 685, 1, 0, 0, 0, 94, 687, 1, 0, 0, 0, 96, 692, 1, 0, 0, 0, 98, 694, 1, 0, 0, 0, 100, 699, 1, 0, 0, 0, 102, 730, 1, 0, 0, 0, 104, 733, 1, 0, 0, 0, 106, 779, 1, 0, 0, 0, 108, 781, 1, 0, 0, 0, 110, 784, 1, 0, 0, 0, 112, 788, 1, 0, 0, 0, 114, 792, 1, 0, 0, 0, 116, 794, 1, 0, 0, 0, 118, 797, 1, 0, 0, 0, 120, 799, 1, 0, 0, 0, 122, 804, 1, 0, 0, 0, 124, 806, 1, 0, 0, 0, 126, 812, 1, 0, 0, 0, 128, 818, 1, 0, 0, 0, 130, 821, 1, 0, 0, 0, 132, 824, 1, 0, 0, 0, 134, 829, 1, 0, 0, 0, 136, 834, 1, 0, 0, 0, 138, 836, 1, 0, 0, 0, 140, 842, 1, 0, 0, 0, 142, 846, 1, 0, 0, 0, 144, 851, 1, 0, 0, 0, 146, 857, 1, 0, 0, 0, 148, 860, 1, 0, 0, 0, 150, 862, 1, 0, 0, 0, 152, 868, 1, 0, 0, 0, 154, 870, 1, 0, 0, 0, 156, 875, 1, 0, 0, 0, 158, 878, 1, 0, 0, 0, 160, 881, 1, 0, 0, 0, 162, 884, 1, 0, 0, 0, 164, 886, 1, 0, 0, 0, 166, 889, 1, 0, 0, 0, 168, 891, 1, 0, 0, 0, 170, 894, 1, 0, 0, 0, 172, 896, 1, 0, 0, 0, 174, 898, 1, 0, 0, 0, 176, 900, 1, 0, 0, 0, 178, 902, 1, 0, 0, 0, 180, 918, 1, 0, 0, 0, 182, 920, 1, 0, 0, 0, 184, 925, 1, 0, 0, 0, 186, 946, 1, 0, 0, 0, 188, 948, 1, 0, 0, 0, 190, 956, 1, 0, 0, 0, 192, 958, 1, 0, 0, 0, 194, 962, 1, 0, 0, 0, 196, 966, 1, 0, 0, 0, 198, 970, 1, 0, 0, 0, 200, 975, 1, 0, 0, 0, 202, 979, 1, 0, 0, 0, 204, 983, 1, 0, 0, 0, 206, 987, 1, 0, 0, 0, 208, 991, 1, 0, 0, 0, 210, 995, 1, 0, 0, 0, 212, 1004, 1, 0, 0, 0, 214, 1008, 1, 0, 0, 0, 216, 1012, 1, 0, 0, 0, 218, 1016, 1, 0, 0, 0, 220, 1020, 1, 0, 0, 0, 222, 1024, 1, 0, 0, 0, 224, 1029, 1, 0, 0, 0, 226, 1033, 1, 0, 0, 0, 228, 1041, 1, 0, 0, 0, 230, 1062, 1, 0, 0, 0, 232, 1066, 1, 0, 0, 0, 234, 1070, 1, 0, 0, 0, 236, 1074, 1, 0, 0, 0, 238, 1078, 1, 0, 0, 0, 240, 1082, 1, 0, 0, 0, 242, 1087, 1, 0, 0, 0, 244, 1091, 1, 0, 0, 0, 246, 1095, 1, 0, 0, 0, 248, 1099, 1, 0, 0, 0, 250, 1102, 1, 0, 0, 0, 252, 1106, 1, 0, 0, 0, 254, 1110, 1, 0, 0, 0, 256, 1114, 1, 0, 0, 0, 258, 1118, 1, 0, 0, 0, 260, 1123, 1, 0, 0, 0, 262, 1128, 1, 0, 0, 0, 264, 1133, 1, 0, 0, 0, 266, 1140, 1, 0, 0, 0, 268, 1149, 1, 0, 0, 0, 270, 1156, 1, 0, 0, 0, 272, 1160, 1, 0, 0, 0, 274, 1164, 1, 0, 0, 0, 276, 1168, 1, 0, 0, 0, 278, 1172, 1, 0, 0, 0, 280, 1178, 1, 0, 0, 0, 282, 1182, 1, 0, 0, 0, 284, 1186, 1, 0, 0, 0, 286, 1190, 1, 0, 0, 0, 288, 1194, 1, 0, 0, 0, 290, 1198, 1, 0, 0, 0, 292, 1202, 1, 0, 0, 0, 294, 1206, 1, 0, 0, 0, 296, 1210, 1, 0, 0, 0, 298, 1214, 1, 0, 0, 0, 300, 1219, 1, 0, 0, 0, 302, 1223, 1, 0, 0, 0, 304, 1227, 1, 0, 0, 0, 306, 1231, 1, 0, 0, 0, 308, 1236, 1, 0, 0, 0, 310, 1240, 1, 0, 0, 0, 312, 1244, 1, 0, 0, 0, 314, 1248, 1, 0, 0, 0, 316, 1252, 1, 0, 0, 0, 318, 1256, 1, 0, 0, 0, 320, 1262, 1, 0, 0, 0, 322, 1266, 1, 0, 0, 0, 324, 1270, 1, 0, 0, 0, 326, 1274, 1, 0, 0, 0, 328, 1278, 1, 0, 0, 0, 330, 1282, 1, 0, 0, 0, 332, 1286, 1, 0, 0, 0, 334, 1291, 1, 0, 0, 0, 336, 1295, 1, 0, 0, 0, 338, 1299, 1, 0, 0, 0, 340, 1303, 1, 0, 0, 0, 342, 1307, 1, 0, 0, 0, 344, 1311, 1, 0, 0, 0, 346, 1315, 1, 0, 0, 0, 348, 1320, 1, 0, 0, 0, 350, 1325, 1, 0, 0, 0, 352, 1329, 1, 0, 0, 0, 354, 1333, 1, 0, 0, 0, 356, 1337, 1, 0, 0, 0, 358, 1342, 1, 0, 0, 0, 360, 1352, 1, 0, 0, 0, 362, 1356, 1, 0, 0, 0, 364, 1360, 1, 0, 0, 0, 366, 1364, 1, 0, 0, 0, 368, 1369, 1, 0, 0, 0, 370, 1376, 1, 0, 0, 0, 372, 1380, 1, 0, 0, 0, 374, 1384, 1, 0, 0, 0, 376, 1388, 1, 0, 0, 0, 378, 1392, 1, 0, 0, 0, 380, 1397, 1, 0, 0, 0, 382, 1403, 1, 0, 0, 0, 384, 1409, 1, 0, 0, 0, 386, 1413, 1, 0, 0, 0, 388, 1417, 1, 0, 0, 0, 390, 1421, 1, 0, 0, 0, 392, 1427, 1, 0, 0, 0, 394, 1433, 1, 0, 0, 0, 396, 1437, 1, 0, 0, 0, 398, 1441, 1, 0, 0, 0, 400, 1445, 1, 0, 0, 0, 402, 1451, 1, 0, 0, 0, 404, 1457, 1, 0, 0, 0, 406, 1463, 1, 0, 0, 0, 408, 409, 7, 0, 0, 0, 409, 410, 7, 1, 0, 0, 410, 411, 7, 2, 0, 0, 411, 412, 7, 2, 0, 0, 412, 413, 7, 3, 0, 0, 413, 414, 7, 4, 0, 0, 414, 415, 7, 5, 0, 0, 415, 416, 1, 0, 0, 0, 416, 417, 6, 0, 0, 0, 417, 17, 1, 0, 0, 0, 418, 419, 7, 0, 0, 0, 419, 420, 7, 6, 0, 0, 420, 421, 7, 7, 0, 0, 421, 422, 7, 8, 0, 0, 422, 423, 1, 0, 0, 0, 423, 424, 6, 1, 1, 0, 424, 19, 1, 0, 0, 0, 425, 426, 7, 3, 0, 0, 426, 427, 7, 9, 0, 0, 427, 428, 7, 6, 0, 0, 428, 429, 7, 1, 0, 0, 429, 430, 7, 4, 0, 0, 430, 431, 7, 10, 0, 0, 431, 432, 1, 0, 0, 0, 432, 433, 6, 2, 2, 0, 433, 21, 1, 0, 0, 0, 434, 435, 7, 3, 0, 0, 435, 436, 7, 11, 0, 0, 436, 437, 7, 12, 0, 0, 437, 438, 7, 13, 0, 0, 438, 439, 1, 0, 0, 0, 439, 440, 6, 3, 0, 0, 440, 23, 1, 0, 0, 0, 441, 442, 7, 3, 0, 0, 442, 443, 7, 14, 0, 0, 443, 444, 7, 8, 0, 0, 444, 445, 7, 13, 0, 0, 445, 446, 7, 12, 0, 0, 446, 447, 7, 1, 0, 0, 447, 448, 7, 9, 0, 0, 448, 449, 1, 0, 0, 0, 449, 450, 6, 4, 3, 0, 450, 25, 1, 0, 0, 0, 451, 452, 7, 15, 0, 0, 452, 453, 7, 6, 0, 0, 453, 454, 7, 7, 0, 0, 454, 455, 7, 16, 0, 0, 455, 456, 1, 0, 0, 0, 456, 457, 6, 5, 4, 0, 457, 27, 1, 0, 0, 0, 458, 459, 7, 17, 0, 0, 459, 460, 7, 6, 0, 0, 460, 461, 7, 7, 0, 0, 461, 462, 7, 18, 0, 0, 462, 463, 1, 0, 0, 0, 463, 464, 6, 6, 0, 0, 464, 29, 1, 0, 0, 0, 465, 466, 7, 1, 0, 0, 466, 467, 7, 9, 0, 0, 467, 468, 7, 13, 0, 0, 468, 469, 7, 1, 0, 0, 469, 470, 7, 9, 0, 0, 470, 471, 7, 3, 0, 0, 471, 472, 7, 2, 0, 0, 472, 473, 7, 5, 0, 0, 473, 474, 7, 12, 0, 0, 474, 475, 7, 5, 0, 0, 475, 476, 7, 2, 0, 0, 476, 477, 1, 0, 0, 0, 477, 478, 6, 7, 0, 0, 478, 31, 1, 0, 0, 0, 479, 480, 7, 18, 0, 0, 480, 481, 7, 3, 0, 0, 481, 482, 7, 3, 0, 0, 482, 483, 7, 8, 0, 0, 483, 484, 1, 0, 0, 0, 484, 485, 6, 8, 1, 0, 485, 33, 1, 0, 0, 0, 486, 487, 7, 13, 0, 0, 487, 488, 7, 1, 0, 0, 488, 489, 7, 16, 0, 0, 489, 490, 7, 1, 0, 0, 490, 491, 7, 5, 0, 0, 491, 492, 1, 0, 0, 0, 492, 493, 6, 9, 0, 0, 493, 35, 1, 0, 0, 0, 494, 495, 7, 13, 0, 0, 495, 496, 7, 7, 0, 0, 496, 497, 7, 7, 0, 0, 497, 498, 7, 18, 0, 0, 498, 499, 7, 19, 0, 0, 499, 500, 7, 8, 0, 0, 500, 501, 1, 0, 0, 0, 501, 502, 6, 10, 5, 0, 502, 37, 1, 0, 0, 0, 503, 504, 7, 16, 0, 0, 504, 505, 7, 3, 0, 0, 505, 506, 7, 5, 0, 0, 506, 507, 7, 12, 0, 0, 507, 508, 1, 0, 0, 0, 508, 509, 6, 11, 6, 0, 509, 39, 1, 0, 0, 0, 510, 511, 7, 16, 0, 0, 511, 512, 7, 3, 0, 0, 512, 513, 7, 5, 0, 0, 513, 514, 7, 6, 0, 0, 514, 515, 7, 1, 0, 0, 515, 516, 7, 4, 0, 0, 516, 517, 7, 2, 0, 0, 517, 518, 1, 0, 0, 0, 518, 519, 6, 12, 7, 0, 519, 41, 1, 0, 0, 0, 520, 521, 7, 16, 0, 0, 521, 522, 7, 11, 0, 0, 522, 523, 5, 95, 0, 0, 523, 524, 7, 3, 0, 0, 524, 525, 7, 14, 0, 0, 525, 526, 7, 8, 0, 0, 526, 527, 7, 12, 0, 0, 527, 528, 7, 9, 0, 0, 528, 529, 7, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 531, 6, 13, 8, 0, 531, 43, 1, 0, 0, 0, 532, 533, 7, 6, 0, 0, 533, 534, 7, 3, 0, 0, 534, 535, 7, 9, 0, 0, 535, 536, 7, 12, 0, 0, 536, 537, 7, 16, 0, 0, 537, 538, 7, 3, 0, 0, 538, 539, 1, 0, 0, 0, 539, 540, 6, 14, 9, 0, 540, 45, 1, 0, 0, 0, 541, 542, 7, 6, 0, 0, 542, 543, 7, 7, 0, 0, 543, 544, 7, 20, 0, 0, 544, 545, 1, 0, 0, 0, 545, 546, 6, 15, 0, 0, 546, 47, 1, 0, 0, 0, 547, 548, 7, 2, 0, 0, 548, 549, 7, 10, 0, 0, 549, 550, 7, 7, 0, 0, 550, 551, 7, 20, 0, 0, 551, 552, 1, 0, 0, 0, 552, 553, 6, 16, 10, 0, 553, 49, 1, 0, 0, 0, 554, 555, 7, 2, 0, 0, 555, 556, 7, 7, 0, 0, 556, 557, 7, 6, 0, 0, 557, 558, 7, 5, 0, 0, 558, 559, 1, 0, 0, 0, 559, 560, 6, 17, 0, 0, 560, 51, 1, 0, 0, 0, 561, 562, 7, 2, 0, 0, 562, 563, 7, 5, 0, 0, 563, 564, 7, 12, 0, 0, 564, 565, 7, 5, 0, 0, 565, 566, 7, 2, 0, 0, 566, 567, 1, 0, 0, 0, 567, 568, 6, 18, 0, 0, 568, 53, 1, 0, 0, 0, 569, 570, 7, 20, 0, 0, 570, 571, 7, 10, 0, 0, 571, 572, 7, 3, 0, 0, 572, 573, 7, 6, 0, 0, 573, 574, 7, 3, 0, 0, 574, 575, 1, 0, 0, 0, 575, 576, 6, 19, 0, 0, 576, 55, 1, 0, 0, 0, 577, 578, 7, 16, 0, 0, 578, 579, 7, 12, 0, 0, 579, 580, 7, 5, 0, 0, 580, 581, 7, 4, 0, 0, 581, 582, 7, 10, 0, 0, 582, 583, 1, 0, 0, 0, 583, 584, 6, 20, 0, 0, 584, 57, 1, 0, 0, 0, 585, 587, 8, 21, 0, 0, 586, 585, 1, 0, 0, 0, 587, 588, 1, 0, 0, 0, 588, 586, 1, 0, 0, 0, 588, 589, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 591, 6, 21, 0, 0, 591, 59, 1, 0, 0, 0, 592, 593, 5, 47, 0, 0, 593, 594, 5, 47, 0, 0, 594, 598, 1, 0, 0, 0, 595, 597, 8, 22, 0, 0, 596, 595, 1, 0, 0, 0, 597, 600, 1, 0, 0, 0, 598, 596, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 602, 1, 0, 0, 0, 600, 598, 1, 0, 0, 0, 601, 603, 5, 13, 0, 0, 602, 601, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 605, 1, 0, 0, 0, 604, 606, 5, 10, 0, 0, 605, 604, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 607, 1, 0, 0, 0, 607, 608, 6, 22, 11, 0, 608, 61, 1, 0, 0, 0, 609, 610, 5, 47, 0, 0, 610, 611, 5, 42, 0, 0, 611, 616, 1, 0, 0, 0, 612, 615, 3, 62, 23, 0, 613, 615, 9, 0, 0, 0, 614, 612, 1, 0, 0, 0, 614, 613, 1, 0, 0, 0, 615, 618, 1, 0, 0, 0, 616, 617, 1, 0, 0, 0, 616, 614, 1, 0, 0, 0, 617, 619, 1, 0, 0, 0, 618, 616, 1, 0, 0, 0, 619, 620, 5, 42, 0, 0, 620, 621, 5, 47, 0, 0, 621, 622, 1, 0, 0, 0, 622, 623, 6, 23, 11, 0, 623, 63, 1, 0, 0, 0, 624, 626, 7, 23, 0, 0, 625, 624, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 625, 1, 0, 0, 0, 627, 628, 1, 0, 0, 0, 628, 629, 1, 0, 0, 0, 629, 630, 6, 24, 11, 0, 630, 65, 1, 0, 0, 0, 631, 635, 8, 24, 0, 0, 632, 633, 5, 47, 0, 0, 633, 635, 8, 25, 0, 0, 634, 631, 1, 0, 0, 0, 634, 632, 1, 0, 0, 0, 635, 67, 1, 0, 0, 0, 636, 638, 3, 66, 25, 0, 637, 636, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 637, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 69, 1, 0, 0, 0, 641, 642, 3, 182, 83, 0, 642, 643, 1, 0, 0, 0, 643, 644, 6, 27, 12, 0, 644, 645, 6, 27, 13, 0, 645, 71, 1, 0, 0, 0, 646, 647, 3, 80, 32, 0, 647, 648, 1, 0, 0, 0, 648, 649, 6, 28, 14, 0, 649, 650, 6, 28, 15, 0, 650, 73, 1, 0, 0, 0, 651, 652, 3, 64, 24, 0, 652, 653, 1, 0, 0, 0, 653, 654, 6, 29, 11, 0, 654, 75, 1, 0, 0, 0, 655, 656, 3, 60, 22, 0, 656, 657, 1, 0, 0, 0, 657, 658, 6, 30, 11, 0, 658, 77, 1, 0, 0, 0, 659, 660, 3, 62, 23, 0, 660, 661, 1, 0, 0, 0, 661, 662, 6, 31, 11, 0, 662, 79, 1, 0, 0, 0, 663, 664, 5, 124, 0, 0, 664, 665, 1, 0, 0, 0, 665, 666, 6, 32, 15, 0, 666, 81, 1, 0, 0, 0, 667, 668, 7, 26, 0, 0, 668, 83, 1, 0, 0, 0, 669, 670, 7, 27, 0, 0, 670, 85, 1, 0, 0, 0, 671, 672, 5, 92, 0, 0, 672, 673, 7, 28, 0, 0, 673, 87, 1, 0, 0, 0, 674, 675, 8, 29, 0, 0, 675, 89, 1, 0, 0, 0, 676, 678, 7, 3, 0, 0, 677, 679, 7, 30, 0, 0, 678, 677, 1, 0, 0, 0, 678, 679, 1, 0, 0, 0, 679, 681, 1, 0, 0, 0, 680, 682, 3, 82, 33, 0, 681, 680, 1, 0, 0, 0, 682, 683, 1, 0, 0, 0, 683, 681, 1, 0, 0, 0, 683, 684, 1, 0, 0, 0, 684, 91, 1, 0, 0, 0, 685, 686, 5, 64, 0, 0, 686, 93, 1, 0, 0, 0, 687, 688, 5, 96, 0, 0, 688, 95, 1, 0, 0, 0, 689, 693, 8, 31, 0, 0, 690, 691, 5, 96, 0, 0, 691, 693, 5, 96, 0, 0, 692, 689, 1, 0, 0, 0, 692, 690, 1, 0, 0, 0, 693, 97, 1, 0, 0, 0, 694, 695, 5, 95, 0, 0, 695, 99, 1, 0, 0, 0, 696, 700, 3, 84, 34, 0, 697, 700, 3, 82, 33, 0, 698, 700, 3, 98, 41, 0, 699, 696, 1, 0, 0, 0, 699, 697, 1, 0, 0, 0, 699, 698, 1, 0, 0, 0, 700, 101, 1, 0, 0, 0, 701, 706, 5, 34, 0, 0, 702, 705, 3, 86, 35, 0, 703, 705, 3, 88, 36, 0, 704, 702, 1, 0, 0, 0, 704, 703, 1, 0, 0, 0, 705, 708, 1, 0, 0, 0, 706, 704, 1, 0, 0, 0, 706, 707, 1, 0, 0, 0, 707, 709, 1, 0, 0, 0, 708, 706, 1, 0, 0, 0, 709, 731, 5, 34, 0, 0, 710, 711, 5, 34, 0, 0, 711, 712, 5, 34, 0, 0, 712, 713, 5, 34, 0, 0, 713, 717, 1, 0, 0, 0, 714, 716, 8, 22, 0, 0, 715, 714, 1, 0, 0, 0, 716, 719, 1, 0, 0, 0, 717, 718, 1, 0, 0, 0, 717, 715, 1, 0, 0, 0, 718, 720, 1, 0, 0, 0, 719, 717, 1, 0, 0, 0, 720, 721, 5, 34, 0, 0, 721, 722, 5, 34, 0, 0, 722, 723, 5, 34, 0, 0, 723, 725, 1, 0, 0, 0, 724, 726, 5, 34, 0, 0, 725, 724, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 728, 1, 0, 0, 0, 727, 729, 5, 34, 0, 0, 728, 727, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 731, 1, 0, 0, 0, 730, 701, 1, 0, 0, 0, 730, 710, 1, 0, 0, 0, 731, 103, 1, 0, 0, 0, 732, 734, 3, 82, 33, 0, 733, 732, 1, 0, 0, 0, 734, 735, 1, 0, 0, 0, 735, 733, 1, 0, 0, 0, 735, 736, 1, 0, 0, 0, 736, 105, 1, 0, 0, 0, 737, 739, 3, 82, 33, 0, 738, 737, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 738, 1, 0, 0, 0, 740, 741, 1, 0, 0, 0, 741, 742, 1, 0, 0, 0, 742, 746, 3, 122, 53, 0, 743, 745, 3, 82, 33, 0, 744, 743, 1, 0, 0, 0, 745, 748, 1, 0, 0, 0, 746, 744, 1, 0, 0, 0, 746, 747, 1, 0, 0, 0, 747, 780, 1, 0, 0, 0, 748, 746, 1, 0, 0, 0, 749, 751, 3, 122, 53, 0, 750, 752, 3, 82, 33, 0, 751, 750, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 751, 1, 0, 0, 0, 753, 754, 1, 0, 0, 0, 754, 780, 1, 0, 0, 0, 755, 757, 3, 82, 33, 0, 756, 755, 1, 0, 0, 0, 757, 758, 1, 0, 0, 0, 758, 756, 1, 0, 0, 0, 758, 759, 1, 0, 0, 0, 759, 767, 1, 0, 0, 0, 760, 764, 3, 122, 53, 0, 761, 763, 3, 82, 33, 0, 762, 761, 1, 0, 0, 0, 763, 766, 1, 0, 0, 0, 764, 762, 1, 0, 0, 0, 764, 765, 1, 0, 0, 0, 765, 768, 1, 0, 0, 0, 766, 764, 1, 0, 0, 0, 767, 760, 1, 0, 0, 0, 767, 768, 1, 0, 0, 0, 768, 769, 1, 0, 0, 0, 769, 770, 3, 90, 37, 0, 770, 780, 1, 0, 0, 0, 771, 773, 3, 122, 53, 0, 772, 774, 3, 82, 33, 0, 773, 772, 1, 0, 0, 0, 774, 775, 1, 0, 0, 0, 775, 773, 1, 0, 0, 0, 775, 776, 1, 0, 0, 0, 776, 777, 1, 0, 0, 0, 777, 778, 3, 90, 37, 0, 778, 780, 1, 0, 0, 0, 779, 738, 1, 0, 0, 0, 779, 749, 1, 0, 0, 0, 779, 756, 1, 0, 0, 0, 779, 771, 1, 0, 0, 0, 780, 107, 1, 0, 0, 0, 781, 782, 7, 32, 0, 0, 782, 783, 7, 33, 0, 0, 783, 109, 1, 0, 0, 0, 784, 785, 7, 12, 0, 0, 785, 786, 7, 9, 0, 0, 786, 787, 7, 0, 0, 0, 787, 111, 1, 0, 0, 0, 788, 789, 7, 12, 0, 0, 789, 790, 7, 2, 0, 0, 790, 791, 7, 4, 0, 0, 791, 113, 1, 0, 0, 0, 792, 793, 5, 61, 0, 0, 793, 115, 1, 0, 0, 0, 794, 795, 5, 58, 0, 0, 795, 796, 5, 58, 0, 0, 796, 117, 1, 0, 0, 0, 797, 798, 5, 44, 0, 0, 798, 119, 1, 0, 0, 0, 799, 800, 7, 0, 0, 0, 800, 801, 7, 3, 0, 0, 801, 802, 7, 2, 0, 0, 802, 803, 7, 4, 0, 0, 803, 121, 1, 0, 0, 0, 804, 805, 5, 46, 0, 0, 805, 123, 1, 0, 0, 0, 806, 807, 7, 15, 0, 0, 807, 808, 7, 12, 0, 0, 808, 809, 7, 13, 0, 0, 809, 810, 7, 2, 0, 0, 810, 811, 7, 3, 0, 0, 811, 125, 1, 0, 0, 0, 812, 813, 7, 15, 0, 0, 813, 814, 7, 1, 0, 0, 814, 815, 7, 6, 0, 0, 815, 816, 7, 2, 0, 0, 816, 817, 7, 5, 0, 0, 817, 127, 1, 0, 0, 0, 818, 819, 7, 1, 0, 0, 819, 820, 7, 9, 0, 0, 820, 129, 1, 0, 0, 0, 821, 822, 7, 1, 0, 0, 822, 823, 7, 2, 0, 0, 823, 131, 1, 0, 0, 0, 824, 825, 7, 13, 0, 0, 825, 826, 7, 12, 0, 0, 826, 827, 7, 2, 0, 0, 827, 828, 7, 5, 0, 0, 828, 133, 1, 0, 0, 0, 829, 830, 7, 13, 0, 0, 830, 831, 7, 1, 0, 0, 831, 832, 7, 18, 0, 0, 832, 833, 7, 3, 0, 0, 833, 135, 1, 0, 0, 0, 834, 835, 5, 40, 0, 0, 835, 137, 1, 0, 0, 0, 836, 837, 7, 16, 0, 0, 837, 838, 7, 12, 0, 0, 838, 839, 7, 5, 0, 0, 839, 840, 7, 4, 0, 0, 840, 841, 7, 10, 0, 0, 841, 139, 1, 0, 0, 0, 842, 843, 7, 9, 0, 0, 843, 844, 7, 7, 0, 0, 844, 845, 7, 5, 0, 0, 845, 141, 1, 0, 0, 0, 846, 847, 7, 9, 0, 0, 847, 848, 7, 19, 0, 0, 848, 849, 7, 13, 0, 0, 849, 850, 7, 13, 0, 0, 850, 143, 1, 0, 0, 0, 851, 852, 7, 9, 0, 0, 852, 853, 7, 19, 0, 0, 853, 854, 7, 13, 0, 0, 854, 855, 7, 13, 0, 0, 855, 856, 7, 2, 0, 0, 856, 145, 1, 0, 0, 0, 857, 858, 7, 7, 0, 0, 858, 859, 7, 6, 0, 0, 859, 147, 1, 0, 0, 0, 860, 861, 5, 63, 0, 0, 861, 149, 1, 0, 0, 0, 862, 863, 7, 6, 0, 0, 863, 864, 7, 13, 0, 0, 864, 865, 7, 1, 0, 0, 865, 866, 7, 18, 0, 0, 866, 867, 7, 3, 0, 0, 867, 151, 1, 0, 0, 0, 868, 869, 5, 41, 0, 0, 869, 153, 1, 0, 0, 0, 870, 871, 7, 5, 0, 0, 871, 872, 7, 6, 0, 0, 872, 873, 7, 19, 0, 0, 873, 874, 7, 3, 0, 0, 874, 155, 1, 0, 0, 0, 875, 876, 5, 61, 0, 0, 876, 877, 5, 61, 0, 0, 877, 157, 1, 0, 0, 0, 878, 879, 5, 61, 0, 0, 879, 880, 5, 126, 0, 0, 880, 159, 1, 0, 0, 0, 881, 882, 5, 33, 0, 0, 882, 883, 5, 61, 0, 0, 883, 161, 1, 0, 0, 0, 884, 885, 5, 60, 0, 0, 885, 163, 1, 0, 0, 0, 886, 887, 5, 60, 0, 0, 887, 888, 5, 61, 0, 0, 888, 165, 1, 0, 0, 0, 889, 890, 5, 62, 0, 0, 890, 167, 1, 0, 0, 0, 891, 892, 5, 62, 0, 0, 892, 893, 5, 61, 0, 0, 893, 169, 1, 0, 0, 0, 894, 895, 5, 43, 0, 0, 895, 171, 1, 0, 0, 0, 896, 897, 5, 45, 0, 0, 897, 173, 1, 0, 0, 0, 898, 899, 5, 42, 0, 0, 899, 175, 1, 0, 0, 0, 900, 901, 5, 47, 0, 0, 901, 177, 1, 0, 0, 0, 902, 903, 5, 37, 0, 0, 903, 179, 1, 0, 0, 0, 904, 905, 3, 148, 66, 0, 905, 909, 3, 84, 34, 0, 906, 908, 3, 100, 42, 0, 907, 906, 1, 0, 0, 0, 908, 911, 1, 0, 0, 0, 909, 907, 1, 0, 0, 0, 909, 910, 1, 0, 0, 0, 910, 919, 1, 0, 0, 0, 911, 909, 1, 0, 0, 0, 912, 914, 3, 148, 66, 0, 913, 915, 3, 82, 33, 0, 914, 913, 1, 0, 0, 0, 915, 916, 1, 0, 0, 0, 916, 914, 1, 0, 0, 0, 916, 917, 1, 0, 0, 0, 917, 919, 1, 0, 0, 0, 918, 904, 1, 0, 0, 0, 918, 912, 1, 0, 0, 0, 919, 181, 1, 0, 0, 0, 920, 921, 5, 91, 0, 0, 921, 922, 1, 0, 0, 0, 922, 923, 6, 83, 0, 0, 923, 924, 6, 83, 0, 0, 924, 183, 1, 0, 0, 0, 925, 926, 5, 93, 0, 0, 926, 927, 1, 0, 0, 0, 927, 928, 6, 84, 15, 0, 928, 929, 6, 84, 15, 0, 929, 185, 1, 0, 0, 0, 930, 934, 3, 84, 34, 0, 931, 933, 3, 100, 42, 0, 932, 931, 1, 0, 0, 0, 933, 936, 1, 0, 0, 0, 934, 932, 1, 0, 0, 0, 934, 935, 1, 0, 0, 0, 935, 947, 1, 0, 0, 0, 936, 934, 1, 0, 0, 0, 937, 940, 3, 98, 41, 0, 938, 940, 3, 92, 38, 0, 939, 937, 1, 0, 0, 0, 939, 938, 1, 0, 0, 0, 940, 942, 1, 0, 0, 0, 941, 943, 3, 100, 42, 0, 942, 941, 1, 0, 0, 0, 943, 944, 1, 0, 0, 0, 944, 942, 1, 0, 0, 0, 944, 945, 1, 0, 0, 0, 945, 947, 1, 0, 0, 0, 946, 930, 1, 0, 0, 0, 946, 939, 1, 0, 0, 0, 947, 187, 1, 0, 0, 0, 948, 950, 3, 94, 39, 0, 949, 951, 3, 96, 40, 0, 950, 949, 1, 0, 0, 0, 951, 952, 1, 0, 0, 0, 952, 950, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 954, 1, 0, 0, 0, 954, 955, 3, 94, 39, 0, 955, 189, 1, 0, 0, 0, 956, 957, 3, 188, 86, 0, 957, 191, 1, 0, 0, 0, 958, 959, 3, 60, 22, 0, 959, 960, 1, 0, 0, 0, 960, 961, 6, 88, 11, 0, 961, 193, 1, 0, 0, 0, 962, 963, 3, 62, 23, 0, 963, 964, 1, 0, 0, 0, 964, 965, 6, 89, 11, 0, 965, 195, 1, 0, 0, 0, 966, 967, 3, 64, 24, 0, 967, 968, 1, 0, 0, 0, 968, 969, 6, 90, 11, 0, 969, 197, 1, 0, 0, 0, 970, 971, 3, 80, 32, 0, 971, 972, 1, 0, 0, 0, 972, 973, 6, 91, 14, 0, 973, 974, 6, 91, 15, 0, 974, 199, 1, 0, 0, 0, 975, 976, 3, 182, 83, 0, 976, 977, 1, 0, 0, 0, 977, 978, 6, 92, 12, 0, 978, 201, 1, 0, 0, 0, 979, 980, 3, 184, 84, 0, 980, 981, 1, 0, 0, 0, 981, 982, 6, 93, 16, 0, 982, 203, 1, 0, 0, 0, 983, 984, 3, 368, 176, 0, 984, 985, 1, 0, 0, 0, 985, 986, 6, 94, 17, 0, 986, 205, 1, 0, 0, 0, 987, 988, 3, 118, 51, 0, 988, 989, 1, 0, 0, 0, 989, 990, 6, 95, 18, 0, 990, 207, 1, 0, 0, 0, 991, 992, 3, 114, 49, 0, 992, 993, 1, 0, 0, 0, 993, 994, 6, 96, 19, 0, 994, 209, 1, 0, 0, 0, 995, 996, 7, 16, 0, 0, 996, 997, 7, 3, 0, 0, 997, 998, 7, 5, 0, 0, 998, 999, 7, 12, 0, 0, 999, 1000, 7, 0, 0, 0, 1000, 1001, 7, 12, 0, 0, 1001, 1002, 7, 5, 0, 0, 1002, 1003, 7, 12, 0, 0, 1003, 211, 1, 0, 0, 0, 1004, 1005, 3, 68, 26, 0, 1005, 1006, 1, 0, 0, 0, 1006, 1007, 6, 98, 20, 0, 1007, 213, 1, 0, 0, 0, 1008, 1009, 3, 102, 43, 0, 1009, 1010, 1, 0, 0, 0, 1010, 1011, 6, 99, 21, 0, 1011, 215, 1, 0, 0, 0, 1012, 1013, 3, 60, 22, 0, 1013, 1014, 1, 0, 0, 0, 1014, 1015, 6, 100, 11, 0, 1015, 217, 1, 0, 0, 0, 1016, 1017, 3, 62, 23, 0, 1017, 1018, 1, 0, 0, 0, 1018, 1019, 6, 101, 11, 0, 1019, 219, 1, 0, 0, 0, 1020, 1021, 3, 64, 24, 0, 1021, 1022, 1, 0, 0, 0, 1022, 1023, 6, 102, 11, 0, 1023, 221, 1, 0, 0, 0, 1024, 1025, 3, 80, 32, 0, 1025, 1026, 1, 0, 0, 0, 1026, 1027, 6, 103, 14, 0, 1027, 1028, 6, 103, 15, 0, 1028, 223, 1, 0, 0, 0, 1029, 1030, 3, 122, 53, 0, 1030, 1031, 1, 0, 0, 0, 1031, 1032, 6, 104, 22, 0, 1032, 225, 1, 0, 0, 0, 1033, 1034, 3, 118, 51, 0, 1034, 1035, 1, 0, 0, 0, 1035, 1036, 6, 105, 18, 0, 1036, 227, 1, 0, 0, 0, 1037, 1042, 3, 84, 34, 0, 1038, 1042, 3, 82, 33, 0, 1039, 1042, 3, 98, 41, 0, 1040, 1042, 3, 174, 79, 0, 1041, 1037, 1, 0, 0, 0, 1041, 1038, 1, 0, 0, 0, 1041, 1039, 1, 0, 0, 0, 1041, 1040, 1, 0, 0, 0, 1042, 229, 1, 0, 0, 0, 1043, 1046, 3, 84, 34, 0, 1044, 1046, 3, 174, 79, 0, 1045, 1043, 1, 0, 0, 0, 1045, 1044, 1, 0, 0, 0, 1046, 1050, 1, 0, 0, 0, 1047, 1049, 3, 228, 106, 0, 1048, 1047, 1, 0, 0, 0, 1049, 1052, 1, 0, 0, 0, 1050, 1048, 1, 0, 0, 0, 1050, 1051, 1, 0, 0, 0, 1051, 1063, 1, 0, 0, 0, 1052, 1050, 1, 0, 0, 0, 1053, 1056, 3, 98, 41, 0, 1054, 1056, 3, 92, 38, 0, 1055, 1053, 1, 0, 0, 0, 1055, 1054, 1, 0, 0, 0, 1056, 1058, 1, 0, 0, 0, 1057, 1059, 3, 228, 106, 0, 1058, 1057, 1, 0, 0, 0, 1059, 1060, 1, 0, 0, 0, 1060, 1058, 1, 0, 0, 0, 1060, 1061, 1, 0, 0, 0, 1061, 1063, 1, 0, 0, 0, 1062, 1045, 1, 0, 0, 0, 1062, 1055, 1, 0, 0, 0, 1063, 231, 1, 0, 0, 0, 1064, 1067, 3, 230, 107, 0, 1065, 1067, 3, 188, 86, 0, 1066, 1064, 1, 0, 0, 0, 1066, 1065, 1, 0, 0, 0, 1067, 1068, 1, 0, 0, 0, 1068, 1066, 1, 0, 0, 0, 1068, 1069, 1, 0, 0, 0, 1069, 233, 1, 0, 0, 0, 1070, 1071, 3, 60, 22, 0, 1071, 1072, 1, 0, 0, 0, 1072, 1073, 6, 109, 11, 0, 1073, 235, 1, 0, 0, 0, 1074, 1075, 3, 62, 23, 0, 1075, 1076, 1, 0, 0, 0, 1076, 1077, 6, 110, 11, 0, 1077, 237, 1, 0, 0, 0, 1078, 1079, 3, 64, 24, 0, 1079, 1080, 1, 0, 0, 0, 1080, 1081, 6, 111, 11, 0, 1081, 239, 1, 0, 0, 0, 1082, 1083, 3, 80, 32, 0, 1083, 1084, 1, 0, 0, 0, 1084, 1085, 6, 112, 14, 0, 1085, 1086, 6, 112, 15, 0, 1086, 241, 1, 0, 0, 0, 1087, 1088, 3, 114, 49, 0, 1088, 1089, 1, 0, 0, 0, 1089, 1090, 6, 113, 19, 0, 1090, 243, 1, 0, 0, 0, 1091, 1092, 3, 118, 51, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1094, 6, 114, 18, 0, 1094, 245, 1, 0, 0, 0, 1095, 1096, 3, 122, 53, 0, 1096, 1097, 1, 0, 0, 0, 1097, 1098, 6, 115, 22, 0, 1098, 247, 1, 0, 0, 0, 1099, 1100, 7, 12, 0, 0, 1100, 1101, 7, 2, 0, 0, 1101, 249, 1, 0, 0, 0, 1102, 1103, 3, 232, 108, 0, 1103, 1104, 1, 0, 0, 0, 1104, 1105, 6, 117, 23, 0, 1105, 251, 1, 0, 0, 0, 1106, 1107, 3, 60, 22, 0, 1107, 1108, 1, 0, 0, 0, 1108, 1109, 6, 118, 11, 0, 1109, 253, 1, 0, 0, 0, 1110, 1111, 3, 62, 23, 0, 1111, 1112, 1, 0, 0, 0, 1112, 1113, 6, 119, 11, 0, 1113, 255, 1, 0, 0, 0, 1114, 1115, 3, 64, 24, 0, 1115, 1116, 1, 0, 0, 0, 1116, 1117, 6, 120, 11, 0, 1117, 257, 1, 0, 0, 0, 1118, 1119, 3, 80, 32, 0, 1119, 1120, 1, 0, 0, 0, 1120, 1121, 6, 121, 14, 0, 1121, 1122, 6, 121, 15, 0, 1122, 259, 1, 0, 0, 0, 1123, 1124, 3, 182, 83, 0, 1124, 1125, 1, 0, 0, 0, 1125, 1126, 6, 122, 12, 0, 1126, 1127, 6, 122, 24, 0, 1127, 261, 1, 0, 0, 0, 1128, 1129, 7, 7, 0, 0, 1129, 1130, 7, 9, 0, 0, 1130, 1131, 1, 0, 0, 0, 1131, 1132, 6, 123, 25, 0, 1132, 263, 1, 0, 0, 0, 1133, 1134, 7, 20, 0, 0, 1134, 1135, 7, 1, 0, 0, 1135, 1136, 7, 5, 0, 0, 1136, 1137, 7, 10, 0, 0, 1137, 1138, 1, 0, 0, 0, 1138, 1139, 6, 124, 25, 0, 1139, 265, 1, 0, 0, 0, 1140, 1141, 8, 34, 0, 0, 1141, 267, 1, 0, 0, 0, 1142, 1144, 3, 266, 125, 0, 1143, 1142, 1, 0, 0, 0, 1144, 1145, 1, 0, 0, 0, 1145, 1143, 1, 0, 0, 0, 1145, 1146, 1, 0, 0, 0, 1146, 1147, 1, 0, 0, 0, 1147, 1148, 3, 368, 176, 0, 1148, 1150, 1, 0, 0, 0, 1149, 1143, 1, 0, 0, 0, 1149, 1150, 1, 0, 0, 0, 1150, 1152, 1, 0, 0, 0, 1151, 1153, 3, 266, 125, 0, 1152, 1151, 1, 0, 0, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1152, 1, 0, 0, 0, 1154, 1155, 1, 0, 0, 0, 1155, 269, 1, 0, 0, 0, 1156, 1157, 3, 268, 126, 0, 1157, 1158, 1, 0, 0, 0, 1158, 1159, 6, 127, 26, 0, 1159, 271, 1, 0, 0, 0, 1160, 1161, 3, 60, 22, 0, 1161, 1162, 1, 0, 0, 0, 1162, 1163, 6, 128, 11, 0, 1163, 273, 1, 0, 0, 0, 1164, 1165, 3, 62, 23, 0, 1165, 1166, 1, 0, 0, 0, 1166, 1167, 6, 129, 11, 0, 1167, 275, 1, 0, 0, 0, 1168, 1169, 3, 64, 24, 0, 1169, 1170, 1, 0, 0, 0, 1170, 1171, 6, 130, 11, 0, 1171, 277, 1, 0, 0, 0, 1172, 1173, 3, 80, 32, 0, 1173, 1174, 1, 0, 0, 0, 1174, 1175, 6, 131, 14, 0, 1175, 1176, 6, 131, 15, 0, 1176, 1177, 6, 131, 15, 0, 1177, 279, 1, 0, 0, 0, 1178, 1179, 3, 114, 49, 0, 1179, 1180, 1, 0, 0, 0, 1180, 1181, 6, 132, 19, 0, 1181, 281, 1, 0, 0, 0, 1182, 1183, 3, 118, 51, 0, 1183, 1184, 1, 0, 0, 0, 1184, 1185, 6, 133, 18, 0, 1185, 283, 1, 0, 0, 0, 1186, 1187, 3, 122, 53, 0, 1187, 1188, 1, 0, 0, 0, 1188, 1189, 6, 134, 22, 0, 1189, 285, 1, 0, 0, 0, 1190, 1191, 3, 264, 124, 0, 1191, 1192, 1, 0, 0, 0, 1192, 1193, 6, 135, 27, 0, 1193, 287, 1, 0, 0, 0, 1194, 1195, 3, 232, 108, 0, 1195, 1196, 1, 0, 0, 0, 1196, 1197, 6, 136, 23, 0, 1197, 289, 1, 0, 0, 0, 1198, 1199, 3, 190, 87, 0, 1199, 1200, 1, 0, 0, 0, 1200, 1201, 6, 137, 28, 0, 1201, 291, 1, 0, 0, 0, 1202, 1203, 3, 60, 22, 0, 1203, 1204, 1, 0, 0, 0, 1204, 1205, 6, 138, 11, 0, 1205, 293, 1, 0, 0, 0, 1206, 1207, 3, 62, 23, 0, 1207, 1208, 1, 0, 0, 0, 1208, 1209, 6, 139, 11, 0, 1209, 295, 1, 0, 0, 0, 1210, 1211, 3, 64, 24, 0, 1211, 1212, 1, 0, 0, 0, 1212, 1213, 6, 140, 11, 0, 1213, 297, 1, 0, 0, 0, 1214, 1215, 3, 80, 32, 0, 1215, 1216, 1, 0, 0, 0, 1216, 1217, 6, 141, 14, 0, 1217, 1218, 6, 141, 15, 0, 1218, 299, 1, 0, 0, 0, 1219, 1220, 3, 368, 176, 0, 1220, 1221, 1, 0, 0, 0, 1221, 1222, 6, 142, 17, 0, 1222, 301, 1, 0, 0, 0, 1223, 1224, 3, 118, 51, 0, 1224, 1225, 1, 0, 0, 0, 1225, 1226, 6, 143, 18, 0, 1226, 303, 1, 0, 0, 0, 1227, 1228, 3, 122, 53, 0, 1228, 1229, 1, 0, 0, 0, 1229, 1230, 6, 144, 22, 0, 1230, 305, 1, 0, 0, 0, 1231, 1232, 3, 262, 123, 0, 1232, 1233, 1, 0, 0, 0, 1233, 1234, 6, 145, 29, 0, 1234, 1235, 6, 145, 30, 0, 1235, 307, 1, 0, 0, 0, 1236, 1237, 3, 68, 26, 0, 1237, 1238, 1, 0, 0, 0, 1238, 1239, 6, 146, 20, 0, 1239, 309, 1, 0, 0, 0, 1240, 1241, 3, 102, 43, 0, 1241, 1242, 1, 0, 0, 0, 1242, 1243, 6, 147, 21, 0, 1243, 311, 1, 0, 0, 0, 1244, 1245, 3, 60, 22, 0, 1245, 1246, 1, 0, 0, 0, 1246, 1247, 6, 148, 11, 0, 1247, 313, 1, 0, 0, 0, 1248, 1249, 3, 62, 23, 0, 1249, 1250, 1, 0, 0, 0, 1250, 1251, 6, 149, 11, 0, 1251, 315, 1, 0, 0, 0, 1252, 1253, 3, 64, 24, 0, 1253, 1254, 1, 0, 0, 0, 1254, 1255, 6, 150, 11, 0, 1255, 317, 1, 0, 0, 0, 1256, 1257, 3, 80, 32, 0, 1257, 1258, 1, 0, 0, 0, 1258, 1259, 6, 151, 14, 0, 1259, 1260, 6, 151, 15, 0, 1260, 1261, 6, 151, 15, 0, 1261, 319, 1, 0, 0, 0, 1262, 1263, 3, 118, 51, 0, 1263, 1264, 1, 0, 0, 0, 1264, 1265, 6, 152, 18, 0, 1265, 321, 1, 0, 0, 0, 1266, 1267, 3, 122, 53, 0, 1267, 1268, 1, 0, 0, 0, 1268, 1269, 6, 153, 22, 0, 1269, 323, 1, 0, 0, 0, 1270, 1271, 3, 232, 108, 0, 1271, 1272, 1, 0, 0, 0, 1272, 1273, 6, 154, 23, 0, 1273, 325, 1, 0, 0, 0, 1274, 1275, 3, 60, 22, 0, 1275, 1276, 1, 0, 0, 0, 1276, 1277, 6, 155, 11, 0, 1277, 327, 1, 0, 0, 0, 1278, 1279, 3, 62, 23, 0, 1279, 1280, 1, 0, 0, 0, 1280, 1281, 6, 156, 11, 0, 1281, 329, 1, 0, 0, 0, 1282, 1283, 3, 64, 24, 0, 1283, 1284, 1, 0, 0, 0, 1284, 1285, 6, 157, 11, 0, 1285, 331, 1, 0, 0, 0, 1286, 1287, 3, 80, 32, 0, 1287, 1288, 1, 0, 0, 0, 1288, 1289, 6, 158, 14, 0, 1289, 1290, 6, 158, 15, 0, 1290, 333, 1, 0, 0, 0, 1291, 1292, 3, 122, 53, 0, 1292, 1293, 1, 0, 0, 0, 1293, 1294, 6, 159, 22, 0, 1294, 335, 1, 0, 0, 0, 1295, 1296, 3, 190, 87, 0, 1296, 1297, 1, 0, 0, 0, 1297, 1298, 6, 160, 28, 0, 1298, 337, 1, 0, 0, 0, 1299, 1300, 3, 186, 85, 0, 1300, 1301, 1, 0, 0, 0, 1301, 1302, 6, 161, 31, 0, 1302, 339, 1, 0, 0, 0, 1303, 1304, 3, 60, 22, 0, 1304, 1305, 1, 0, 0, 0, 1305, 1306, 6, 162, 11, 0, 1306, 341, 1, 0, 0, 0, 1307, 1308, 3, 62, 23, 0, 1308, 1309, 1, 0, 0, 0, 1309, 1310, 6, 163, 11, 0, 1310, 343, 1, 0, 0, 0, 1311, 1312, 3, 64, 24, 0, 1312, 1313, 1, 0, 0, 0, 1313, 1314, 6, 164, 11, 0, 1314, 345, 1, 0, 0, 0, 1315, 1316, 3, 80, 32, 0, 1316, 1317, 1, 0, 0, 0, 1317, 1318, 6, 165, 14, 0, 1318, 1319, 6, 165, 15, 0, 1319, 347, 1, 0, 0, 0, 1320, 1321, 7, 1, 0, 0, 1321, 1322, 7, 9, 0, 0, 1322, 1323, 7, 15, 0, 0, 1323, 1324, 7, 7, 0, 0, 1324, 349, 1, 0, 0, 0, 1325, 1326, 3, 60, 22, 0, 1326, 1327, 1, 0, 0, 0, 1327, 1328, 6, 167, 11, 0, 1328, 351, 1, 0, 0, 0, 1329, 1330, 3, 62, 23, 0, 1330, 1331, 1, 0, 0, 0, 1331, 1332, 6, 168, 11, 0, 1332, 353, 1, 0, 0, 0, 1333, 1334, 3, 64, 24, 0, 1334, 1335, 1, 0, 0, 0, 1335, 1336, 6, 169, 11, 0, 1336, 355, 1, 0, 0, 0, 1337, 1338, 3, 80, 32, 0, 1338, 1339, 1, 0, 0, 0, 1339, 1340, 6, 170, 14, 0, 1340, 1341, 6, 170, 15, 0, 1341, 357, 1, 0, 0, 0, 1342, 1343, 7, 15, 0, 0, 1343, 1344, 7, 19, 0, 0, 1344, 1345, 7, 9, 0, 0, 1345, 1346, 7, 4, 0, 0, 1346, 1347, 7, 5, 0, 0, 1347, 1348, 7, 1, 0, 0, 1348, 1349, 7, 7, 0, 0, 1349, 1350, 7, 9, 0, 0, 1350, 1351, 7, 2, 0, 0, 1351, 359, 1, 0, 0, 0, 1352, 1353, 3, 60, 22, 0, 1353, 1354, 1, 0, 0, 0, 1354, 1355, 6, 172, 11, 0, 1355, 361, 1, 0, 0, 0, 1356, 1357, 3, 62, 23, 0, 1357, 1358, 1, 0, 0, 0, 1358, 1359, 6, 173, 11, 0, 1359, 363, 1, 0, 0, 0, 1360, 1361, 3, 64, 24, 0, 1361, 1362, 1, 0, 0, 0, 1362, 1363, 6, 174, 11, 0, 1363, 365, 1, 0, 0, 0, 1364, 1365, 3, 184, 84, 0, 1365, 1366, 1, 0, 0, 0, 1366, 1367, 6, 175, 16, 0, 1367, 1368, 6, 175, 15, 0, 1368, 367, 1, 0, 0, 0, 1369, 1370, 5, 58, 0, 0, 1370, 369, 1, 0, 0, 0, 1371, 1377, 3, 92, 38, 0, 1372, 1377, 3, 82, 33, 0, 1373, 1377, 3, 122, 53, 0, 1374, 1377, 3, 84, 34, 0, 1375, 1377, 3, 98, 41, 0, 1376, 1371, 1, 0, 0, 0, 1376, 1372, 1, 0, 0, 0, 1376, 1373, 1, 0, 0, 0, 1376, 1374, 1, 0, 0, 0, 1376, 1375, 1, 0, 0, 0, 1377, 1378, 1, 0, 0, 0, 1378, 1376, 1, 0, 0, 0, 1378, 1379, 1, 0, 0, 0, 1379, 371, 1, 0, 0, 0, 1380, 1381, 3, 60, 22, 0, 1381, 1382, 1, 0, 0, 0, 1382, 1383, 6, 178, 11, 0, 1383, 373, 1, 0, 0, 0, 1384, 1385, 3, 62, 23, 0, 1385, 1386, 1, 0, 0, 0, 1386, 1387, 6, 179, 11, 0, 1387, 375, 1, 0, 0, 0, 1388, 1389, 3, 64, 24, 0, 1389, 1390, 1, 0, 0, 0, 1390, 1391, 6, 180, 11, 0, 1391, 377, 1, 0, 0, 0, 1392, 1393, 3, 80, 32, 0, 1393, 1394, 1, 0, 0, 0, 1394, 1395, 6, 181, 14, 0, 1395, 1396, 6, 181, 15, 0, 1396, 379, 1, 0, 0, 0, 1397, 1398, 3, 68, 26, 0, 1398, 1399, 1, 0, 0, 0, 1399, 1400, 6, 182, 20, 0, 1400, 1401, 6, 182, 15, 0, 1401, 1402, 6, 182, 32, 0, 1402, 381, 1, 0, 0, 0, 1403, 1404, 3, 102, 43, 0, 1404, 1405, 1, 0, 0, 0, 1405, 1406, 6, 183, 21, 0, 1406, 1407, 6, 183, 15, 0, 1407, 1408, 6, 183, 32, 0, 1408, 383, 1, 0, 0, 0, 1409, 1410, 3, 60, 22, 0, 1410, 1411, 1, 0, 0, 0, 1411, 1412, 6, 184, 11, 0, 1412, 385, 1, 0, 0, 0, 1413, 1414, 3, 62, 23, 0, 1414, 1415, 1, 0, 0, 0, 1415, 1416, 6, 185, 11, 0, 1416, 387, 1, 0, 0, 0, 1417, 1418, 3, 64, 24, 0, 1418, 1419, 1, 0, 0, 0, 1419, 1420, 6, 186, 11, 0, 1420, 389, 1, 0, 0, 0, 1421, 1422, 3, 368, 176, 0, 1422, 1423, 1, 0, 0, 0, 1423, 1424, 6, 187, 17, 0, 1424, 1425, 6, 187, 15, 0, 1425, 1426, 6, 187, 7, 0, 1426, 391, 1, 0, 0, 0, 1427, 1428, 3, 118, 51, 0, 1428, 1429, 1, 0, 0, 0, 1429, 1430, 6, 188, 18, 0, 1430, 1431, 6, 188, 15, 0, 1431, 1432, 6, 188, 7, 0, 1432, 393, 1, 0, 0, 0, 1433, 1434, 3, 60, 22, 0, 1434, 1435, 1, 0, 0, 0, 1435, 1436, 6, 189, 11, 0, 1436, 395, 1, 0, 0, 0, 1437, 1438, 3, 62, 23, 0, 1438, 1439, 1, 0, 0, 0, 1439, 1440, 6, 190, 11, 0, 1440, 397, 1, 0, 0, 0, 1441, 1442, 3, 64, 24, 0, 1442, 1443, 1, 0, 0, 0, 1443, 1444, 6, 191, 11, 0, 1444, 399, 1, 0, 0, 0, 1445, 1446, 3, 190, 87, 0, 1446, 1447, 1, 0, 0, 0, 1447, 1448, 6, 192, 15, 0, 1448, 1449, 6, 192, 0, 0, 1449, 1450, 6, 192, 28, 0, 1450, 401, 1, 0, 0, 0, 1451, 1452, 3, 186, 85, 0, 1452, 1453, 1, 0, 0, 0, 1453, 1454, 6, 193, 15, 0, 1454, 1455, 6, 193, 0, 0, 1455, 1456, 6, 193, 31, 0, 1456, 403, 1, 0, 0, 0, 1457, 1458, 3, 108, 46, 0, 1458, 1459, 1, 0, 0, 0, 1459, 1460, 6, 194, 15, 0, 1460, 1461, 6, 194, 0, 0, 1461, 1462, 6, 194, 33, 0, 1462, 405, 1, 0, 0, 0, 1463, 1464, 3, 80, 32, 0, 1464, 1465, 1, 0, 0, 0, 1465, 1466, 6, 195, 14, 0, 1466, 1467, 6, 195, 15, 0, 1467, 407, 1, 0, 0, 0, 65, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 588, 598, 602, 605, 614, 616, 627, 634, 639, 678, 683, 692, 699, 704, 706, 717, 725, 728, 730, 735, 740, 746, 753, 758, 764, 767, 775, 779, 909, 916, 918, 934, 939, 944, 946, 952, 1041, 1045, 1050, 1055, 1060, 1062, 1066, 1068, 1145, 1149, 1154, 1376, 1378, 34, 5, 2, 0, 5, 4, 0, 5, 6, 0, 5, 1, 0, 5, 3, 0, 5, 8, 0, 5, 12, 0, 5, 14, 0, 5, 10, 0, 5, 5, 0, 5, 11, 0, 0, 1, 0, 7, 71, 0, 5, 0, 0, 7, 30, 0, 4, 0, 0, 7, 72, 0, 7, 116, 0, 7, 39, 0, 7, 37, 0, 7, 26, 0, 7, 31, 0, 7, 41, 0, 7, 82, 0, 5, 13, 0, 5, 7, 0, 7, 92, 0, 7, 91, 0, 7, 74, 0, 7, 90, 0, 5, 9, 0, 7, 73, 0, 5, 15, 0, 7, 34, 0] \ No newline at end of file diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens b/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens index 4cac289a33634..2d4bb481826f5 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens @@ -18,111 +18,112 @@ SHOW=17 SORT=18 STATS=19 WHERE=20 -UNKNOWN_CMD=21 -LINE_COMMENT=22 -MULTILINE_COMMENT=23 -WS=24 -UNQUOTED_SOURCE=25 -EXPLAIN_WS=26 -EXPLAIN_LINE_COMMENT=27 -EXPLAIN_MULTILINE_COMMENT=28 -PIPE=29 -QUOTED_STRING=30 -INTEGER_LITERAL=31 -DECIMAL_LITERAL=32 -BY=33 -AND=34 -ASC=35 -ASSIGN=36 -CAST_OP=37 -COMMA=38 -DESC=39 -DOT=40 -FALSE=41 -FIRST=42 -IN=43 -IS=44 -LAST=45 -LIKE=46 -LP=47 -MATCH=48 -NOT=49 -NULL=50 -NULLS=51 -OR=52 -PARAM=53 -RLIKE=54 -RP=55 -TRUE=56 -EQ=57 -CIEQ=58 -NEQ=59 -LT=60 -LTE=61 -GT=62 -GTE=63 -PLUS=64 -MINUS=65 -ASTERISK=66 -SLASH=67 -PERCENT=68 -NAMED_OR_POSITIONAL_PARAM=69 -OPENING_BRACKET=70 -CLOSING_BRACKET=71 -UNQUOTED_IDENTIFIER=72 -QUOTED_IDENTIFIER=73 -EXPR_LINE_COMMENT=74 -EXPR_MULTILINE_COMMENT=75 -EXPR_WS=76 -METADATA=77 -FROM_LINE_COMMENT=78 -FROM_MULTILINE_COMMENT=79 -FROM_WS=80 -ID_PATTERN=81 -PROJECT_LINE_COMMENT=82 -PROJECT_MULTILINE_COMMENT=83 -PROJECT_WS=84 -AS=85 -RENAME_LINE_COMMENT=86 -RENAME_MULTILINE_COMMENT=87 -RENAME_WS=88 -ON=89 -WITH=90 -ENRICH_POLICY_NAME=91 -ENRICH_LINE_COMMENT=92 -ENRICH_MULTILINE_COMMENT=93 -ENRICH_WS=94 -ENRICH_FIELD_LINE_COMMENT=95 -ENRICH_FIELD_MULTILINE_COMMENT=96 -ENRICH_FIELD_WS=97 -LOOKUP_LINE_COMMENT=98 -LOOKUP_MULTILINE_COMMENT=99 -LOOKUP_WS=100 -LOOKUP_FIELD_LINE_COMMENT=101 -LOOKUP_FIELD_MULTILINE_COMMENT=102 -LOOKUP_FIELD_WS=103 -MVEXPAND_LINE_COMMENT=104 -MVEXPAND_MULTILINE_COMMENT=105 -MVEXPAND_WS=106 -INFO=107 -SHOW_LINE_COMMENT=108 -SHOW_MULTILINE_COMMENT=109 -SHOW_WS=110 -FUNCTIONS=111 -META_LINE_COMMENT=112 -META_MULTILINE_COMMENT=113 -META_WS=114 -COLON=115 -SETTING=116 -SETTING_LINE_COMMENT=117 -SETTTING_MULTILINE_COMMENT=118 -SETTING_WS=119 -METRICS_LINE_COMMENT=120 -METRICS_MULTILINE_COMMENT=121 -METRICS_WS=122 -CLOSING_METRICS_LINE_COMMENT=123 -CLOSING_METRICS_MULTILINE_COMMENT=124 -CLOSING_METRICS_WS=125 +MATCH=21 +UNKNOWN_CMD=22 +LINE_COMMENT=23 +MULTILINE_COMMENT=24 +WS=25 +UNQUOTED_SOURCE=26 +EXPLAIN_WS=27 +EXPLAIN_LINE_COMMENT=28 +EXPLAIN_MULTILINE_COMMENT=29 +PIPE=30 +QUOTED_STRING=31 +INTEGER_LITERAL=32 +DECIMAL_LITERAL=33 +BY=34 +AND=35 +ASC=36 +ASSIGN=37 +CAST_OP=38 +COMMA=39 +DESC=40 +DOT=41 +FALSE=42 +FIRST=43 +IN=44 +IS=45 +LAST=46 +LIKE=47 +LP=48 +MATCH_OPERATOR=49 +NOT=50 +NULL=51 +NULLS=52 +OR=53 +PARAM=54 +RLIKE=55 +RP=56 +TRUE=57 +EQ=58 +CIEQ=59 +NEQ=60 +LT=61 +LTE=62 +GT=63 +GTE=64 +PLUS=65 +MINUS=66 +ASTERISK=67 +SLASH=68 +PERCENT=69 +NAMED_OR_POSITIONAL_PARAM=70 +OPENING_BRACKET=71 +CLOSING_BRACKET=72 +UNQUOTED_IDENTIFIER=73 +QUOTED_IDENTIFIER=74 +EXPR_LINE_COMMENT=75 +EXPR_MULTILINE_COMMENT=76 +EXPR_WS=77 +METADATA=78 +FROM_LINE_COMMENT=79 +FROM_MULTILINE_COMMENT=80 +FROM_WS=81 +ID_PATTERN=82 +PROJECT_LINE_COMMENT=83 +PROJECT_MULTILINE_COMMENT=84 +PROJECT_WS=85 +AS=86 +RENAME_LINE_COMMENT=87 +RENAME_MULTILINE_COMMENT=88 +RENAME_WS=89 +ON=90 +WITH=91 +ENRICH_POLICY_NAME=92 +ENRICH_LINE_COMMENT=93 +ENRICH_MULTILINE_COMMENT=94 +ENRICH_WS=95 +ENRICH_FIELD_LINE_COMMENT=96 +ENRICH_FIELD_MULTILINE_COMMENT=97 +ENRICH_FIELD_WS=98 +LOOKUP_LINE_COMMENT=99 +LOOKUP_MULTILINE_COMMENT=100 +LOOKUP_WS=101 +LOOKUP_FIELD_LINE_COMMENT=102 +LOOKUP_FIELD_MULTILINE_COMMENT=103 +LOOKUP_FIELD_WS=104 +MVEXPAND_LINE_COMMENT=105 +MVEXPAND_MULTILINE_COMMENT=106 +MVEXPAND_WS=107 +INFO=108 +SHOW_LINE_COMMENT=109 +SHOW_MULTILINE_COMMENT=110 +SHOW_WS=111 +FUNCTIONS=112 +META_LINE_COMMENT=113 +META_MULTILINE_COMMENT=114 +META_WS=115 +COLON=116 +SETTING=117 +SETTING_LINE_COMMENT=118 +SETTTING_MULTILINE_COMMENT=119 +SETTING_WS=120 +METRICS_LINE_COMMENT=121 +METRICS_MULTILINE_COMMENT=122 +METRICS_WS=123 +CLOSING_METRICS_LINE_COMMENT=124 +CLOSING_METRICS_MULTILINE_COMMENT=125 +CLOSING_METRICS_WS=126 'dissect'=1 'drop'=2 'enrich'=3 @@ -143,48 +144,47 @@ CLOSING_METRICS_WS=125 'sort'=18 'stats'=19 'where'=20 -'|'=29 -'by'=33 -'and'=34 -'asc'=35 -'='=36 -'::'=37 -','=38 -'desc'=39 -'.'=40 -'false'=41 -'first'=42 -'in'=43 -'is'=44 -'last'=45 -'like'=46 -'('=47 -'match'=48 -'not'=49 -'null'=50 -'nulls'=51 -'or'=52 -'?'=53 -'rlike'=54 -')'=55 -'true'=56 -'=='=57 -'=~'=58 -'!='=59 -'<'=60 -'<='=61 -'>'=62 -'>='=63 -'+'=64 -'-'=65 -'*'=66 -'/'=67 -'%'=68 -']'=71 -'metadata'=77 -'as'=85 -'on'=89 -'with'=90 -'info'=107 -'functions'=111 -':'=115 +'|'=30 +'by'=34 +'and'=35 +'asc'=36 +'='=37 +'::'=38 +','=39 +'desc'=40 +'.'=41 +'false'=42 +'first'=43 +'in'=44 +'is'=45 +'last'=46 +'like'=47 +'('=48 +'not'=50 +'null'=51 +'nulls'=52 +'or'=53 +'?'=54 +'rlike'=55 +')'=56 +'true'=57 +'=='=58 +'=~'=59 +'!='=60 +'<'=61 +'<='=62 +'>'=63 +'>='=64 +'+'=65 +'-'=66 +'*'=67 +'/'=68 +'%'=69 +']'=72 +'metadata'=78 +'as'=86 +'on'=90 +'with'=91 +'info'=108 +'functions'=112 +':'=116 diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.ts b/packages/kbn-esql-ast/src/antlr/esql_lexer.ts index eb10e461fab5f..179382f9f736e 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.ts +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.ts @@ -1,5 +1,5 @@ // @ts-nocheck -// Generated from src/antlr/esql_lexer.g4 by ANTLR 4.13.1 +// Generated from src/antlr/esql_lexer.g4 by ANTLR 4.13.2 // noinspection ES6UnusedImports,JSUnusedGlobalSymbols,JSUnusedLocalSymbols import { ATN, @@ -33,111 +33,112 @@ export default class esql_lexer extends Lexer { public static readonly SORT = 18; public static readonly STATS = 19; public static readonly WHERE = 20; - public static readonly UNKNOWN_CMD = 21; - public static readonly LINE_COMMENT = 22; - public static readonly MULTILINE_COMMENT = 23; - public static readonly WS = 24; - public static readonly UNQUOTED_SOURCE = 25; - public static readonly EXPLAIN_WS = 26; - public static readonly EXPLAIN_LINE_COMMENT = 27; - public static readonly EXPLAIN_MULTILINE_COMMENT = 28; - public static readonly PIPE = 29; - public static readonly QUOTED_STRING = 30; - public static readonly INTEGER_LITERAL = 31; - public static readonly DECIMAL_LITERAL = 32; - public static readonly BY = 33; - public static readonly AND = 34; - public static readonly ASC = 35; - public static readonly ASSIGN = 36; - public static readonly CAST_OP = 37; - public static readonly COMMA = 38; - public static readonly DESC = 39; - public static readonly DOT = 40; - public static readonly FALSE = 41; - public static readonly FIRST = 42; - public static readonly IN = 43; - public static readonly IS = 44; - public static readonly LAST = 45; - public static readonly LIKE = 46; - public static readonly LP = 47; - public static readonly MATCH = 48; - public static readonly NOT = 49; - public static readonly NULL = 50; - public static readonly NULLS = 51; - public static readonly OR = 52; - public static readonly PARAM = 53; - public static readonly RLIKE = 54; - public static readonly RP = 55; - public static readonly TRUE = 56; - public static readonly EQ = 57; - public static readonly CIEQ = 58; - public static readonly NEQ = 59; - public static readonly LT = 60; - public static readonly LTE = 61; - public static readonly GT = 62; - public static readonly GTE = 63; - public static readonly PLUS = 64; - public static readonly MINUS = 65; - public static readonly ASTERISK = 66; - public static readonly SLASH = 67; - public static readonly PERCENT = 68; - public static readonly NAMED_OR_POSITIONAL_PARAM = 69; - public static readonly OPENING_BRACKET = 70; - public static readonly CLOSING_BRACKET = 71; - public static readonly UNQUOTED_IDENTIFIER = 72; - public static readonly QUOTED_IDENTIFIER = 73; - public static readonly EXPR_LINE_COMMENT = 74; - public static readonly EXPR_MULTILINE_COMMENT = 75; - public static readonly EXPR_WS = 76; - public static readonly METADATA = 77; - public static readonly FROM_LINE_COMMENT = 78; - public static readonly FROM_MULTILINE_COMMENT = 79; - public static readonly FROM_WS = 80; - public static readonly ID_PATTERN = 81; - public static readonly PROJECT_LINE_COMMENT = 82; - public static readonly PROJECT_MULTILINE_COMMENT = 83; - public static readonly PROJECT_WS = 84; - public static readonly AS = 85; - public static readonly RENAME_LINE_COMMENT = 86; - public static readonly RENAME_MULTILINE_COMMENT = 87; - public static readonly RENAME_WS = 88; - public static readonly ON = 89; - public static readonly WITH = 90; - public static readonly ENRICH_POLICY_NAME = 91; - public static readonly ENRICH_LINE_COMMENT = 92; - public static readonly ENRICH_MULTILINE_COMMENT = 93; - public static readonly ENRICH_WS = 94; - public static readonly ENRICH_FIELD_LINE_COMMENT = 95; - public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 96; - public static readonly ENRICH_FIELD_WS = 97; - public static readonly LOOKUP_LINE_COMMENT = 98; - public static readonly LOOKUP_MULTILINE_COMMENT = 99; - public static readonly LOOKUP_WS = 100; - public static readonly LOOKUP_FIELD_LINE_COMMENT = 101; - public static readonly LOOKUP_FIELD_MULTILINE_COMMENT = 102; - public static readonly LOOKUP_FIELD_WS = 103; - public static readonly MVEXPAND_LINE_COMMENT = 104; - public static readonly MVEXPAND_MULTILINE_COMMENT = 105; - public static readonly MVEXPAND_WS = 106; - public static readonly INFO = 107; - public static readonly SHOW_LINE_COMMENT = 108; - public static readonly SHOW_MULTILINE_COMMENT = 109; - public static readonly SHOW_WS = 110; - public static readonly FUNCTIONS = 111; - public static readonly META_LINE_COMMENT = 112; - public static readonly META_MULTILINE_COMMENT = 113; - public static readonly META_WS = 114; - public static readonly COLON = 115; - public static readonly SETTING = 116; - public static readonly SETTING_LINE_COMMENT = 117; - public static readonly SETTTING_MULTILINE_COMMENT = 118; - public static readonly SETTING_WS = 119; - public static readonly METRICS_LINE_COMMENT = 120; - public static readonly METRICS_MULTILINE_COMMENT = 121; - public static readonly METRICS_WS = 122; - public static readonly CLOSING_METRICS_LINE_COMMENT = 123; - public static readonly CLOSING_METRICS_MULTILINE_COMMENT = 124; - public static readonly CLOSING_METRICS_WS = 125; + public static readonly MATCH = 21; + public static readonly UNKNOWN_CMD = 22; + public static readonly LINE_COMMENT = 23; + public static readonly MULTILINE_COMMENT = 24; + public static readonly WS = 25; + public static readonly UNQUOTED_SOURCE = 26; + public static readonly EXPLAIN_WS = 27; + public static readonly EXPLAIN_LINE_COMMENT = 28; + public static readonly EXPLAIN_MULTILINE_COMMENT = 29; + public static readonly PIPE = 30; + public static readonly QUOTED_STRING = 31; + public static readonly INTEGER_LITERAL = 32; + public static readonly DECIMAL_LITERAL = 33; + public static readonly BY = 34; + public static readonly AND = 35; + public static readonly ASC = 36; + public static readonly ASSIGN = 37; + public static readonly CAST_OP = 38; + public static readonly COMMA = 39; + public static readonly DESC = 40; + public static readonly DOT = 41; + public static readonly FALSE = 42; + public static readonly FIRST = 43; + public static readonly IN = 44; + public static readonly IS = 45; + public static readonly LAST = 46; + public static readonly LIKE = 47; + public static readonly LP = 48; + public static readonly MATCH_OPERATOR = 49; + public static readonly NOT = 50; + public static readonly NULL = 51; + public static readonly NULLS = 52; + public static readonly OR = 53; + public static readonly PARAM = 54; + public static readonly RLIKE = 55; + public static readonly RP = 56; + public static readonly TRUE = 57; + public static readonly EQ = 58; + public static readonly CIEQ = 59; + public static readonly NEQ = 60; + public static readonly LT = 61; + public static readonly LTE = 62; + public static readonly GT = 63; + public static readonly GTE = 64; + public static readonly PLUS = 65; + public static readonly MINUS = 66; + public static readonly ASTERISK = 67; + public static readonly SLASH = 68; + public static readonly PERCENT = 69; + public static readonly NAMED_OR_POSITIONAL_PARAM = 70; + public static readonly OPENING_BRACKET = 71; + public static readonly CLOSING_BRACKET = 72; + public static readonly UNQUOTED_IDENTIFIER = 73; + public static readonly QUOTED_IDENTIFIER = 74; + public static readonly EXPR_LINE_COMMENT = 75; + public static readonly EXPR_MULTILINE_COMMENT = 76; + public static readonly EXPR_WS = 77; + public static readonly METADATA = 78; + public static readonly FROM_LINE_COMMENT = 79; + public static readonly FROM_MULTILINE_COMMENT = 80; + public static readonly FROM_WS = 81; + public static readonly ID_PATTERN = 82; + public static readonly PROJECT_LINE_COMMENT = 83; + public static readonly PROJECT_MULTILINE_COMMENT = 84; + public static readonly PROJECT_WS = 85; + public static readonly AS = 86; + public static readonly RENAME_LINE_COMMENT = 87; + public static readonly RENAME_MULTILINE_COMMENT = 88; + public static readonly RENAME_WS = 89; + public static readonly ON = 90; + public static readonly WITH = 91; + public static readonly ENRICH_POLICY_NAME = 92; + public static readonly ENRICH_LINE_COMMENT = 93; + public static readonly ENRICH_MULTILINE_COMMENT = 94; + public static readonly ENRICH_WS = 95; + public static readonly ENRICH_FIELD_LINE_COMMENT = 96; + public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 97; + public static readonly ENRICH_FIELD_WS = 98; + public static readonly LOOKUP_LINE_COMMENT = 99; + public static readonly LOOKUP_MULTILINE_COMMENT = 100; + public static readonly LOOKUP_WS = 101; + public static readonly LOOKUP_FIELD_LINE_COMMENT = 102; + public static readonly LOOKUP_FIELD_MULTILINE_COMMENT = 103; + public static readonly LOOKUP_FIELD_WS = 104; + public static readonly MVEXPAND_LINE_COMMENT = 105; + public static readonly MVEXPAND_MULTILINE_COMMENT = 106; + public static readonly MVEXPAND_WS = 107; + public static readonly INFO = 108; + public static readonly SHOW_LINE_COMMENT = 109; + public static readonly SHOW_MULTILINE_COMMENT = 110; + public static readonly SHOW_WS = 111; + public static readonly FUNCTIONS = 112; + public static readonly META_LINE_COMMENT = 113; + public static readonly META_MULTILINE_COMMENT = 114; + public static readonly META_WS = 115; + public static readonly COLON = 116; + public static readonly SETTING = 117; + public static readonly SETTING_LINE_COMMENT = 118; + public static readonly SETTTING_MULTILINE_COMMENT = 119; + public static readonly SETTING_WS = 120; + public static readonly METRICS_LINE_COMMENT = 121; + public static readonly METRICS_MULTILINE_COMMENT = 122; + public static readonly METRICS_WS = 123; + public static readonly CLOSING_METRICS_LINE_COMMENT = 124; + public static readonly CLOSING_METRICS_MULTILINE_COMMENT = 125; + public static readonly CLOSING_METRICS_WS = 126; public static readonly EOF = Token.EOF; public static readonly EXPLAIN_MODE = 1; public static readonly EXPRESSION_MODE = 2; @@ -172,31 +173,32 @@ export default class esql_lexer extends Lexer { null, null, null, null, null, null, - null, "'|'", null, null, - null, "'by'", - "'and'", "'asc'", - "'='", "'::'", - "','", "'desc'", - "'.'", "'false'", - "'first'", "'in'", - "'is'", "'last'", - "'like'", "'('", - "'match'", "'not'", - "'null'", "'nulls'", - "'or'", "'?'", - "'rlike'", "')'", - "'true'", "'=='", - "'=~'", "'!='", - "'<'", "'<='", - "'>'", "'>='", - "'+'", "'-'", - "'*'", "'/'", - "'%'", null, - null, "']'", + "'|'", null, null, null, + "'by'", "'and'", + "'asc'", "'='", + "'::'", "','", + "'desc'", "'.'", + "'false'", "'first'", + "'in'", "'is'", + "'last'", "'like'", + "'('", null, + "'not'", "'null'", + "'nulls'", "'or'", + "'?'", "'rlike'", + "')'", "'true'", + "'=='", "'=~'", + "'!='", "'<'", + "'<='", "'>'", + "'>='", "'+'", + "'-'", "'*'", + "'/'", "'%'", null, null, - null, "'metadata'", + "']'", null, + null, null, + null, null, + "'metadata'", null, null, null, null, null, null, @@ -228,7 +230,7 @@ export default class esql_lexer extends Lexer { "RENAME", "ROW", "SHOW", "SORT", "STATS", "WHERE", - "UNKNOWN_CMD", + "MATCH", "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "UNQUOTED_SOURCE", @@ -246,16 +248,16 @@ export default class esql_lexer extends Lexer { "FIRST", "IN", "IS", "LAST", "LIKE", "LP", - "MATCH", "NOT", - "NULL", "NULLS", - "OR", "PARAM", - "RLIKE", "RP", - "TRUE", "EQ", - "CIEQ", "NEQ", - "LT", "LTE", - "GT", "GTE", - "PLUS", "MINUS", - "ASTERISK", + "MATCH_OPERATOR", + "NOT", "NULL", + "NULLS", "OR", + "PARAM", "RLIKE", + "RP", "TRUE", + "EQ", "CIEQ", + "NEQ", "LT", + "LTE", "GT", + "GTE", "PLUS", + "MINUS", "ASTERISK", "SLASH", "PERCENT", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", @@ -322,32 +324,32 @@ export default class esql_lexer extends Lexer { public static readonly ruleNames: string[] = [ "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", "INLINESTATS", "KEEP", "LIMIT", "LOOKUP", "META", "METRICS", "MV_EXPAND", "RENAME", "ROW", - "SHOW", "SORT", "STATS", "WHERE", "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", - "WS", "UNQUOTED_SOURCE_PART", "UNQUOTED_SOURCE", "EXPLAIN_OPENING_BRACKET", - "EXPLAIN_PIPE", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", - "PIPE", "DIGIT", "LETTER", "ESCAPE_SEQUENCE", "UNESCAPED_CHARS", "EXPONENT", - "ASPERAND", "BACKQUOTE", "BACKQUOTE_BLOCK", "UNDERSCORE", "UNQUOTED_ID_BODY", - "QUOTED_STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", - "ASSIGN", "CAST_OP", "COMMA", "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", - "LAST", "LIKE", "LP", "MATCH", "NOT", "NULL", "NULLS", "OR", "PARAM", - "RLIKE", "RP", "TRUE", "EQ", "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", - "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "NAMED_OR_POSITIONAL_PARAM", - "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_ID", - "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", - "FROM_PIPE", "FROM_OPENING_BRACKET", "FROM_CLOSING_BRACKET", "FROM_COLON", - "FROM_COMMA", "FROM_ASSIGN", "METADATA", "FROM_UNQUOTED_SOURCE", "FROM_QUOTED_SOURCE", - "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", "FROM_WS", "PROJECT_PIPE", - "PROJECT_DOT", "PROJECT_COMMA", "UNQUOTED_ID_BODY_WITH_PATTERN", "UNQUOTED_ID_PATTERN", - "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", "PROJECT_WS", - "RENAME_PIPE", "RENAME_ASSIGN", "RENAME_COMMA", "RENAME_DOT", "AS", "RENAME_ID_PATTERN", - "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", "RENAME_WS", "ENRICH_PIPE", - "ENRICH_OPENING_BRACKET", "ON", "WITH", "ENRICH_POLICY_NAME_BODY", "ENRICH_POLICY_NAME", - "ENRICH_MODE_UNQUOTED_VALUE", "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", - "ENRICH_WS", "ENRICH_FIELD_PIPE", "ENRICH_FIELD_ASSIGN", "ENRICH_FIELD_COMMA", - "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", "ENRICH_FIELD_ID_PATTERN", "ENRICH_FIELD_QUOTED_IDENTIFIER", - "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", - "LOOKUP_PIPE", "LOOKUP_COLON", "LOOKUP_COMMA", "LOOKUP_DOT", "LOOKUP_ON", - "LOOKUP_UNQUOTED_SOURCE", "LOOKUP_QUOTED_SOURCE", "LOOKUP_LINE_COMMENT", + "SHOW", "SORT", "STATS", "WHERE", "MATCH", "UNKNOWN_CMD", "LINE_COMMENT", + "MULTILINE_COMMENT", "WS", "UNQUOTED_SOURCE_PART", "UNQUOTED_SOURCE", + "EXPLAIN_OPENING_BRACKET", "EXPLAIN_PIPE", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", + "EXPLAIN_MULTILINE_COMMENT", "PIPE", "DIGIT", "LETTER", "ESCAPE_SEQUENCE", + "UNESCAPED_CHARS", "EXPONENT", "ASPERAND", "BACKQUOTE", "BACKQUOTE_BLOCK", + "UNDERSCORE", "UNQUOTED_ID_BODY", "QUOTED_STRING", "INTEGER_LITERAL", + "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", "COMMA", "DESC", + "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", "LP", "MATCH_OPERATOR", + "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", "CIEQ", + "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", + "PERCENT", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", "CLOSING_BRACKET", + "UNQUOTED_IDENTIFIER", "QUOTED_ID", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", + "EXPR_MULTILINE_COMMENT", "EXPR_WS", "FROM_PIPE", "FROM_OPENING_BRACKET", + "FROM_CLOSING_BRACKET", "FROM_COLON", "FROM_COMMA", "FROM_ASSIGN", "METADATA", + "FROM_UNQUOTED_SOURCE", "FROM_QUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", + "FROM_WS", "PROJECT_PIPE", "PROJECT_DOT", "PROJECT_COMMA", "UNQUOTED_ID_BODY_WITH_PATTERN", + "UNQUOTED_ID_PATTERN", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", + "PROJECT_WS", "RENAME_PIPE", "RENAME_ASSIGN", "RENAME_COMMA", "RENAME_DOT", + "AS", "RENAME_ID_PATTERN", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", + "RENAME_WS", "ENRICH_PIPE", "ENRICH_OPENING_BRACKET", "ON", "WITH", "ENRICH_POLICY_NAME_BODY", + "ENRICH_POLICY_NAME", "ENRICH_MODE_UNQUOTED_VALUE", "ENRICH_LINE_COMMENT", + "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_PIPE", "ENRICH_FIELD_ASSIGN", + "ENRICH_FIELD_COMMA", "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", "ENRICH_FIELD_ID_PATTERN", + "ENRICH_FIELD_QUOTED_IDENTIFIER", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", + "ENRICH_FIELD_WS", "LOOKUP_PIPE", "LOOKUP_COLON", "LOOKUP_COMMA", "LOOKUP_DOT", + "LOOKUP_ON", "LOOKUP_UNQUOTED_SOURCE", "LOOKUP_QUOTED_SOURCE", "LOOKUP_LINE_COMMENT", "LOOKUP_MULTILINE_COMMENT", "LOOKUP_WS", "LOOKUP_FIELD_PIPE", "LOOKUP_FIELD_COMMA", "LOOKUP_FIELD_DOT", "LOOKUP_FIELD_ID_PATTERN", "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", "LOOKUP_FIELD_WS", "MVEXPAND_PIPE", @@ -381,7 +383,7 @@ export default class esql_lexer extends Lexer { public get modeNames(): string[] { return esql_lexer.modeNames; } - public static readonly _serializedATN: number[] = [4,0,125,1458,6,-1,6, + public static readonly _serializedATN: number[] = [4,0,126,1468,6,-1,6, -1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1, 2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8, 2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16, @@ -412,125 +414,126 @@ export default class esql_lexer extends Lexer { 2,175,7,175,2,176,7,176,2,177,7,177,2,178,7,178,2,179,7,179,2,180,7,180, 2,181,7,181,2,182,7,182,2,183,7,183,2,184,7,184,2,185,7,185,2,186,7,186, 2,187,7,187,2,188,7,188,2,189,7,189,2,190,7,190,2,191,7,191,2,192,7,192, - 2,193,7,193,2,194,7,194,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3, - 1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5, - 1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7, - 1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9, - 1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11, - 1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1, - 13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14, - 1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1, - 16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18, - 1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,20,4,20,577, - 8,20,11,20,12,20,578,1,20,1,20,1,21,1,21,1,21,1,21,5,21,587,8,21,10,21, - 12,21,590,9,21,1,21,3,21,593,8,21,1,21,3,21,596,8,21,1,21,1,21,1,22,1,22, - 1,22,1,22,1,22,5,22,605,8,22,10,22,12,22,608,9,22,1,22,1,22,1,22,1,22,1, - 22,1,23,4,23,616,8,23,11,23,12,23,617,1,23,1,23,1,24,1,24,1,24,3,24,625, - 8,24,1,25,4,25,628,8,25,11,25,12,25,629,1,26,1,26,1,26,1,26,1,26,1,27,1, - 27,1,27,1,27,1,27,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,30,1,30,1,30, - 1,30,1,31,1,31,1,31,1,31,1,32,1,32,1,33,1,33,1,34,1,34,1,34,1,35,1,35,1, - 36,1,36,3,36,669,8,36,1,36,4,36,672,8,36,11,36,12,36,673,1,37,1,37,1,38, - 1,38,1,39,1,39,1,39,3,39,683,8,39,1,40,1,40,1,41,1,41,1,41,3,41,690,8,41, - 1,42,1,42,1,42,5,42,695,8,42,10,42,12,42,698,9,42,1,42,1,42,1,42,1,42,1, - 42,1,42,5,42,706,8,42,10,42,12,42,709,9,42,1,42,1,42,1,42,1,42,1,42,3,42, - 716,8,42,1,42,3,42,719,8,42,3,42,721,8,42,1,43,4,43,724,8,43,11,43,12,43, - 725,1,44,4,44,729,8,44,11,44,12,44,730,1,44,1,44,5,44,735,8,44,10,44,12, - 44,738,9,44,1,44,1,44,4,44,742,8,44,11,44,12,44,743,1,44,4,44,747,8,44, - 11,44,12,44,748,1,44,1,44,5,44,753,8,44,10,44,12,44,756,9,44,3,44,758,8, - 44,1,44,1,44,1,44,1,44,4,44,764,8,44,11,44,12,44,765,1,44,1,44,3,44,770, - 8,44,1,45,1,45,1,45,1,46,1,46,1,46,1,46,1,47,1,47,1,47,1,47,1,48,1,48,1, - 49,1,49,1,49,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,53,1,53,1,53, - 1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,56,1,56,1, - 56,1,57,1,57,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,60,1,60, - 1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,63,1, - 63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,65,1,65,1,66,1,66,1,66,1,66,1,66, - 1,66,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69,1,70,1,70,1,70,1, - 71,1,71,1,71,1,72,1,72,1,73,1,73,1,73,1,74,1,74,1,75,1,75,1,75,1,76,1,76, - 1,77,1,77,1,78,1,78,1,79,1,79,1,80,1,80,1,81,1,81,1,81,5,81,898,8,81,10, - 81,12,81,901,9,81,1,81,1,81,4,81,905,8,81,11,81,12,81,906,3,81,909,8,81, - 1,82,1,82,1,82,1,82,1,82,1,83,1,83,1,83,1,83,1,83,1,84,1,84,5,84,923,8, - 84,10,84,12,84,926,9,84,1,84,1,84,3,84,930,8,84,1,84,4,84,933,8,84,11,84, - 12,84,934,3,84,937,8,84,1,85,1,85,4,85,941,8,85,11,85,12,85,942,1,85,1, - 85,1,86,1,86,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,89,1,89,1,89,1,89, - 1,90,1,90,1,90,1,90,1,90,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,93,1, - 93,1,93,1,93,1,94,1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96, - 1,96,1,96,1,96,1,96,1,96,1,97,1,97,1,97,1,97,1,98,1,98,1,98,1,98,1,99,1, - 99,1,99,1,99,1,100,1,100,1,100,1,100,1,101,1,101,1,101,1,101,1,102,1,102, - 1,102,1,102,1,102,1,103,1,103,1,103,1,103,1,104,1,104,1,104,1,104,1,105, - 1,105,1,105,1,105,3,105,1032,8,105,1,106,1,106,3,106,1036,8,106,1,106,5, - 106,1039,8,106,10,106,12,106,1042,9,106,1,106,1,106,3,106,1046,8,106,1, - 106,4,106,1049,8,106,11,106,12,106,1050,3,106,1053,8,106,1,107,1,107,4, - 107,1057,8,107,11,107,12,107,1058,1,108,1,108,1,108,1,108,1,109,1,109,1, - 109,1,109,1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111,1,111,1,112,1, - 112,1,112,1,112,1,113,1,113,1,113,1,113,1,114,1,114,1,114,1,114,1,115,1, - 115,1,115,1,116,1,116,1,116,1,116,1,117,1,117,1,117,1,117,1,118,1,118,1, - 118,1,118,1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120,1,121,1, - 121,1,121,1,121,1,121,1,122,1,122,1,122,1,122,1,122,1,123,1,123,1,123,1, - 123,1,123,1,123,1,123,1,124,1,124,1,125,4,125,1134,8,125,11,125,12,125, - 1135,1,125,1,125,3,125,1140,8,125,1,125,4,125,1143,8,125,11,125,12,125, - 1144,1,126,1,126,1,126,1,126,1,127,1,127,1,127,1,127,1,128,1,128,1,128, - 1,128,1,129,1,129,1,129,1,129,1,130,1,130,1,130,1,130,1,130,1,130,1,131, - 1,131,1,131,1,131,1,132,1,132,1,132,1,132,1,133,1,133,1,133,1,133,1,134, - 1,134,1,134,1,134,1,135,1,135,1,135,1,135,1,136,1,136,1,136,1,136,1,137, - 1,137,1,137,1,137,1,138,1,138,1,138,1,138,1,139,1,139,1,139,1,139,1,140, - 1,140,1,140,1,140,1,140,1,141,1,141,1,141,1,141,1,142,1,142,1,142,1,142, - 1,143,1,143,1,143,1,143,1,144,1,144,1,144,1,144,1,144,1,145,1,145,1,145, - 1,145,1,146,1,146,1,146,1,146,1,147,1,147,1,147,1,147,1,148,1,148,1,148, - 1,148,1,149,1,149,1,149,1,149,1,150,1,150,1,150,1,150,1,150,1,150,1,151, - 1,151,1,151,1,151,1,152,1,152,1,152,1,152,1,153,1,153,1,153,1,153,1,154, - 1,154,1,154,1,154,1,155,1,155,1,155,1,155,1,156,1,156,1,156,1,156,1,157, - 1,157,1,157,1,157,1,157,1,158,1,158,1,158,1,158,1,159,1,159,1,159,1,159, - 1,160,1,160,1,160,1,160,1,161,1,161,1,161,1,161,1,162,1,162,1,162,1,162, - 1,163,1,163,1,163,1,163,1,164,1,164,1,164,1,164,1,164,1,165,1,165,1,165, - 1,165,1,165,1,166,1,166,1,166,1,166,1,167,1,167,1,167,1,167,1,168,1,168, - 1,168,1,168,1,169,1,169,1,169,1,169,1,169,1,170,1,170,1,170,1,170,1,170, - 1,170,1,170,1,170,1,170,1,170,1,171,1,171,1,171,1,171,1,172,1,172,1,172, - 1,172,1,173,1,173,1,173,1,173,1,174,1,174,1,174,1,174,1,174,1,175,1,175, - 1,176,1,176,1,176,1,176,1,176,4,176,1367,8,176,11,176,12,176,1368,1,177, - 1,177,1,177,1,177,1,178,1,178,1,178,1,178,1,179,1,179,1,179,1,179,1,180, - 1,180,1,180,1,180,1,180,1,181,1,181,1,181,1,181,1,181,1,181,1,182,1,182, - 1,182,1,182,1,182,1,182,1,183,1,183,1,183,1,183,1,184,1,184,1,184,1,184, - 1,185,1,185,1,185,1,185,1,186,1,186,1,186,1,186,1,186,1,186,1,187,1,187, - 1,187,1,187,1,187,1,187,1,188,1,188,1,188,1,188,1,189,1,189,1,189,1,189, - 1,190,1,190,1,190,1,190,1,191,1,191,1,191,1,191,1,191,1,191,1,192,1,192, - 1,192,1,192,1,192,1,192,1,193,1,193,1,193,1,193,1,193,1,193,1,194,1,194, - 1,194,1,194,1,194,2,606,707,0,195,16,1,18,2,20,3,22,4,24,5,26,6,28,7,30, - 8,32,9,34,10,36,11,38,12,40,13,42,14,44,15,46,16,48,17,50,18,52,19,54,20, - 56,21,58,22,60,23,62,24,64,0,66,25,68,0,70,0,72,26,74,27,76,28,78,29,80, - 0,82,0,84,0,86,0,88,0,90,0,92,0,94,0,96,0,98,0,100,30,102,31,104,32,106, - 33,108,34,110,35,112,36,114,37,116,38,118,39,120,40,122,41,124,42,126,43, - 128,44,130,45,132,46,134,47,136,48,138,49,140,50,142,51,144,52,146,53,148, - 54,150,55,152,56,154,57,156,58,158,59,160,60,162,61,164,62,166,63,168,64, - 170,65,172,66,174,67,176,68,178,69,180,70,182,71,184,72,186,0,188,73,190, - 74,192,75,194,76,196,0,198,0,200,0,202,0,204,0,206,0,208,77,210,0,212,0, - 214,78,216,79,218,80,220,0,222,0,224,0,226,0,228,0,230,81,232,82,234,83, - 236,84,238,0,240,0,242,0,244,0,246,85,248,0,250,86,252,87,254,88,256,0, - 258,0,260,89,262,90,264,0,266,91,268,0,270,92,272,93,274,94,276,0,278,0, - 280,0,282,0,284,0,286,0,288,0,290,95,292,96,294,97,296,0,298,0,300,0,302, - 0,304,0,306,0,308,0,310,98,312,99,314,100,316,0,318,0,320,0,322,0,324,101, - 326,102,328,103,330,0,332,0,334,0,336,0,338,104,340,105,342,106,344,0,346, - 107,348,108,350,109,352,110,354,0,356,111,358,112,360,113,362,114,364,0, - 366,115,368,116,370,117,372,118,374,119,376,0,378,0,380,0,382,120,384,121, - 386,122,388,0,390,0,392,123,394,124,396,125,398,0,400,0,402,0,404,0,16, - 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,35,2,0,68,68,100,100,2,0,73,73,105, - 105,2,0,83,83,115,115,2,0,69,69,101,101,2,0,67,67,99,99,2,0,84,84,116,116, - 2,0,82,82,114,114,2,0,79,79,111,111,2,0,80,80,112,112,2,0,78,78,110,110, - 2,0,72,72,104,104,2,0,86,86,118,118,2,0,65,65,97,97,2,0,76,76,108,108,2, - 0,88,88,120,120,2,0,70,70,102,102,2,0,77,77,109,109,2,0,71,71,103,103,2, - 0,75,75,107,107,2,0,85,85,117,117,2,0,87,87,119,119,6,0,9,10,13,13,32,32, - 47,47,91,91,93,93,2,0,10,10,13,13,3,0,9,10,13,13,32,32,11,0,9,10,13,13, - 32,32,34,34,44,44,47,47,58,58,61,61,91,91,93,93,124,124,2,0,42,42,47,47, - 1,0,48,57,2,0,65,90,97,122,8,0,34,34,78,78,82,82,84,84,92,92,110,110,114, + 2,193,7,193,2,194,7,194,2,195,7,195,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, + 1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3, + 1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5, + 1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7, + 1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9, + 1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1, + 11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12, + 1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1, + 14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,16, + 1,16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,18,1, + 18,1,18,1,18,1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19, + 1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,21,4,21,587,8,21,11,21,12,21, + 588,1,21,1,21,1,22,1,22,1,22,1,22,5,22,597,8,22,10,22,12,22,600,9,22,1, + 22,3,22,603,8,22,1,22,3,22,606,8,22,1,22,1,22,1,23,1,23,1,23,1,23,1,23, + 5,23,615,8,23,10,23,12,23,618,9,23,1,23,1,23,1,23,1,23,1,23,1,24,4,24,626, + 8,24,11,24,12,24,627,1,24,1,24,1,25,1,25,1,25,3,25,635,8,25,1,26,4,26,638, + 8,26,11,26,12,26,639,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,28,1,28,1,28, + 1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1,32,1,32,1, + 32,1,32,1,33,1,33,1,34,1,34,1,35,1,35,1,35,1,36,1,36,1,37,1,37,3,37,679, + 8,37,1,37,4,37,682,8,37,11,37,12,37,683,1,38,1,38,1,39,1,39,1,40,1,40,1, + 40,3,40,693,8,40,1,41,1,41,1,42,1,42,1,42,3,42,700,8,42,1,43,1,43,1,43, + 5,43,705,8,43,10,43,12,43,708,9,43,1,43,1,43,1,43,1,43,1,43,1,43,5,43,716, + 8,43,10,43,12,43,719,9,43,1,43,1,43,1,43,1,43,1,43,3,43,726,8,43,1,43,3, + 43,729,8,43,3,43,731,8,43,1,44,4,44,734,8,44,11,44,12,44,735,1,45,4,45, + 739,8,45,11,45,12,45,740,1,45,1,45,5,45,745,8,45,10,45,12,45,748,9,45,1, + 45,1,45,4,45,752,8,45,11,45,12,45,753,1,45,4,45,757,8,45,11,45,12,45,758, + 1,45,1,45,5,45,763,8,45,10,45,12,45,766,9,45,3,45,768,8,45,1,45,1,45,1, + 45,1,45,4,45,774,8,45,11,45,12,45,775,1,45,1,45,3,45,780,8,45,1,46,1,46, + 1,46,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,49,1,49,1,50,1,50,1,50,1, + 51,1,51,1,52,1,52,1,52,1,52,1,52,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54, + 1,55,1,55,1,55,1,55,1,55,1,55,1,56,1,56,1,56,1,57,1,57,1,57,1,58,1,58,1, + 58,1,58,1,58,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,61,1,61,1,61,1,61,1,61, + 1,61,1,62,1,62,1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1, + 64,1,64,1,65,1,65,1,65,1,66,1,66,1,67,1,67,1,67,1,67,1,67,1,67,1,68,1,68, + 1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,71,1,71,1,71,1,72,1,72,1,72,1, + 73,1,73,1,74,1,74,1,74,1,75,1,75,1,76,1,76,1,76,1,77,1,77,1,78,1,78,1,79, + 1,79,1,80,1,80,1,81,1,81,1,82,1,82,1,82,5,82,908,8,82,10,82,12,82,911,9, + 82,1,82,1,82,4,82,915,8,82,11,82,12,82,916,3,82,919,8,82,1,83,1,83,1,83, + 1,83,1,83,1,84,1,84,1,84,1,84,1,84,1,85,1,85,5,85,933,8,85,10,85,12,85, + 936,9,85,1,85,1,85,3,85,940,8,85,1,85,4,85,943,8,85,11,85,12,85,944,3,85, + 947,8,85,1,86,1,86,4,86,951,8,86,11,86,12,86,952,1,86,1,86,1,87,1,87,1, + 88,1,88,1,88,1,88,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,90,1,91,1,91,1,91, + 1,91,1,91,1,92,1,92,1,92,1,92,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1, + 95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,1,97,1,97,1,97,1,97,1,97,1,97,1,97, + 1,97,1,97,1,98,1,98,1,98,1,98,1,99,1,99,1,99,1,99,1,100,1,100,1,100,1,100, + 1,101,1,101,1,101,1,101,1,102,1,102,1,102,1,102,1,103,1,103,1,103,1,103, + 1,103,1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105,1,106,1,106,1,106, + 1,106,3,106,1042,8,106,1,107,1,107,3,107,1046,8,107,1,107,5,107,1049,8, + 107,10,107,12,107,1052,9,107,1,107,1,107,3,107,1056,8,107,1,107,4,107,1059, + 8,107,11,107,12,107,1060,3,107,1063,8,107,1,108,1,108,4,108,1067,8,108, + 11,108,12,108,1068,1,109,1,109,1,109,1,109,1,110,1,110,1,110,1,110,1,111, + 1,111,1,111,1,111,1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113, + 1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,116,1,116,1,116,1,117, + 1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,119,1,119,1,119,1,119,1,120, + 1,120,1,120,1,120,1,121,1,121,1,121,1,121,1,121,1,122,1,122,1,122,1,122, + 1,122,1,123,1,123,1,123,1,123,1,123,1,124,1,124,1,124,1,124,1,124,1,124, + 1,124,1,125,1,125,1,126,4,126,1144,8,126,11,126,12,126,1145,1,126,1,126, + 3,126,1150,8,126,1,126,4,126,1153,8,126,11,126,12,126,1154,1,127,1,127, + 1,127,1,127,1,128,1,128,1,128,1,128,1,129,1,129,1,129,1,129,1,130,1,130, + 1,130,1,130,1,131,1,131,1,131,1,131,1,131,1,131,1,132,1,132,1,132,1,132, + 1,133,1,133,1,133,1,133,1,134,1,134,1,134,1,134,1,135,1,135,1,135,1,135, + 1,136,1,136,1,136,1,136,1,137,1,137,1,137,1,137,1,138,1,138,1,138,1,138, + 1,139,1,139,1,139,1,139,1,140,1,140,1,140,1,140,1,141,1,141,1,141,1,141, + 1,141,1,142,1,142,1,142,1,142,1,143,1,143,1,143,1,143,1,144,1,144,1,144, + 1,144,1,145,1,145,1,145,1,145,1,145,1,146,1,146,1,146,1,146,1,147,1,147, + 1,147,1,147,1,148,1,148,1,148,1,148,1,149,1,149,1,149,1,149,1,150,1,150, + 1,150,1,150,1,151,1,151,1,151,1,151,1,151,1,151,1,152,1,152,1,152,1,152, + 1,153,1,153,1,153,1,153,1,154,1,154,1,154,1,154,1,155,1,155,1,155,1,155, + 1,156,1,156,1,156,1,156,1,157,1,157,1,157,1,157,1,158,1,158,1,158,1,158, + 1,158,1,159,1,159,1,159,1,159,1,160,1,160,1,160,1,160,1,161,1,161,1,161, + 1,161,1,162,1,162,1,162,1,162,1,163,1,163,1,163,1,163,1,164,1,164,1,164, + 1,164,1,165,1,165,1,165,1,165,1,165,1,166,1,166,1,166,1,166,1,166,1,167, + 1,167,1,167,1,167,1,168,1,168,1,168,1,168,1,169,1,169,1,169,1,169,1,170, + 1,170,1,170,1,170,1,170,1,171,1,171,1,171,1,171,1,171,1,171,1,171,1,171, + 1,171,1,171,1,172,1,172,1,172,1,172,1,173,1,173,1,173,1,173,1,174,1,174, + 1,174,1,174,1,175,1,175,1,175,1,175,1,175,1,176,1,176,1,177,1,177,1,177, + 1,177,1,177,4,177,1377,8,177,11,177,12,177,1378,1,178,1,178,1,178,1,178, + 1,179,1,179,1,179,1,179,1,180,1,180,1,180,1,180,1,181,1,181,1,181,1,181, + 1,181,1,182,1,182,1,182,1,182,1,182,1,182,1,183,1,183,1,183,1,183,1,183, + 1,183,1,184,1,184,1,184,1,184,1,185,1,185,1,185,1,185,1,186,1,186,1,186, + 1,186,1,187,1,187,1,187,1,187,1,187,1,187,1,188,1,188,1,188,1,188,1,188, + 1,188,1,189,1,189,1,189,1,189,1,190,1,190,1,190,1,190,1,191,1,191,1,191, + 1,191,1,192,1,192,1,192,1,192,1,192,1,192,1,193,1,193,1,193,1,193,1,193, + 1,193,1,194,1,194,1,194,1,194,1,194,1,194,1,195,1,195,1,195,1,195,1,195, + 2,616,717,0,196,16,1,18,2,20,3,22,4,24,5,26,6,28,7,30,8,32,9,34,10,36,11, + 38,12,40,13,42,14,44,15,46,16,48,17,50,18,52,19,54,20,56,21,58,22,60,23, + 62,24,64,25,66,0,68,26,70,0,72,0,74,27,76,28,78,29,80,30,82,0,84,0,86,0, + 88,0,90,0,92,0,94,0,96,0,98,0,100,0,102,31,104,32,106,33,108,34,110,35, + 112,36,114,37,116,38,118,39,120,40,122,41,124,42,126,43,128,44,130,45,132, + 46,134,47,136,48,138,49,140,50,142,51,144,52,146,53,148,54,150,55,152,56, + 154,57,156,58,158,59,160,60,162,61,164,62,166,63,168,64,170,65,172,66,174, + 67,176,68,178,69,180,70,182,71,184,72,186,73,188,0,190,74,192,75,194,76, + 196,77,198,0,200,0,202,0,204,0,206,0,208,0,210,78,212,0,214,0,216,79,218, + 80,220,81,222,0,224,0,226,0,228,0,230,0,232,82,234,83,236,84,238,85,240, + 0,242,0,244,0,246,0,248,86,250,0,252,87,254,88,256,89,258,0,260,0,262,90, + 264,91,266,0,268,92,270,0,272,93,274,94,276,95,278,0,280,0,282,0,284,0, + 286,0,288,0,290,0,292,96,294,97,296,98,298,0,300,0,302,0,304,0,306,0,308, + 0,310,0,312,99,314,100,316,101,318,0,320,0,322,0,324,0,326,102,328,103, + 330,104,332,0,334,0,336,0,338,0,340,105,342,106,344,107,346,0,348,108,350, + 109,352,110,354,111,356,0,358,112,360,113,362,114,364,115,366,0,368,116, + 370,117,372,118,374,119,376,120,378,0,380,0,382,0,384,121,386,122,388,123, + 390,0,392,0,394,124,396,125,398,126,400,0,402,0,404,0,406,0,16,0,1,2,3, + 4,5,6,7,8,9,10,11,12,13,14,15,35,2,0,68,68,100,100,2,0,73,73,105,105,2, + 0,83,83,115,115,2,0,69,69,101,101,2,0,67,67,99,99,2,0,84,84,116,116,2,0, + 82,82,114,114,2,0,79,79,111,111,2,0,80,80,112,112,2,0,78,78,110,110,2,0, + 72,72,104,104,2,0,86,86,118,118,2,0,65,65,97,97,2,0,76,76,108,108,2,0,88, + 88,120,120,2,0,70,70,102,102,2,0,77,77,109,109,2,0,71,71,103,103,2,0,75, + 75,107,107,2,0,85,85,117,117,2,0,87,87,119,119,6,0,9,10,13,13,32,32,47, + 47,91,91,93,93,2,0,10,10,13,13,3,0,9,10,13,13,32,32,11,0,9,10,13,13,32, + 32,34,34,44,44,47,47,58,58,61,61,91,91,93,93,124,124,2,0,42,42,47,47,1, + 0,48,57,2,0,65,90,97,122,8,0,34,34,78,78,82,82,84,84,92,92,110,110,114, 114,116,116,4,0,10,10,13,13,34,34,92,92,2,0,43,43,45,45,1,0,96,96,2,0,66, 66,98,98,2,0,89,89,121,121,11,0,9,10,13,13,32,32,34,35,44,44,47,47,58,58, - 60,60,62,63,92,92,124,124,1484,0,16,1,0,0,0,0,18,1,0,0,0,0,20,1,0,0,0,0, + 60,60,62,63,92,92,124,124,1494,0,16,1,0,0,0,0,18,1,0,0,0,0,20,1,0,0,0,0, 22,1,0,0,0,0,24,1,0,0,0,0,26,1,0,0,0,0,28,1,0,0,0,0,30,1,0,0,0,0,32,1,0, 0,0,0,34,1,0,0,0,0,36,1,0,0,0,0,38,1,0,0,0,0,40,1,0,0,0,0,42,1,0,0,0,0, 44,1,0,0,0,0,46,1,0,0,0,0,48,1,0,0,0,0,50,1,0,0,0,0,52,1,0,0,0,0,54,1,0, - 0,0,0,56,1,0,0,0,0,58,1,0,0,0,0,60,1,0,0,0,0,62,1,0,0,0,0,66,1,0,0,0,1, - 68,1,0,0,0,1,70,1,0,0,0,1,72,1,0,0,0,1,74,1,0,0,0,1,76,1,0,0,0,2,78,1,0, - 0,0,2,100,1,0,0,0,2,102,1,0,0,0,2,104,1,0,0,0,2,106,1,0,0,0,2,108,1,0,0, + 0,0,0,56,1,0,0,0,0,58,1,0,0,0,0,60,1,0,0,0,0,62,1,0,0,0,0,64,1,0,0,0,0, + 68,1,0,0,0,1,70,1,0,0,0,1,72,1,0,0,0,1,74,1,0,0,0,1,76,1,0,0,0,1,78,1,0, + 0,0,2,80,1,0,0,0,2,102,1,0,0,0,2,104,1,0,0,0,2,106,1,0,0,0,2,108,1,0,0, 0,2,110,1,0,0,0,2,112,1,0,0,0,2,114,1,0,0,0,2,116,1,0,0,0,2,118,1,0,0,0, 2,120,1,0,0,0,2,122,1,0,0,0,2,124,1,0,0,0,2,126,1,0,0,0,2,128,1,0,0,0,2, 130,1,0,0,0,2,132,1,0,0,0,2,134,1,0,0,0,2,136,1,0,0,0,2,138,1,0,0,0,2,140, @@ -538,350 +541,352 @@ export default class esql_lexer extends Lexer { 0,0,0,2,152,1,0,0,0,2,154,1,0,0,0,2,156,1,0,0,0,2,158,1,0,0,0,2,160,1,0, 0,0,2,162,1,0,0,0,2,164,1,0,0,0,2,166,1,0,0,0,2,168,1,0,0,0,2,170,1,0,0, 0,2,172,1,0,0,0,2,174,1,0,0,0,2,176,1,0,0,0,2,178,1,0,0,0,2,180,1,0,0,0, - 2,182,1,0,0,0,2,184,1,0,0,0,2,188,1,0,0,0,2,190,1,0,0,0,2,192,1,0,0,0,2, - 194,1,0,0,0,3,196,1,0,0,0,3,198,1,0,0,0,3,200,1,0,0,0,3,202,1,0,0,0,3,204, + 2,182,1,0,0,0,2,184,1,0,0,0,2,186,1,0,0,0,2,190,1,0,0,0,2,192,1,0,0,0,2, + 194,1,0,0,0,2,196,1,0,0,0,3,198,1,0,0,0,3,200,1,0,0,0,3,202,1,0,0,0,3,204, 1,0,0,0,3,206,1,0,0,0,3,208,1,0,0,0,3,210,1,0,0,0,3,212,1,0,0,0,3,214,1, - 0,0,0,3,216,1,0,0,0,3,218,1,0,0,0,4,220,1,0,0,0,4,222,1,0,0,0,4,224,1,0, - 0,0,4,230,1,0,0,0,4,232,1,0,0,0,4,234,1,0,0,0,4,236,1,0,0,0,5,238,1,0,0, + 0,0,0,3,216,1,0,0,0,3,218,1,0,0,0,3,220,1,0,0,0,4,222,1,0,0,0,4,224,1,0, + 0,0,4,226,1,0,0,0,4,232,1,0,0,0,4,234,1,0,0,0,4,236,1,0,0,0,4,238,1,0,0, 0,5,240,1,0,0,0,5,242,1,0,0,0,5,244,1,0,0,0,5,246,1,0,0,0,5,248,1,0,0,0, - 5,250,1,0,0,0,5,252,1,0,0,0,5,254,1,0,0,0,6,256,1,0,0,0,6,258,1,0,0,0,6, - 260,1,0,0,0,6,262,1,0,0,0,6,266,1,0,0,0,6,268,1,0,0,0,6,270,1,0,0,0,6,272, - 1,0,0,0,6,274,1,0,0,0,7,276,1,0,0,0,7,278,1,0,0,0,7,280,1,0,0,0,7,282,1, + 5,250,1,0,0,0,5,252,1,0,0,0,5,254,1,0,0,0,5,256,1,0,0,0,6,258,1,0,0,0,6, + 260,1,0,0,0,6,262,1,0,0,0,6,264,1,0,0,0,6,268,1,0,0,0,6,270,1,0,0,0,6,272, + 1,0,0,0,6,274,1,0,0,0,6,276,1,0,0,0,7,278,1,0,0,0,7,280,1,0,0,0,7,282,1, 0,0,0,7,284,1,0,0,0,7,286,1,0,0,0,7,288,1,0,0,0,7,290,1,0,0,0,7,292,1,0, - 0,0,7,294,1,0,0,0,8,296,1,0,0,0,8,298,1,0,0,0,8,300,1,0,0,0,8,302,1,0,0, + 0,0,7,294,1,0,0,0,7,296,1,0,0,0,8,298,1,0,0,0,8,300,1,0,0,0,8,302,1,0,0, 0,8,304,1,0,0,0,8,306,1,0,0,0,8,308,1,0,0,0,8,310,1,0,0,0,8,312,1,0,0,0, - 8,314,1,0,0,0,9,316,1,0,0,0,9,318,1,0,0,0,9,320,1,0,0,0,9,322,1,0,0,0,9, - 324,1,0,0,0,9,326,1,0,0,0,9,328,1,0,0,0,10,330,1,0,0,0,10,332,1,0,0,0,10, + 8,314,1,0,0,0,8,316,1,0,0,0,9,318,1,0,0,0,9,320,1,0,0,0,9,322,1,0,0,0,9, + 324,1,0,0,0,9,326,1,0,0,0,9,328,1,0,0,0,9,330,1,0,0,0,10,332,1,0,0,0,10, 334,1,0,0,0,10,336,1,0,0,0,10,338,1,0,0,0,10,340,1,0,0,0,10,342,1,0,0,0, - 11,344,1,0,0,0,11,346,1,0,0,0,11,348,1,0,0,0,11,350,1,0,0,0,11,352,1,0, - 0,0,12,354,1,0,0,0,12,356,1,0,0,0,12,358,1,0,0,0,12,360,1,0,0,0,12,362, - 1,0,0,0,13,364,1,0,0,0,13,366,1,0,0,0,13,368,1,0,0,0,13,370,1,0,0,0,13, - 372,1,0,0,0,13,374,1,0,0,0,14,376,1,0,0,0,14,378,1,0,0,0,14,380,1,0,0,0, - 14,382,1,0,0,0,14,384,1,0,0,0,14,386,1,0,0,0,15,388,1,0,0,0,15,390,1,0, + 10,344,1,0,0,0,11,346,1,0,0,0,11,348,1,0,0,0,11,350,1,0,0,0,11,352,1,0, + 0,0,11,354,1,0,0,0,12,356,1,0,0,0,12,358,1,0,0,0,12,360,1,0,0,0,12,362, + 1,0,0,0,12,364,1,0,0,0,13,366,1,0,0,0,13,368,1,0,0,0,13,370,1,0,0,0,13, + 372,1,0,0,0,13,374,1,0,0,0,13,376,1,0,0,0,14,378,1,0,0,0,14,380,1,0,0,0, + 14,382,1,0,0,0,14,384,1,0,0,0,14,386,1,0,0,0,14,388,1,0,0,0,15,390,1,0, 0,0,15,392,1,0,0,0,15,394,1,0,0,0,15,396,1,0,0,0,15,398,1,0,0,0,15,400, - 1,0,0,0,15,402,1,0,0,0,15,404,1,0,0,0,16,406,1,0,0,0,18,416,1,0,0,0,20, - 423,1,0,0,0,22,432,1,0,0,0,24,439,1,0,0,0,26,449,1,0,0,0,28,456,1,0,0,0, - 30,463,1,0,0,0,32,477,1,0,0,0,34,484,1,0,0,0,36,492,1,0,0,0,38,501,1,0, - 0,0,40,508,1,0,0,0,42,518,1,0,0,0,44,530,1,0,0,0,46,539,1,0,0,0,48,545, - 1,0,0,0,50,552,1,0,0,0,52,559,1,0,0,0,54,567,1,0,0,0,56,576,1,0,0,0,58, - 582,1,0,0,0,60,599,1,0,0,0,62,615,1,0,0,0,64,624,1,0,0,0,66,627,1,0,0,0, - 68,631,1,0,0,0,70,636,1,0,0,0,72,641,1,0,0,0,74,645,1,0,0,0,76,649,1,0, - 0,0,78,653,1,0,0,0,80,657,1,0,0,0,82,659,1,0,0,0,84,661,1,0,0,0,86,664, - 1,0,0,0,88,666,1,0,0,0,90,675,1,0,0,0,92,677,1,0,0,0,94,682,1,0,0,0,96, - 684,1,0,0,0,98,689,1,0,0,0,100,720,1,0,0,0,102,723,1,0,0,0,104,769,1,0, - 0,0,106,771,1,0,0,0,108,774,1,0,0,0,110,778,1,0,0,0,112,782,1,0,0,0,114, - 784,1,0,0,0,116,787,1,0,0,0,118,789,1,0,0,0,120,794,1,0,0,0,122,796,1,0, - 0,0,124,802,1,0,0,0,126,808,1,0,0,0,128,811,1,0,0,0,130,814,1,0,0,0,132, - 819,1,0,0,0,134,824,1,0,0,0,136,826,1,0,0,0,138,832,1,0,0,0,140,836,1,0, - 0,0,142,841,1,0,0,0,144,847,1,0,0,0,146,850,1,0,0,0,148,852,1,0,0,0,150, - 858,1,0,0,0,152,860,1,0,0,0,154,865,1,0,0,0,156,868,1,0,0,0,158,871,1,0, - 0,0,160,874,1,0,0,0,162,876,1,0,0,0,164,879,1,0,0,0,166,881,1,0,0,0,168, - 884,1,0,0,0,170,886,1,0,0,0,172,888,1,0,0,0,174,890,1,0,0,0,176,892,1,0, - 0,0,178,908,1,0,0,0,180,910,1,0,0,0,182,915,1,0,0,0,184,936,1,0,0,0,186, - 938,1,0,0,0,188,946,1,0,0,0,190,948,1,0,0,0,192,952,1,0,0,0,194,956,1,0, - 0,0,196,960,1,0,0,0,198,965,1,0,0,0,200,969,1,0,0,0,202,973,1,0,0,0,204, - 977,1,0,0,0,206,981,1,0,0,0,208,985,1,0,0,0,210,994,1,0,0,0,212,998,1,0, - 0,0,214,1002,1,0,0,0,216,1006,1,0,0,0,218,1010,1,0,0,0,220,1014,1,0,0,0, - 222,1019,1,0,0,0,224,1023,1,0,0,0,226,1031,1,0,0,0,228,1052,1,0,0,0,230, - 1056,1,0,0,0,232,1060,1,0,0,0,234,1064,1,0,0,0,236,1068,1,0,0,0,238,1072, - 1,0,0,0,240,1077,1,0,0,0,242,1081,1,0,0,0,244,1085,1,0,0,0,246,1089,1,0, - 0,0,248,1092,1,0,0,0,250,1096,1,0,0,0,252,1100,1,0,0,0,254,1104,1,0,0,0, - 256,1108,1,0,0,0,258,1113,1,0,0,0,260,1118,1,0,0,0,262,1123,1,0,0,0,264, - 1130,1,0,0,0,266,1139,1,0,0,0,268,1146,1,0,0,0,270,1150,1,0,0,0,272,1154, - 1,0,0,0,274,1158,1,0,0,0,276,1162,1,0,0,0,278,1168,1,0,0,0,280,1172,1,0, - 0,0,282,1176,1,0,0,0,284,1180,1,0,0,0,286,1184,1,0,0,0,288,1188,1,0,0,0, - 290,1192,1,0,0,0,292,1196,1,0,0,0,294,1200,1,0,0,0,296,1204,1,0,0,0,298, - 1209,1,0,0,0,300,1213,1,0,0,0,302,1217,1,0,0,0,304,1221,1,0,0,0,306,1226, - 1,0,0,0,308,1230,1,0,0,0,310,1234,1,0,0,0,312,1238,1,0,0,0,314,1242,1,0, - 0,0,316,1246,1,0,0,0,318,1252,1,0,0,0,320,1256,1,0,0,0,322,1260,1,0,0,0, - 324,1264,1,0,0,0,326,1268,1,0,0,0,328,1272,1,0,0,0,330,1276,1,0,0,0,332, - 1281,1,0,0,0,334,1285,1,0,0,0,336,1289,1,0,0,0,338,1293,1,0,0,0,340,1297, - 1,0,0,0,342,1301,1,0,0,0,344,1305,1,0,0,0,346,1310,1,0,0,0,348,1315,1,0, - 0,0,350,1319,1,0,0,0,352,1323,1,0,0,0,354,1327,1,0,0,0,356,1332,1,0,0,0, - 358,1342,1,0,0,0,360,1346,1,0,0,0,362,1350,1,0,0,0,364,1354,1,0,0,0,366, - 1359,1,0,0,0,368,1366,1,0,0,0,370,1370,1,0,0,0,372,1374,1,0,0,0,374,1378, - 1,0,0,0,376,1382,1,0,0,0,378,1387,1,0,0,0,380,1393,1,0,0,0,382,1399,1,0, - 0,0,384,1403,1,0,0,0,386,1407,1,0,0,0,388,1411,1,0,0,0,390,1417,1,0,0,0, - 392,1423,1,0,0,0,394,1427,1,0,0,0,396,1431,1,0,0,0,398,1435,1,0,0,0,400, - 1441,1,0,0,0,402,1447,1,0,0,0,404,1453,1,0,0,0,406,407,7,0,0,0,407,408, - 7,1,0,0,408,409,7,2,0,0,409,410,7,2,0,0,410,411,7,3,0,0,411,412,7,4,0,0, - 412,413,7,5,0,0,413,414,1,0,0,0,414,415,6,0,0,0,415,17,1,0,0,0,416,417, - 7,0,0,0,417,418,7,6,0,0,418,419,7,7,0,0,419,420,7,8,0,0,420,421,1,0,0,0, - 421,422,6,1,1,0,422,19,1,0,0,0,423,424,7,3,0,0,424,425,7,9,0,0,425,426, - 7,6,0,0,426,427,7,1,0,0,427,428,7,4,0,0,428,429,7,10,0,0,429,430,1,0,0, - 0,430,431,6,2,2,0,431,21,1,0,0,0,432,433,7,3,0,0,433,434,7,11,0,0,434,435, - 7,12,0,0,435,436,7,13,0,0,436,437,1,0,0,0,437,438,6,3,0,0,438,23,1,0,0, - 0,439,440,7,3,0,0,440,441,7,14,0,0,441,442,7,8,0,0,442,443,7,13,0,0,443, - 444,7,12,0,0,444,445,7,1,0,0,445,446,7,9,0,0,446,447,1,0,0,0,447,448,6, - 4,3,0,448,25,1,0,0,0,449,450,7,15,0,0,450,451,7,6,0,0,451,452,7,7,0,0,452, - 453,7,16,0,0,453,454,1,0,0,0,454,455,6,5,4,0,455,27,1,0,0,0,456,457,7,17, - 0,0,457,458,7,6,0,0,458,459,7,7,0,0,459,460,7,18,0,0,460,461,1,0,0,0,461, - 462,6,6,0,0,462,29,1,0,0,0,463,464,7,1,0,0,464,465,7,9,0,0,465,466,7,13, - 0,0,466,467,7,1,0,0,467,468,7,9,0,0,468,469,7,3,0,0,469,470,7,2,0,0,470, - 471,7,5,0,0,471,472,7,12,0,0,472,473,7,5,0,0,473,474,7,2,0,0,474,475,1, - 0,0,0,475,476,6,7,0,0,476,31,1,0,0,0,477,478,7,18,0,0,478,479,7,3,0,0,479, - 480,7,3,0,0,480,481,7,8,0,0,481,482,1,0,0,0,482,483,6,8,1,0,483,33,1,0, - 0,0,484,485,7,13,0,0,485,486,7,1,0,0,486,487,7,16,0,0,487,488,7,1,0,0,488, - 489,7,5,0,0,489,490,1,0,0,0,490,491,6,9,0,0,491,35,1,0,0,0,492,493,7,13, - 0,0,493,494,7,7,0,0,494,495,7,7,0,0,495,496,7,18,0,0,496,497,7,19,0,0,497, - 498,7,8,0,0,498,499,1,0,0,0,499,500,6,10,5,0,500,37,1,0,0,0,501,502,7,16, - 0,0,502,503,7,3,0,0,503,504,7,5,0,0,504,505,7,12,0,0,505,506,1,0,0,0,506, - 507,6,11,6,0,507,39,1,0,0,0,508,509,7,16,0,0,509,510,7,3,0,0,510,511,7, - 5,0,0,511,512,7,6,0,0,512,513,7,1,0,0,513,514,7,4,0,0,514,515,7,2,0,0,515, - 516,1,0,0,0,516,517,6,12,7,0,517,41,1,0,0,0,518,519,7,16,0,0,519,520,7, - 11,0,0,520,521,5,95,0,0,521,522,7,3,0,0,522,523,7,14,0,0,523,524,7,8,0, - 0,524,525,7,12,0,0,525,526,7,9,0,0,526,527,7,0,0,0,527,528,1,0,0,0,528, - 529,6,13,8,0,529,43,1,0,0,0,530,531,7,6,0,0,531,532,7,3,0,0,532,533,7,9, - 0,0,533,534,7,12,0,0,534,535,7,16,0,0,535,536,7,3,0,0,536,537,1,0,0,0,537, - 538,6,14,9,0,538,45,1,0,0,0,539,540,7,6,0,0,540,541,7,7,0,0,541,542,7,20, - 0,0,542,543,1,0,0,0,543,544,6,15,0,0,544,47,1,0,0,0,545,546,7,2,0,0,546, - 547,7,10,0,0,547,548,7,7,0,0,548,549,7,20,0,0,549,550,1,0,0,0,550,551,6, - 16,10,0,551,49,1,0,0,0,552,553,7,2,0,0,553,554,7,7,0,0,554,555,7,6,0,0, - 555,556,7,5,0,0,556,557,1,0,0,0,557,558,6,17,0,0,558,51,1,0,0,0,559,560, - 7,2,0,0,560,561,7,5,0,0,561,562,7,12,0,0,562,563,7,5,0,0,563,564,7,2,0, - 0,564,565,1,0,0,0,565,566,6,18,0,0,566,53,1,0,0,0,567,568,7,20,0,0,568, - 569,7,10,0,0,569,570,7,3,0,0,570,571,7,6,0,0,571,572,7,3,0,0,572,573,1, - 0,0,0,573,574,6,19,0,0,574,55,1,0,0,0,575,577,8,21,0,0,576,575,1,0,0,0, - 577,578,1,0,0,0,578,576,1,0,0,0,578,579,1,0,0,0,579,580,1,0,0,0,580,581, - 6,20,0,0,581,57,1,0,0,0,582,583,5,47,0,0,583,584,5,47,0,0,584,588,1,0,0, - 0,585,587,8,22,0,0,586,585,1,0,0,0,587,590,1,0,0,0,588,586,1,0,0,0,588, - 589,1,0,0,0,589,592,1,0,0,0,590,588,1,0,0,0,591,593,5,13,0,0,592,591,1, - 0,0,0,592,593,1,0,0,0,593,595,1,0,0,0,594,596,5,10,0,0,595,594,1,0,0,0, - 595,596,1,0,0,0,596,597,1,0,0,0,597,598,6,21,11,0,598,59,1,0,0,0,599,600, - 5,47,0,0,600,601,5,42,0,0,601,606,1,0,0,0,602,605,3,60,22,0,603,605,9,0, - 0,0,604,602,1,0,0,0,604,603,1,0,0,0,605,608,1,0,0,0,606,607,1,0,0,0,606, - 604,1,0,0,0,607,609,1,0,0,0,608,606,1,0,0,0,609,610,5,42,0,0,610,611,5, - 47,0,0,611,612,1,0,0,0,612,613,6,22,11,0,613,61,1,0,0,0,614,616,7,23,0, - 0,615,614,1,0,0,0,616,617,1,0,0,0,617,615,1,0,0,0,617,618,1,0,0,0,618,619, - 1,0,0,0,619,620,6,23,11,0,620,63,1,0,0,0,621,625,8,24,0,0,622,623,5,47, - 0,0,623,625,8,25,0,0,624,621,1,0,0,0,624,622,1,0,0,0,625,65,1,0,0,0,626, - 628,3,64,24,0,627,626,1,0,0,0,628,629,1,0,0,0,629,627,1,0,0,0,629,630,1, - 0,0,0,630,67,1,0,0,0,631,632,3,180,82,0,632,633,1,0,0,0,633,634,6,26,12, - 0,634,635,6,26,13,0,635,69,1,0,0,0,636,637,3,78,31,0,637,638,1,0,0,0,638, - 639,6,27,14,0,639,640,6,27,15,0,640,71,1,0,0,0,641,642,3,62,23,0,642,643, - 1,0,0,0,643,644,6,28,11,0,644,73,1,0,0,0,645,646,3,58,21,0,646,647,1,0, - 0,0,647,648,6,29,11,0,648,75,1,0,0,0,649,650,3,60,22,0,650,651,1,0,0,0, - 651,652,6,30,11,0,652,77,1,0,0,0,653,654,5,124,0,0,654,655,1,0,0,0,655, - 656,6,31,15,0,656,79,1,0,0,0,657,658,7,26,0,0,658,81,1,0,0,0,659,660,7, - 27,0,0,660,83,1,0,0,0,661,662,5,92,0,0,662,663,7,28,0,0,663,85,1,0,0,0, - 664,665,8,29,0,0,665,87,1,0,0,0,666,668,7,3,0,0,667,669,7,30,0,0,668,667, - 1,0,0,0,668,669,1,0,0,0,669,671,1,0,0,0,670,672,3,80,32,0,671,670,1,0,0, - 0,672,673,1,0,0,0,673,671,1,0,0,0,673,674,1,0,0,0,674,89,1,0,0,0,675,676, - 5,64,0,0,676,91,1,0,0,0,677,678,5,96,0,0,678,93,1,0,0,0,679,683,8,31,0, - 0,680,681,5,96,0,0,681,683,5,96,0,0,682,679,1,0,0,0,682,680,1,0,0,0,683, - 95,1,0,0,0,684,685,5,95,0,0,685,97,1,0,0,0,686,690,3,82,33,0,687,690,3, - 80,32,0,688,690,3,96,40,0,689,686,1,0,0,0,689,687,1,0,0,0,689,688,1,0,0, - 0,690,99,1,0,0,0,691,696,5,34,0,0,692,695,3,84,34,0,693,695,3,86,35,0,694, - 692,1,0,0,0,694,693,1,0,0,0,695,698,1,0,0,0,696,694,1,0,0,0,696,697,1,0, - 0,0,697,699,1,0,0,0,698,696,1,0,0,0,699,721,5,34,0,0,700,701,5,34,0,0,701, - 702,5,34,0,0,702,703,5,34,0,0,703,707,1,0,0,0,704,706,8,22,0,0,705,704, - 1,0,0,0,706,709,1,0,0,0,707,708,1,0,0,0,707,705,1,0,0,0,708,710,1,0,0,0, - 709,707,1,0,0,0,710,711,5,34,0,0,711,712,5,34,0,0,712,713,5,34,0,0,713, - 715,1,0,0,0,714,716,5,34,0,0,715,714,1,0,0,0,715,716,1,0,0,0,716,718,1, - 0,0,0,717,719,5,34,0,0,718,717,1,0,0,0,718,719,1,0,0,0,719,721,1,0,0,0, - 720,691,1,0,0,0,720,700,1,0,0,0,721,101,1,0,0,0,722,724,3,80,32,0,723,722, - 1,0,0,0,724,725,1,0,0,0,725,723,1,0,0,0,725,726,1,0,0,0,726,103,1,0,0,0, - 727,729,3,80,32,0,728,727,1,0,0,0,729,730,1,0,0,0,730,728,1,0,0,0,730,731, - 1,0,0,0,731,732,1,0,0,0,732,736,3,120,52,0,733,735,3,80,32,0,734,733,1, - 0,0,0,735,738,1,0,0,0,736,734,1,0,0,0,736,737,1,0,0,0,737,770,1,0,0,0,738, - 736,1,0,0,0,739,741,3,120,52,0,740,742,3,80,32,0,741,740,1,0,0,0,742,743, - 1,0,0,0,743,741,1,0,0,0,743,744,1,0,0,0,744,770,1,0,0,0,745,747,3,80,32, - 0,746,745,1,0,0,0,747,748,1,0,0,0,748,746,1,0,0,0,748,749,1,0,0,0,749,757, - 1,0,0,0,750,754,3,120,52,0,751,753,3,80,32,0,752,751,1,0,0,0,753,756,1, - 0,0,0,754,752,1,0,0,0,754,755,1,0,0,0,755,758,1,0,0,0,756,754,1,0,0,0,757, - 750,1,0,0,0,757,758,1,0,0,0,758,759,1,0,0,0,759,760,3,88,36,0,760,770,1, - 0,0,0,761,763,3,120,52,0,762,764,3,80,32,0,763,762,1,0,0,0,764,765,1,0, - 0,0,765,763,1,0,0,0,765,766,1,0,0,0,766,767,1,0,0,0,767,768,3,88,36,0,768, - 770,1,0,0,0,769,728,1,0,0,0,769,739,1,0,0,0,769,746,1,0,0,0,769,761,1,0, - 0,0,770,105,1,0,0,0,771,772,7,32,0,0,772,773,7,33,0,0,773,107,1,0,0,0,774, - 775,7,12,0,0,775,776,7,9,0,0,776,777,7,0,0,0,777,109,1,0,0,0,778,779,7, - 12,0,0,779,780,7,2,0,0,780,781,7,4,0,0,781,111,1,0,0,0,782,783,5,61,0,0, - 783,113,1,0,0,0,784,785,5,58,0,0,785,786,5,58,0,0,786,115,1,0,0,0,787,788, - 5,44,0,0,788,117,1,0,0,0,789,790,7,0,0,0,790,791,7,3,0,0,791,792,7,2,0, - 0,792,793,7,4,0,0,793,119,1,0,0,0,794,795,5,46,0,0,795,121,1,0,0,0,796, - 797,7,15,0,0,797,798,7,12,0,0,798,799,7,13,0,0,799,800,7,2,0,0,800,801, - 7,3,0,0,801,123,1,0,0,0,802,803,7,15,0,0,803,804,7,1,0,0,804,805,7,6,0, - 0,805,806,7,2,0,0,806,807,7,5,0,0,807,125,1,0,0,0,808,809,7,1,0,0,809,810, - 7,9,0,0,810,127,1,0,0,0,811,812,7,1,0,0,812,813,7,2,0,0,813,129,1,0,0,0, - 814,815,7,13,0,0,815,816,7,12,0,0,816,817,7,2,0,0,817,818,7,5,0,0,818,131, - 1,0,0,0,819,820,7,13,0,0,820,821,7,1,0,0,821,822,7,18,0,0,822,823,7,3,0, - 0,823,133,1,0,0,0,824,825,5,40,0,0,825,135,1,0,0,0,826,827,7,16,0,0,827, - 828,7,12,0,0,828,829,7,5,0,0,829,830,7,4,0,0,830,831,7,10,0,0,831,137,1, - 0,0,0,832,833,7,9,0,0,833,834,7,7,0,0,834,835,7,5,0,0,835,139,1,0,0,0,836, - 837,7,9,0,0,837,838,7,19,0,0,838,839,7,13,0,0,839,840,7,13,0,0,840,141, - 1,0,0,0,841,842,7,9,0,0,842,843,7,19,0,0,843,844,7,13,0,0,844,845,7,13, - 0,0,845,846,7,2,0,0,846,143,1,0,0,0,847,848,7,7,0,0,848,849,7,6,0,0,849, - 145,1,0,0,0,850,851,5,63,0,0,851,147,1,0,0,0,852,853,7,6,0,0,853,854,7, - 13,0,0,854,855,7,1,0,0,855,856,7,18,0,0,856,857,7,3,0,0,857,149,1,0,0,0, - 858,859,5,41,0,0,859,151,1,0,0,0,860,861,7,5,0,0,861,862,7,6,0,0,862,863, - 7,19,0,0,863,864,7,3,0,0,864,153,1,0,0,0,865,866,5,61,0,0,866,867,5,61, - 0,0,867,155,1,0,0,0,868,869,5,61,0,0,869,870,5,126,0,0,870,157,1,0,0,0, - 871,872,5,33,0,0,872,873,5,61,0,0,873,159,1,0,0,0,874,875,5,60,0,0,875, - 161,1,0,0,0,876,877,5,60,0,0,877,878,5,61,0,0,878,163,1,0,0,0,879,880,5, - 62,0,0,880,165,1,0,0,0,881,882,5,62,0,0,882,883,5,61,0,0,883,167,1,0,0, - 0,884,885,5,43,0,0,885,169,1,0,0,0,886,887,5,45,0,0,887,171,1,0,0,0,888, - 889,5,42,0,0,889,173,1,0,0,0,890,891,5,47,0,0,891,175,1,0,0,0,892,893,5, - 37,0,0,893,177,1,0,0,0,894,895,3,146,65,0,895,899,3,82,33,0,896,898,3,98, - 41,0,897,896,1,0,0,0,898,901,1,0,0,0,899,897,1,0,0,0,899,900,1,0,0,0,900, - 909,1,0,0,0,901,899,1,0,0,0,902,904,3,146,65,0,903,905,3,80,32,0,904,903, - 1,0,0,0,905,906,1,0,0,0,906,904,1,0,0,0,906,907,1,0,0,0,907,909,1,0,0,0, - 908,894,1,0,0,0,908,902,1,0,0,0,909,179,1,0,0,0,910,911,5,91,0,0,911,912, - 1,0,0,0,912,913,6,82,0,0,913,914,6,82,0,0,914,181,1,0,0,0,915,916,5,93, - 0,0,916,917,1,0,0,0,917,918,6,83,15,0,918,919,6,83,15,0,919,183,1,0,0,0, - 920,924,3,82,33,0,921,923,3,98,41,0,922,921,1,0,0,0,923,926,1,0,0,0,924, - 922,1,0,0,0,924,925,1,0,0,0,925,937,1,0,0,0,926,924,1,0,0,0,927,930,3,96, - 40,0,928,930,3,90,37,0,929,927,1,0,0,0,929,928,1,0,0,0,930,932,1,0,0,0, - 931,933,3,98,41,0,932,931,1,0,0,0,933,934,1,0,0,0,934,932,1,0,0,0,934,935, - 1,0,0,0,935,937,1,0,0,0,936,920,1,0,0,0,936,929,1,0,0,0,937,185,1,0,0,0, - 938,940,3,92,38,0,939,941,3,94,39,0,940,939,1,0,0,0,941,942,1,0,0,0,942, - 940,1,0,0,0,942,943,1,0,0,0,943,944,1,0,0,0,944,945,3,92,38,0,945,187,1, - 0,0,0,946,947,3,186,85,0,947,189,1,0,0,0,948,949,3,58,21,0,949,950,1,0, - 0,0,950,951,6,87,11,0,951,191,1,0,0,0,952,953,3,60,22,0,953,954,1,0,0,0, - 954,955,6,88,11,0,955,193,1,0,0,0,956,957,3,62,23,0,957,958,1,0,0,0,958, - 959,6,89,11,0,959,195,1,0,0,0,960,961,3,78,31,0,961,962,1,0,0,0,962,963, - 6,90,14,0,963,964,6,90,15,0,964,197,1,0,0,0,965,966,3,180,82,0,966,967, - 1,0,0,0,967,968,6,91,12,0,968,199,1,0,0,0,969,970,3,182,83,0,970,971,1, - 0,0,0,971,972,6,92,16,0,972,201,1,0,0,0,973,974,3,366,175,0,974,975,1,0, - 0,0,975,976,6,93,17,0,976,203,1,0,0,0,977,978,3,116,50,0,978,979,1,0,0, - 0,979,980,6,94,18,0,980,205,1,0,0,0,981,982,3,112,48,0,982,983,1,0,0,0, - 983,984,6,95,19,0,984,207,1,0,0,0,985,986,7,16,0,0,986,987,7,3,0,0,987, - 988,7,5,0,0,988,989,7,12,0,0,989,990,7,0,0,0,990,991,7,12,0,0,991,992,7, - 5,0,0,992,993,7,12,0,0,993,209,1,0,0,0,994,995,3,66,25,0,995,996,1,0,0, - 0,996,997,6,97,20,0,997,211,1,0,0,0,998,999,3,100,42,0,999,1000,1,0,0,0, - 1000,1001,6,98,21,0,1001,213,1,0,0,0,1002,1003,3,58,21,0,1003,1004,1,0, - 0,0,1004,1005,6,99,11,0,1005,215,1,0,0,0,1006,1007,3,60,22,0,1007,1008, - 1,0,0,0,1008,1009,6,100,11,0,1009,217,1,0,0,0,1010,1011,3,62,23,0,1011, - 1012,1,0,0,0,1012,1013,6,101,11,0,1013,219,1,0,0,0,1014,1015,3,78,31,0, - 1015,1016,1,0,0,0,1016,1017,6,102,14,0,1017,1018,6,102,15,0,1018,221,1, - 0,0,0,1019,1020,3,120,52,0,1020,1021,1,0,0,0,1021,1022,6,103,22,0,1022, - 223,1,0,0,0,1023,1024,3,116,50,0,1024,1025,1,0,0,0,1025,1026,6,104,18,0, - 1026,225,1,0,0,0,1027,1032,3,82,33,0,1028,1032,3,80,32,0,1029,1032,3,96, - 40,0,1030,1032,3,172,78,0,1031,1027,1,0,0,0,1031,1028,1,0,0,0,1031,1029, - 1,0,0,0,1031,1030,1,0,0,0,1032,227,1,0,0,0,1033,1036,3,82,33,0,1034,1036, - 3,172,78,0,1035,1033,1,0,0,0,1035,1034,1,0,0,0,1036,1040,1,0,0,0,1037,1039, - 3,226,105,0,1038,1037,1,0,0,0,1039,1042,1,0,0,0,1040,1038,1,0,0,0,1040, - 1041,1,0,0,0,1041,1053,1,0,0,0,1042,1040,1,0,0,0,1043,1046,3,96,40,0,1044, - 1046,3,90,37,0,1045,1043,1,0,0,0,1045,1044,1,0,0,0,1046,1048,1,0,0,0,1047, - 1049,3,226,105,0,1048,1047,1,0,0,0,1049,1050,1,0,0,0,1050,1048,1,0,0,0, - 1050,1051,1,0,0,0,1051,1053,1,0,0,0,1052,1035,1,0,0,0,1052,1045,1,0,0,0, - 1053,229,1,0,0,0,1054,1057,3,228,106,0,1055,1057,3,186,85,0,1056,1054,1, - 0,0,0,1056,1055,1,0,0,0,1057,1058,1,0,0,0,1058,1056,1,0,0,0,1058,1059,1, - 0,0,0,1059,231,1,0,0,0,1060,1061,3,58,21,0,1061,1062,1,0,0,0,1062,1063, - 6,108,11,0,1063,233,1,0,0,0,1064,1065,3,60,22,0,1065,1066,1,0,0,0,1066, - 1067,6,109,11,0,1067,235,1,0,0,0,1068,1069,3,62,23,0,1069,1070,1,0,0,0, - 1070,1071,6,110,11,0,1071,237,1,0,0,0,1072,1073,3,78,31,0,1073,1074,1,0, - 0,0,1074,1075,6,111,14,0,1075,1076,6,111,15,0,1076,239,1,0,0,0,1077,1078, - 3,112,48,0,1078,1079,1,0,0,0,1079,1080,6,112,19,0,1080,241,1,0,0,0,1081, - 1082,3,116,50,0,1082,1083,1,0,0,0,1083,1084,6,113,18,0,1084,243,1,0,0,0, - 1085,1086,3,120,52,0,1086,1087,1,0,0,0,1087,1088,6,114,22,0,1088,245,1, - 0,0,0,1089,1090,7,12,0,0,1090,1091,7,2,0,0,1091,247,1,0,0,0,1092,1093,3, - 230,107,0,1093,1094,1,0,0,0,1094,1095,6,116,23,0,1095,249,1,0,0,0,1096, - 1097,3,58,21,0,1097,1098,1,0,0,0,1098,1099,6,117,11,0,1099,251,1,0,0,0, - 1100,1101,3,60,22,0,1101,1102,1,0,0,0,1102,1103,6,118,11,0,1103,253,1,0, - 0,0,1104,1105,3,62,23,0,1105,1106,1,0,0,0,1106,1107,6,119,11,0,1107,255, - 1,0,0,0,1108,1109,3,78,31,0,1109,1110,1,0,0,0,1110,1111,6,120,14,0,1111, - 1112,6,120,15,0,1112,257,1,0,0,0,1113,1114,3,180,82,0,1114,1115,1,0,0,0, - 1115,1116,6,121,12,0,1116,1117,6,121,24,0,1117,259,1,0,0,0,1118,1119,7, - 7,0,0,1119,1120,7,9,0,0,1120,1121,1,0,0,0,1121,1122,6,122,25,0,1122,261, - 1,0,0,0,1123,1124,7,20,0,0,1124,1125,7,1,0,0,1125,1126,7,5,0,0,1126,1127, - 7,10,0,0,1127,1128,1,0,0,0,1128,1129,6,123,25,0,1129,263,1,0,0,0,1130,1131, - 8,34,0,0,1131,265,1,0,0,0,1132,1134,3,264,124,0,1133,1132,1,0,0,0,1134, - 1135,1,0,0,0,1135,1133,1,0,0,0,1135,1136,1,0,0,0,1136,1137,1,0,0,0,1137, - 1138,3,366,175,0,1138,1140,1,0,0,0,1139,1133,1,0,0,0,1139,1140,1,0,0,0, - 1140,1142,1,0,0,0,1141,1143,3,264,124,0,1142,1141,1,0,0,0,1143,1144,1,0, - 0,0,1144,1142,1,0,0,0,1144,1145,1,0,0,0,1145,267,1,0,0,0,1146,1147,3,266, - 125,0,1147,1148,1,0,0,0,1148,1149,6,126,26,0,1149,269,1,0,0,0,1150,1151, - 3,58,21,0,1151,1152,1,0,0,0,1152,1153,6,127,11,0,1153,271,1,0,0,0,1154, - 1155,3,60,22,0,1155,1156,1,0,0,0,1156,1157,6,128,11,0,1157,273,1,0,0,0, - 1158,1159,3,62,23,0,1159,1160,1,0,0,0,1160,1161,6,129,11,0,1161,275,1,0, - 0,0,1162,1163,3,78,31,0,1163,1164,1,0,0,0,1164,1165,6,130,14,0,1165,1166, - 6,130,15,0,1166,1167,6,130,15,0,1167,277,1,0,0,0,1168,1169,3,112,48,0,1169, - 1170,1,0,0,0,1170,1171,6,131,19,0,1171,279,1,0,0,0,1172,1173,3,116,50,0, - 1173,1174,1,0,0,0,1174,1175,6,132,18,0,1175,281,1,0,0,0,1176,1177,3,120, - 52,0,1177,1178,1,0,0,0,1178,1179,6,133,22,0,1179,283,1,0,0,0,1180,1181, - 3,262,123,0,1181,1182,1,0,0,0,1182,1183,6,134,27,0,1183,285,1,0,0,0,1184, - 1185,3,230,107,0,1185,1186,1,0,0,0,1186,1187,6,135,23,0,1187,287,1,0,0, - 0,1188,1189,3,188,86,0,1189,1190,1,0,0,0,1190,1191,6,136,28,0,1191,289, - 1,0,0,0,1192,1193,3,58,21,0,1193,1194,1,0,0,0,1194,1195,6,137,11,0,1195, - 291,1,0,0,0,1196,1197,3,60,22,0,1197,1198,1,0,0,0,1198,1199,6,138,11,0, - 1199,293,1,0,0,0,1200,1201,3,62,23,0,1201,1202,1,0,0,0,1202,1203,6,139, - 11,0,1203,295,1,0,0,0,1204,1205,3,78,31,0,1205,1206,1,0,0,0,1206,1207,6, - 140,14,0,1207,1208,6,140,15,0,1208,297,1,0,0,0,1209,1210,3,366,175,0,1210, - 1211,1,0,0,0,1211,1212,6,141,17,0,1212,299,1,0,0,0,1213,1214,3,116,50,0, - 1214,1215,1,0,0,0,1215,1216,6,142,18,0,1216,301,1,0,0,0,1217,1218,3,120, - 52,0,1218,1219,1,0,0,0,1219,1220,6,143,22,0,1220,303,1,0,0,0,1221,1222, - 3,260,122,0,1222,1223,1,0,0,0,1223,1224,6,144,29,0,1224,1225,6,144,30,0, - 1225,305,1,0,0,0,1226,1227,3,66,25,0,1227,1228,1,0,0,0,1228,1229,6,145, - 20,0,1229,307,1,0,0,0,1230,1231,3,100,42,0,1231,1232,1,0,0,0,1232,1233, - 6,146,21,0,1233,309,1,0,0,0,1234,1235,3,58,21,0,1235,1236,1,0,0,0,1236, - 1237,6,147,11,0,1237,311,1,0,0,0,1238,1239,3,60,22,0,1239,1240,1,0,0,0, - 1240,1241,6,148,11,0,1241,313,1,0,0,0,1242,1243,3,62,23,0,1243,1244,1,0, - 0,0,1244,1245,6,149,11,0,1245,315,1,0,0,0,1246,1247,3,78,31,0,1247,1248, - 1,0,0,0,1248,1249,6,150,14,0,1249,1250,6,150,15,0,1250,1251,6,150,15,0, - 1251,317,1,0,0,0,1252,1253,3,116,50,0,1253,1254,1,0,0,0,1254,1255,6,151, - 18,0,1255,319,1,0,0,0,1256,1257,3,120,52,0,1257,1258,1,0,0,0,1258,1259, - 6,152,22,0,1259,321,1,0,0,0,1260,1261,3,230,107,0,1261,1262,1,0,0,0,1262, - 1263,6,153,23,0,1263,323,1,0,0,0,1264,1265,3,58,21,0,1265,1266,1,0,0,0, - 1266,1267,6,154,11,0,1267,325,1,0,0,0,1268,1269,3,60,22,0,1269,1270,1,0, - 0,0,1270,1271,6,155,11,0,1271,327,1,0,0,0,1272,1273,3,62,23,0,1273,1274, - 1,0,0,0,1274,1275,6,156,11,0,1275,329,1,0,0,0,1276,1277,3,78,31,0,1277, - 1278,1,0,0,0,1278,1279,6,157,14,0,1279,1280,6,157,15,0,1280,331,1,0,0,0, - 1281,1282,3,120,52,0,1282,1283,1,0,0,0,1283,1284,6,158,22,0,1284,333,1, - 0,0,0,1285,1286,3,188,86,0,1286,1287,1,0,0,0,1287,1288,6,159,28,0,1288, - 335,1,0,0,0,1289,1290,3,184,84,0,1290,1291,1,0,0,0,1291,1292,6,160,31,0, - 1292,337,1,0,0,0,1293,1294,3,58,21,0,1294,1295,1,0,0,0,1295,1296,6,161, - 11,0,1296,339,1,0,0,0,1297,1298,3,60,22,0,1298,1299,1,0,0,0,1299,1300,6, - 162,11,0,1300,341,1,0,0,0,1301,1302,3,62,23,0,1302,1303,1,0,0,0,1303,1304, - 6,163,11,0,1304,343,1,0,0,0,1305,1306,3,78,31,0,1306,1307,1,0,0,0,1307, - 1308,6,164,14,0,1308,1309,6,164,15,0,1309,345,1,0,0,0,1310,1311,7,1,0,0, - 1311,1312,7,9,0,0,1312,1313,7,15,0,0,1313,1314,7,7,0,0,1314,347,1,0,0,0, - 1315,1316,3,58,21,0,1316,1317,1,0,0,0,1317,1318,6,166,11,0,1318,349,1,0, - 0,0,1319,1320,3,60,22,0,1320,1321,1,0,0,0,1321,1322,6,167,11,0,1322,351, - 1,0,0,0,1323,1324,3,62,23,0,1324,1325,1,0,0,0,1325,1326,6,168,11,0,1326, - 353,1,0,0,0,1327,1328,3,78,31,0,1328,1329,1,0,0,0,1329,1330,6,169,14,0, - 1330,1331,6,169,15,0,1331,355,1,0,0,0,1332,1333,7,15,0,0,1333,1334,7,19, - 0,0,1334,1335,7,9,0,0,1335,1336,7,4,0,0,1336,1337,7,5,0,0,1337,1338,7,1, - 0,0,1338,1339,7,7,0,0,1339,1340,7,9,0,0,1340,1341,7,2,0,0,1341,357,1,0, - 0,0,1342,1343,3,58,21,0,1343,1344,1,0,0,0,1344,1345,6,171,11,0,1345,359, - 1,0,0,0,1346,1347,3,60,22,0,1347,1348,1,0,0,0,1348,1349,6,172,11,0,1349, - 361,1,0,0,0,1350,1351,3,62,23,0,1351,1352,1,0,0,0,1352,1353,6,173,11,0, - 1353,363,1,0,0,0,1354,1355,3,182,83,0,1355,1356,1,0,0,0,1356,1357,6,174, - 16,0,1357,1358,6,174,15,0,1358,365,1,0,0,0,1359,1360,5,58,0,0,1360,367, - 1,0,0,0,1361,1367,3,90,37,0,1362,1367,3,80,32,0,1363,1367,3,120,52,0,1364, - 1367,3,82,33,0,1365,1367,3,96,40,0,1366,1361,1,0,0,0,1366,1362,1,0,0,0, - 1366,1363,1,0,0,0,1366,1364,1,0,0,0,1366,1365,1,0,0,0,1367,1368,1,0,0,0, - 1368,1366,1,0,0,0,1368,1369,1,0,0,0,1369,369,1,0,0,0,1370,1371,3,58,21, - 0,1371,1372,1,0,0,0,1372,1373,6,177,11,0,1373,371,1,0,0,0,1374,1375,3,60, - 22,0,1375,1376,1,0,0,0,1376,1377,6,178,11,0,1377,373,1,0,0,0,1378,1379, - 3,62,23,0,1379,1380,1,0,0,0,1380,1381,6,179,11,0,1381,375,1,0,0,0,1382, - 1383,3,78,31,0,1383,1384,1,0,0,0,1384,1385,6,180,14,0,1385,1386,6,180,15, - 0,1386,377,1,0,0,0,1387,1388,3,66,25,0,1388,1389,1,0,0,0,1389,1390,6,181, - 20,0,1390,1391,6,181,15,0,1391,1392,6,181,32,0,1392,379,1,0,0,0,1393,1394, - 3,100,42,0,1394,1395,1,0,0,0,1395,1396,6,182,21,0,1396,1397,6,182,15,0, - 1397,1398,6,182,32,0,1398,381,1,0,0,0,1399,1400,3,58,21,0,1400,1401,1,0, - 0,0,1401,1402,6,183,11,0,1402,383,1,0,0,0,1403,1404,3,60,22,0,1404,1405, - 1,0,0,0,1405,1406,6,184,11,0,1406,385,1,0,0,0,1407,1408,3,62,23,0,1408, - 1409,1,0,0,0,1409,1410,6,185,11,0,1410,387,1,0,0,0,1411,1412,3,366,175, - 0,1412,1413,1,0,0,0,1413,1414,6,186,17,0,1414,1415,6,186,15,0,1415,1416, - 6,186,7,0,1416,389,1,0,0,0,1417,1418,3,116,50,0,1418,1419,1,0,0,0,1419, - 1420,6,187,18,0,1420,1421,6,187,15,0,1421,1422,6,187,7,0,1422,391,1,0,0, - 0,1423,1424,3,58,21,0,1424,1425,1,0,0,0,1425,1426,6,188,11,0,1426,393,1, - 0,0,0,1427,1428,3,60,22,0,1428,1429,1,0,0,0,1429,1430,6,189,11,0,1430,395, - 1,0,0,0,1431,1432,3,62,23,0,1432,1433,1,0,0,0,1433,1434,6,190,11,0,1434, - 397,1,0,0,0,1435,1436,3,188,86,0,1436,1437,1,0,0,0,1437,1438,6,191,15,0, - 1438,1439,6,191,0,0,1439,1440,6,191,28,0,1440,399,1,0,0,0,1441,1442,3,184, - 84,0,1442,1443,1,0,0,0,1443,1444,6,192,15,0,1444,1445,6,192,0,0,1445,1446, - 6,192,31,0,1446,401,1,0,0,0,1447,1448,3,106,45,0,1448,1449,1,0,0,0,1449, - 1450,6,193,15,0,1450,1451,6,193,0,0,1451,1452,6,193,33,0,1452,403,1,0,0, - 0,1453,1454,3,78,31,0,1454,1455,1,0,0,0,1455,1456,6,194,14,0,1456,1457, - 6,194,15,0,1457,405,1,0,0,0,65,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,578, - 588,592,595,604,606,617,624,629,668,673,682,689,694,696,707,715,718,720, - 725,730,736,743,748,754,757,765,769,899,906,908,924,929,934,936,942,1031, - 1035,1040,1045,1050,1052,1056,1058,1135,1139,1144,1366,1368,34,5,2,0,5, - 4,0,5,6,0,5,1,0,5,3,0,5,8,0,5,12,0,5,14,0,5,10,0,5,5,0,5,11,0,0,1,0,7,70, - 0,5,0,0,7,29,0,4,0,0,7,71,0,7,115,0,7,38,0,7,36,0,7,25,0,7,30,0,7,40,0, - 7,81,0,5,13,0,5,7,0,7,91,0,7,90,0,7,73,0,7,89,0,5,9,0,7,72,0,5,15,0,7,33, - 0]; + 1,0,0,0,15,402,1,0,0,0,15,404,1,0,0,0,15,406,1,0,0,0,16,408,1,0,0,0,18, + 418,1,0,0,0,20,425,1,0,0,0,22,434,1,0,0,0,24,441,1,0,0,0,26,451,1,0,0,0, + 28,458,1,0,0,0,30,465,1,0,0,0,32,479,1,0,0,0,34,486,1,0,0,0,36,494,1,0, + 0,0,38,503,1,0,0,0,40,510,1,0,0,0,42,520,1,0,0,0,44,532,1,0,0,0,46,541, + 1,0,0,0,48,547,1,0,0,0,50,554,1,0,0,0,52,561,1,0,0,0,54,569,1,0,0,0,56, + 577,1,0,0,0,58,586,1,0,0,0,60,592,1,0,0,0,62,609,1,0,0,0,64,625,1,0,0,0, + 66,634,1,0,0,0,68,637,1,0,0,0,70,641,1,0,0,0,72,646,1,0,0,0,74,651,1,0, + 0,0,76,655,1,0,0,0,78,659,1,0,0,0,80,663,1,0,0,0,82,667,1,0,0,0,84,669, + 1,0,0,0,86,671,1,0,0,0,88,674,1,0,0,0,90,676,1,0,0,0,92,685,1,0,0,0,94, + 687,1,0,0,0,96,692,1,0,0,0,98,694,1,0,0,0,100,699,1,0,0,0,102,730,1,0,0, + 0,104,733,1,0,0,0,106,779,1,0,0,0,108,781,1,0,0,0,110,784,1,0,0,0,112,788, + 1,0,0,0,114,792,1,0,0,0,116,794,1,0,0,0,118,797,1,0,0,0,120,799,1,0,0,0, + 122,804,1,0,0,0,124,806,1,0,0,0,126,812,1,0,0,0,128,818,1,0,0,0,130,821, + 1,0,0,0,132,824,1,0,0,0,134,829,1,0,0,0,136,834,1,0,0,0,138,836,1,0,0,0, + 140,842,1,0,0,0,142,846,1,0,0,0,144,851,1,0,0,0,146,857,1,0,0,0,148,860, + 1,0,0,0,150,862,1,0,0,0,152,868,1,0,0,0,154,870,1,0,0,0,156,875,1,0,0,0, + 158,878,1,0,0,0,160,881,1,0,0,0,162,884,1,0,0,0,164,886,1,0,0,0,166,889, + 1,0,0,0,168,891,1,0,0,0,170,894,1,0,0,0,172,896,1,0,0,0,174,898,1,0,0,0, + 176,900,1,0,0,0,178,902,1,0,0,0,180,918,1,0,0,0,182,920,1,0,0,0,184,925, + 1,0,0,0,186,946,1,0,0,0,188,948,1,0,0,0,190,956,1,0,0,0,192,958,1,0,0,0, + 194,962,1,0,0,0,196,966,1,0,0,0,198,970,1,0,0,0,200,975,1,0,0,0,202,979, + 1,0,0,0,204,983,1,0,0,0,206,987,1,0,0,0,208,991,1,0,0,0,210,995,1,0,0,0, + 212,1004,1,0,0,0,214,1008,1,0,0,0,216,1012,1,0,0,0,218,1016,1,0,0,0,220, + 1020,1,0,0,0,222,1024,1,0,0,0,224,1029,1,0,0,0,226,1033,1,0,0,0,228,1041, + 1,0,0,0,230,1062,1,0,0,0,232,1066,1,0,0,0,234,1070,1,0,0,0,236,1074,1,0, + 0,0,238,1078,1,0,0,0,240,1082,1,0,0,0,242,1087,1,0,0,0,244,1091,1,0,0,0, + 246,1095,1,0,0,0,248,1099,1,0,0,0,250,1102,1,0,0,0,252,1106,1,0,0,0,254, + 1110,1,0,0,0,256,1114,1,0,0,0,258,1118,1,0,0,0,260,1123,1,0,0,0,262,1128, + 1,0,0,0,264,1133,1,0,0,0,266,1140,1,0,0,0,268,1149,1,0,0,0,270,1156,1,0, + 0,0,272,1160,1,0,0,0,274,1164,1,0,0,0,276,1168,1,0,0,0,278,1172,1,0,0,0, + 280,1178,1,0,0,0,282,1182,1,0,0,0,284,1186,1,0,0,0,286,1190,1,0,0,0,288, + 1194,1,0,0,0,290,1198,1,0,0,0,292,1202,1,0,0,0,294,1206,1,0,0,0,296,1210, + 1,0,0,0,298,1214,1,0,0,0,300,1219,1,0,0,0,302,1223,1,0,0,0,304,1227,1,0, + 0,0,306,1231,1,0,0,0,308,1236,1,0,0,0,310,1240,1,0,0,0,312,1244,1,0,0,0, + 314,1248,1,0,0,0,316,1252,1,0,0,0,318,1256,1,0,0,0,320,1262,1,0,0,0,322, + 1266,1,0,0,0,324,1270,1,0,0,0,326,1274,1,0,0,0,328,1278,1,0,0,0,330,1282, + 1,0,0,0,332,1286,1,0,0,0,334,1291,1,0,0,0,336,1295,1,0,0,0,338,1299,1,0, + 0,0,340,1303,1,0,0,0,342,1307,1,0,0,0,344,1311,1,0,0,0,346,1315,1,0,0,0, + 348,1320,1,0,0,0,350,1325,1,0,0,0,352,1329,1,0,0,0,354,1333,1,0,0,0,356, + 1337,1,0,0,0,358,1342,1,0,0,0,360,1352,1,0,0,0,362,1356,1,0,0,0,364,1360, + 1,0,0,0,366,1364,1,0,0,0,368,1369,1,0,0,0,370,1376,1,0,0,0,372,1380,1,0, + 0,0,374,1384,1,0,0,0,376,1388,1,0,0,0,378,1392,1,0,0,0,380,1397,1,0,0,0, + 382,1403,1,0,0,0,384,1409,1,0,0,0,386,1413,1,0,0,0,388,1417,1,0,0,0,390, + 1421,1,0,0,0,392,1427,1,0,0,0,394,1433,1,0,0,0,396,1437,1,0,0,0,398,1441, + 1,0,0,0,400,1445,1,0,0,0,402,1451,1,0,0,0,404,1457,1,0,0,0,406,1463,1,0, + 0,0,408,409,7,0,0,0,409,410,7,1,0,0,410,411,7,2,0,0,411,412,7,2,0,0,412, + 413,7,3,0,0,413,414,7,4,0,0,414,415,7,5,0,0,415,416,1,0,0,0,416,417,6,0, + 0,0,417,17,1,0,0,0,418,419,7,0,0,0,419,420,7,6,0,0,420,421,7,7,0,0,421, + 422,7,8,0,0,422,423,1,0,0,0,423,424,6,1,1,0,424,19,1,0,0,0,425,426,7,3, + 0,0,426,427,7,9,0,0,427,428,7,6,0,0,428,429,7,1,0,0,429,430,7,4,0,0,430, + 431,7,10,0,0,431,432,1,0,0,0,432,433,6,2,2,0,433,21,1,0,0,0,434,435,7,3, + 0,0,435,436,7,11,0,0,436,437,7,12,0,0,437,438,7,13,0,0,438,439,1,0,0,0, + 439,440,6,3,0,0,440,23,1,0,0,0,441,442,7,3,0,0,442,443,7,14,0,0,443,444, + 7,8,0,0,444,445,7,13,0,0,445,446,7,12,0,0,446,447,7,1,0,0,447,448,7,9,0, + 0,448,449,1,0,0,0,449,450,6,4,3,0,450,25,1,0,0,0,451,452,7,15,0,0,452,453, + 7,6,0,0,453,454,7,7,0,0,454,455,7,16,0,0,455,456,1,0,0,0,456,457,6,5,4, + 0,457,27,1,0,0,0,458,459,7,17,0,0,459,460,7,6,0,0,460,461,7,7,0,0,461,462, + 7,18,0,0,462,463,1,0,0,0,463,464,6,6,0,0,464,29,1,0,0,0,465,466,7,1,0,0, + 466,467,7,9,0,0,467,468,7,13,0,0,468,469,7,1,0,0,469,470,7,9,0,0,470,471, + 7,3,0,0,471,472,7,2,0,0,472,473,7,5,0,0,473,474,7,12,0,0,474,475,7,5,0, + 0,475,476,7,2,0,0,476,477,1,0,0,0,477,478,6,7,0,0,478,31,1,0,0,0,479,480, + 7,18,0,0,480,481,7,3,0,0,481,482,7,3,0,0,482,483,7,8,0,0,483,484,1,0,0, + 0,484,485,6,8,1,0,485,33,1,0,0,0,486,487,7,13,0,0,487,488,7,1,0,0,488,489, + 7,16,0,0,489,490,7,1,0,0,490,491,7,5,0,0,491,492,1,0,0,0,492,493,6,9,0, + 0,493,35,1,0,0,0,494,495,7,13,0,0,495,496,7,7,0,0,496,497,7,7,0,0,497,498, + 7,18,0,0,498,499,7,19,0,0,499,500,7,8,0,0,500,501,1,0,0,0,501,502,6,10, + 5,0,502,37,1,0,0,0,503,504,7,16,0,0,504,505,7,3,0,0,505,506,7,5,0,0,506, + 507,7,12,0,0,507,508,1,0,0,0,508,509,6,11,6,0,509,39,1,0,0,0,510,511,7, + 16,0,0,511,512,7,3,0,0,512,513,7,5,0,0,513,514,7,6,0,0,514,515,7,1,0,0, + 515,516,7,4,0,0,516,517,7,2,0,0,517,518,1,0,0,0,518,519,6,12,7,0,519,41, + 1,0,0,0,520,521,7,16,0,0,521,522,7,11,0,0,522,523,5,95,0,0,523,524,7,3, + 0,0,524,525,7,14,0,0,525,526,7,8,0,0,526,527,7,12,0,0,527,528,7,9,0,0,528, + 529,7,0,0,0,529,530,1,0,0,0,530,531,6,13,8,0,531,43,1,0,0,0,532,533,7,6, + 0,0,533,534,7,3,0,0,534,535,7,9,0,0,535,536,7,12,0,0,536,537,7,16,0,0,537, + 538,7,3,0,0,538,539,1,0,0,0,539,540,6,14,9,0,540,45,1,0,0,0,541,542,7,6, + 0,0,542,543,7,7,0,0,543,544,7,20,0,0,544,545,1,0,0,0,545,546,6,15,0,0,546, + 47,1,0,0,0,547,548,7,2,0,0,548,549,7,10,0,0,549,550,7,7,0,0,550,551,7,20, + 0,0,551,552,1,0,0,0,552,553,6,16,10,0,553,49,1,0,0,0,554,555,7,2,0,0,555, + 556,7,7,0,0,556,557,7,6,0,0,557,558,7,5,0,0,558,559,1,0,0,0,559,560,6,17, + 0,0,560,51,1,0,0,0,561,562,7,2,0,0,562,563,7,5,0,0,563,564,7,12,0,0,564, + 565,7,5,0,0,565,566,7,2,0,0,566,567,1,0,0,0,567,568,6,18,0,0,568,53,1,0, + 0,0,569,570,7,20,0,0,570,571,7,10,0,0,571,572,7,3,0,0,572,573,7,6,0,0,573, + 574,7,3,0,0,574,575,1,0,0,0,575,576,6,19,0,0,576,55,1,0,0,0,577,578,7,16, + 0,0,578,579,7,12,0,0,579,580,7,5,0,0,580,581,7,4,0,0,581,582,7,10,0,0,582, + 583,1,0,0,0,583,584,6,20,0,0,584,57,1,0,0,0,585,587,8,21,0,0,586,585,1, + 0,0,0,587,588,1,0,0,0,588,586,1,0,0,0,588,589,1,0,0,0,589,590,1,0,0,0,590, + 591,6,21,0,0,591,59,1,0,0,0,592,593,5,47,0,0,593,594,5,47,0,0,594,598,1, + 0,0,0,595,597,8,22,0,0,596,595,1,0,0,0,597,600,1,0,0,0,598,596,1,0,0,0, + 598,599,1,0,0,0,599,602,1,0,0,0,600,598,1,0,0,0,601,603,5,13,0,0,602,601, + 1,0,0,0,602,603,1,0,0,0,603,605,1,0,0,0,604,606,5,10,0,0,605,604,1,0,0, + 0,605,606,1,0,0,0,606,607,1,0,0,0,607,608,6,22,11,0,608,61,1,0,0,0,609, + 610,5,47,0,0,610,611,5,42,0,0,611,616,1,0,0,0,612,615,3,62,23,0,613,615, + 9,0,0,0,614,612,1,0,0,0,614,613,1,0,0,0,615,618,1,0,0,0,616,617,1,0,0,0, + 616,614,1,0,0,0,617,619,1,0,0,0,618,616,1,0,0,0,619,620,5,42,0,0,620,621, + 5,47,0,0,621,622,1,0,0,0,622,623,6,23,11,0,623,63,1,0,0,0,624,626,7,23, + 0,0,625,624,1,0,0,0,626,627,1,0,0,0,627,625,1,0,0,0,627,628,1,0,0,0,628, + 629,1,0,0,0,629,630,6,24,11,0,630,65,1,0,0,0,631,635,8,24,0,0,632,633,5, + 47,0,0,633,635,8,25,0,0,634,631,1,0,0,0,634,632,1,0,0,0,635,67,1,0,0,0, + 636,638,3,66,25,0,637,636,1,0,0,0,638,639,1,0,0,0,639,637,1,0,0,0,639,640, + 1,0,0,0,640,69,1,0,0,0,641,642,3,182,83,0,642,643,1,0,0,0,643,644,6,27, + 12,0,644,645,6,27,13,0,645,71,1,0,0,0,646,647,3,80,32,0,647,648,1,0,0,0, + 648,649,6,28,14,0,649,650,6,28,15,0,650,73,1,0,0,0,651,652,3,64,24,0,652, + 653,1,0,0,0,653,654,6,29,11,0,654,75,1,0,0,0,655,656,3,60,22,0,656,657, + 1,0,0,0,657,658,6,30,11,0,658,77,1,0,0,0,659,660,3,62,23,0,660,661,1,0, + 0,0,661,662,6,31,11,0,662,79,1,0,0,0,663,664,5,124,0,0,664,665,1,0,0,0, + 665,666,6,32,15,0,666,81,1,0,0,0,667,668,7,26,0,0,668,83,1,0,0,0,669,670, + 7,27,0,0,670,85,1,0,0,0,671,672,5,92,0,0,672,673,7,28,0,0,673,87,1,0,0, + 0,674,675,8,29,0,0,675,89,1,0,0,0,676,678,7,3,0,0,677,679,7,30,0,0,678, + 677,1,0,0,0,678,679,1,0,0,0,679,681,1,0,0,0,680,682,3,82,33,0,681,680,1, + 0,0,0,682,683,1,0,0,0,683,681,1,0,0,0,683,684,1,0,0,0,684,91,1,0,0,0,685, + 686,5,64,0,0,686,93,1,0,0,0,687,688,5,96,0,0,688,95,1,0,0,0,689,693,8,31, + 0,0,690,691,5,96,0,0,691,693,5,96,0,0,692,689,1,0,0,0,692,690,1,0,0,0,693, + 97,1,0,0,0,694,695,5,95,0,0,695,99,1,0,0,0,696,700,3,84,34,0,697,700,3, + 82,33,0,698,700,3,98,41,0,699,696,1,0,0,0,699,697,1,0,0,0,699,698,1,0,0, + 0,700,101,1,0,0,0,701,706,5,34,0,0,702,705,3,86,35,0,703,705,3,88,36,0, + 704,702,1,0,0,0,704,703,1,0,0,0,705,708,1,0,0,0,706,704,1,0,0,0,706,707, + 1,0,0,0,707,709,1,0,0,0,708,706,1,0,0,0,709,731,5,34,0,0,710,711,5,34,0, + 0,711,712,5,34,0,0,712,713,5,34,0,0,713,717,1,0,0,0,714,716,8,22,0,0,715, + 714,1,0,0,0,716,719,1,0,0,0,717,718,1,0,0,0,717,715,1,0,0,0,718,720,1,0, + 0,0,719,717,1,0,0,0,720,721,5,34,0,0,721,722,5,34,0,0,722,723,5,34,0,0, + 723,725,1,0,0,0,724,726,5,34,0,0,725,724,1,0,0,0,725,726,1,0,0,0,726,728, + 1,0,0,0,727,729,5,34,0,0,728,727,1,0,0,0,728,729,1,0,0,0,729,731,1,0,0, + 0,730,701,1,0,0,0,730,710,1,0,0,0,731,103,1,0,0,0,732,734,3,82,33,0,733, + 732,1,0,0,0,734,735,1,0,0,0,735,733,1,0,0,0,735,736,1,0,0,0,736,105,1,0, + 0,0,737,739,3,82,33,0,738,737,1,0,0,0,739,740,1,0,0,0,740,738,1,0,0,0,740, + 741,1,0,0,0,741,742,1,0,0,0,742,746,3,122,53,0,743,745,3,82,33,0,744,743, + 1,0,0,0,745,748,1,0,0,0,746,744,1,0,0,0,746,747,1,0,0,0,747,780,1,0,0,0, + 748,746,1,0,0,0,749,751,3,122,53,0,750,752,3,82,33,0,751,750,1,0,0,0,752, + 753,1,0,0,0,753,751,1,0,0,0,753,754,1,0,0,0,754,780,1,0,0,0,755,757,3,82, + 33,0,756,755,1,0,0,0,757,758,1,0,0,0,758,756,1,0,0,0,758,759,1,0,0,0,759, + 767,1,0,0,0,760,764,3,122,53,0,761,763,3,82,33,0,762,761,1,0,0,0,763,766, + 1,0,0,0,764,762,1,0,0,0,764,765,1,0,0,0,765,768,1,0,0,0,766,764,1,0,0,0, + 767,760,1,0,0,0,767,768,1,0,0,0,768,769,1,0,0,0,769,770,3,90,37,0,770,780, + 1,0,0,0,771,773,3,122,53,0,772,774,3,82,33,0,773,772,1,0,0,0,774,775,1, + 0,0,0,775,773,1,0,0,0,775,776,1,0,0,0,776,777,1,0,0,0,777,778,3,90,37,0, + 778,780,1,0,0,0,779,738,1,0,0,0,779,749,1,0,0,0,779,756,1,0,0,0,779,771, + 1,0,0,0,780,107,1,0,0,0,781,782,7,32,0,0,782,783,7,33,0,0,783,109,1,0,0, + 0,784,785,7,12,0,0,785,786,7,9,0,0,786,787,7,0,0,0,787,111,1,0,0,0,788, + 789,7,12,0,0,789,790,7,2,0,0,790,791,7,4,0,0,791,113,1,0,0,0,792,793,5, + 61,0,0,793,115,1,0,0,0,794,795,5,58,0,0,795,796,5,58,0,0,796,117,1,0,0, + 0,797,798,5,44,0,0,798,119,1,0,0,0,799,800,7,0,0,0,800,801,7,3,0,0,801, + 802,7,2,0,0,802,803,7,4,0,0,803,121,1,0,0,0,804,805,5,46,0,0,805,123,1, + 0,0,0,806,807,7,15,0,0,807,808,7,12,0,0,808,809,7,13,0,0,809,810,7,2,0, + 0,810,811,7,3,0,0,811,125,1,0,0,0,812,813,7,15,0,0,813,814,7,1,0,0,814, + 815,7,6,0,0,815,816,7,2,0,0,816,817,7,5,0,0,817,127,1,0,0,0,818,819,7,1, + 0,0,819,820,7,9,0,0,820,129,1,0,0,0,821,822,7,1,0,0,822,823,7,2,0,0,823, + 131,1,0,0,0,824,825,7,13,0,0,825,826,7,12,0,0,826,827,7,2,0,0,827,828,7, + 5,0,0,828,133,1,0,0,0,829,830,7,13,0,0,830,831,7,1,0,0,831,832,7,18,0,0, + 832,833,7,3,0,0,833,135,1,0,0,0,834,835,5,40,0,0,835,137,1,0,0,0,836,837, + 7,16,0,0,837,838,7,12,0,0,838,839,7,5,0,0,839,840,7,4,0,0,840,841,7,10, + 0,0,841,139,1,0,0,0,842,843,7,9,0,0,843,844,7,7,0,0,844,845,7,5,0,0,845, + 141,1,0,0,0,846,847,7,9,0,0,847,848,7,19,0,0,848,849,7,13,0,0,849,850,7, + 13,0,0,850,143,1,0,0,0,851,852,7,9,0,0,852,853,7,19,0,0,853,854,7,13,0, + 0,854,855,7,13,0,0,855,856,7,2,0,0,856,145,1,0,0,0,857,858,7,7,0,0,858, + 859,7,6,0,0,859,147,1,0,0,0,860,861,5,63,0,0,861,149,1,0,0,0,862,863,7, + 6,0,0,863,864,7,13,0,0,864,865,7,1,0,0,865,866,7,18,0,0,866,867,7,3,0,0, + 867,151,1,0,0,0,868,869,5,41,0,0,869,153,1,0,0,0,870,871,7,5,0,0,871,872, + 7,6,0,0,872,873,7,19,0,0,873,874,7,3,0,0,874,155,1,0,0,0,875,876,5,61,0, + 0,876,877,5,61,0,0,877,157,1,0,0,0,878,879,5,61,0,0,879,880,5,126,0,0,880, + 159,1,0,0,0,881,882,5,33,0,0,882,883,5,61,0,0,883,161,1,0,0,0,884,885,5, + 60,0,0,885,163,1,0,0,0,886,887,5,60,0,0,887,888,5,61,0,0,888,165,1,0,0, + 0,889,890,5,62,0,0,890,167,1,0,0,0,891,892,5,62,0,0,892,893,5,61,0,0,893, + 169,1,0,0,0,894,895,5,43,0,0,895,171,1,0,0,0,896,897,5,45,0,0,897,173,1, + 0,0,0,898,899,5,42,0,0,899,175,1,0,0,0,900,901,5,47,0,0,901,177,1,0,0,0, + 902,903,5,37,0,0,903,179,1,0,0,0,904,905,3,148,66,0,905,909,3,84,34,0,906, + 908,3,100,42,0,907,906,1,0,0,0,908,911,1,0,0,0,909,907,1,0,0,0,909,910, + 1,0,0,0,910,919,1,0,0,0,911,909,1,0,0,0,912,914,3,148,66,0,913,915,3,82, + 33,0,914,913,1,0,0,0,915,916,1,0,0,0,916,914,1,0,0,0,916,917,1,0,0,0,917, + 919,1,0,0,0,918,904,1,0,0,0,918,912,1,0,0,0,919,181,1,0,0,0,920,921,5,91, + 0,0,921,922,1,0,0,0,922,923,6,83,0,0,923,924,6,83,0,0,924,183,1,0,0,0,925, + 926,5,93,0,0,926,927,1,0,0,0,927,928,6,84,15,0,928,929,6,84,15,0,929,185, + 1,0,0,0,930,934,3,84,34,0,931,933,3,100,42,0,932,931,1,0,0,0,933,936,1, + 0,0,0,934,932,1,0,0,0,934,935,1,0,0,0,935,947,1,0,0,0,936,934,1,0,0,0,937, + 940,3,98,41,0,938,940,3,92,38,0,939,937,1,0,0,0,939,938,1,0,0,0,940,942, + 1,0,0,0,941,943,3,100,42,0,942,941,1,0,0,0,943,944,1,0,0,0,944,942,1,0, + 0,0,944,945,1,0,0,0,945,947,1,0,0,0,946,930,1,0,0,0,946,939,1,0,0,0,947, + 187,1,0,0,0,948,950,3,94,39,0,949,951,3,96,40,0,950,949,1,0,0,0,951,952, + 1,0,0,0,952,950,1,0,0,0,952,953,1,0,0,0,953,954,1,0,0,0,954,955,3,94,39, + 0,955,189,1,0,0,0,956,957,3,188,86,0,957,191,1,0,0,0,958,959,3,60,22,0, + 959,960,1,0,0,0,960,961,6,88,11,0,961,193,1,0,0,0,962,963,3,62,23,0,963, + 964,1,0,0,0,964,965,6,89,11,0,965,195,1,0,0,0,966,967,3,64,24,0,967,968, + 1,0,0,0,968,969,6,90,11,0,969,197,1,0,0,0,970,971,3,80,32,0,971,972,1,0, + 0,0,972,973,6,91,14,0,973,974,6,91,15,0,974,199,1,0,0,0,975,976,3,182,83, + 0,976,977,1,0,0,0,977,978,6,92,12,0,978,201,1,0,0,0,979,980,3,184,84,0, + 980,981,1,0,0,0,981,982,6,93,16,0,982,203,1,0,0,0,983,984,3,368,176,0,984, + 985,1,0,0,0,985,986,6,94,17,0,986,205,1,0,0,0,987,988,3,118,51,0,988,989, + 1,0,0,0,989,990,6,95,18,0,990,207,1,0,0,0,991,992,3,114,49,0,992,993,1, + 0,0,0,993,994,6,96,19,0,994,209,1,0,0,0,995,996,7,16,0,0,996,997,7,3,0, + 0,997,998,7,5,0,0,998,999,7,12,0,0,999,1000,7,0,0,0,1000,1001,7,12,0,0, + 1001,1002,7,5,0,0,1002,1003,7,12,0,0,1003,211,1,0,0,0,1004,1005,3,68,26, + 0,1005,1006,1,0,0,0,1006,1007,6,98,20,0,1007,213,1,0,0,0,1008,1009,3,102, + 43,0,1009,1010,1,0,0,0,1010,1011,6,99,21,0,1011,215,1,0,0,0,1012,1013,3, + 60,22,0,1013,1014,1,0,0,0,1014,1015,6,100,11,0,1015,217,1,0,0,0,1016,1017, + 3,62,23,0,1017,1018,1,0,0,0,1018,1019,6,101,11,0,1019,219,1,0,0,0,1020, + 1021,3,64,24,0,1021,1022,1,0,0,0,1022,1023,6,102,11,0,1023,221,1,0,0,0, + 1024,1025,3,80,32,0,1025,1026,1,0,0,0,1026,1027,6,103,14,0,1027,1028,6, + 103,15,0,1028,223,1,0,0,0,1029,1030,3,122,53,0,1030,1031,1,0,0,0,1031,1032, + 6,104,22,0,1032,225,1,0,0,0,1033,1034,3,118,51,0,1034,1035,1,0,0,0,1035, + 1036,6,105,18,0,1036,227,1,0,0,0,1037,1042,3,84,34,0,1038,1042,3,82,33, + 0,1039,1042,3,98,41,0,1040,1042,3,174,79,0,1041,1037,1,0,0,0,1041,1038, + 1,0,0,0,1041,1039,1,0,0,0,1041,1040,1,0,0,0,1042,229,1,0,0,0,1043,1046, + 3,84,34,0,1044,1046,3,174,79,0,1045,1043,1,0,0,0,1045,1044,1,0,0,0,1046, + 1050,1,0,0,0,1047,1049,3,228,106,0,1048,1047,1,0,0,0,1049,1052,1,0,0,0, + 1050,1048,1,0,0,0,1050,1051,1,0,0,0,1051,1063,1,0,0,0,1052,1050,1,0,0,0, + 1053,1056,3,98,41,0,1054,1056,3,92,38,0,1055,1053,1,0,0,0,1055,1054,1,0, + 0,0,1056,1058,1,0,0,0,1057,1059,3,228,106,0,1058,1057,1,0,0,0,1059,1060, + 1,0,0,0,1060,1058,1,0,0,0,1060,1061,1,0,0,0,1061,1063,1,0,0,0,1062,1045, + 1,0,0,0,1062,1055,1,0,0,0,1063,231,1,0,0,0,1064,1067,3,230,107,0,1065,1067, + 3,188,86,0,1066,1064,1,0,0,0,1066,1065,1,0,0,0,1067,1068,1,0,0,0,1068,1066, + 1,0,0,0,1068,1069,1,0,0,0,1069,233,1,0,0,0,1070,1071,3,60,22,0,1071,1072, + 1,0,0,0,1072,1073,6,109,11,0,1073,235,1,0,0,0,1074,1075,3,62,23,0,1075, + 1076,1,0,0,0,1076,1077,6,110,11,0,1077,237,1,0,0,0,1078,1079,3,64,24,0, + 1079,1080,1,0,0,0,1080,1081,6,111,11,0,1081,239,1,0,0,0,1082,1083,3,80, + 32,0,1083,1084,1,0,0,0,1084,1085,6,112,14,0,1085,1086,6,112,15,0,1086,241, + 1,0,0,0,1087,1088,3,114,49,0,1088,1089,1,0,0,0,1089,1090,6,113,19,0,1090, + 243,1,0,0,0,1091,1092,3,118,51,0,1092,1093,1,0,0,0,1093,1094,6,114,18,0, + 1094,245,1,0,0,0,1095,1096,3,122,53,0,1096,1097,1,0,0,0,1097,1098,6,115, + 22,0,1098,247,1,0,0,0,1099,1100,7,12,0,0,1100,1101,7,2,0,0,1101,249,1,0, + 0,0,1102,1103,3,232,108,0,1103,1104,1,0,0,0,1104,1105,6,117,23,0,1105,251, + 1,0,0,0,1106,1107,3,60,22,0,1107,1108,1,0,0,0,1108,1109,6,118,11,0,1109, + 253,1,0,0,0,1110,1111,3,62,23,0,1111,1112,1,0,0,0,1112,1113,6,119,11,0, + 1113,255,1,0,0,0,1114,1115,3,64,24,0,1115,1116,1,0,0,0,1116,1117,6,120, + 11,0,1117,257,1,0,0,0,1118,1119,3,80,32,0,1119,1120,1,0,0,0,1120,1121,6, + 121,14,0,1121,1122,6,121,15,0,1122,259,1,0,0,0,1123,1124,3,182,83,0,1124, + 1125,1,0,0,0,1125,1126,6,122,12,0,1126,1127,6,122,24,0,1127,261,1,0,0,0, + 1128,1129,7,7,0,0,1129,1130,7,9,0,0,1130,1131,1,0,0,0,1131,1132,6,123,25, + 0,1132,263,1,0,0,0,1133,1134,7,20,0,0,1134,1135,7,1,0,0,1135,1136,7,5,0, + 0,1136,1137,7,10,0,0,1137,1138,1,0,0,0,1138,1139,6,124,25,0,1139,265,1, + 0,0,0,1140,1141,8,34,0,0,1141,267,1,0,0,0,1142,1144,3,266,125,0,1143,1142, + 1,0,0,0,1144,1145,1,0,0,0,1145,1143,1,0,0,0,1145,1146,1,0,0,0,1146,1147, + 1,0,0,0,1147,1148,3,368,176,0,1148,1150,1,0,0,0,1149,1143,1,0,0,0,1149, + 1150,1,0,0,0,1150,1152,1,0,0,0,1151,1153,3,266,125,0,1152,1151,1,0,0,0, + 1153,1154,1,0,0,0,1154,1152,1,0,0,0,1154,1155,1,0,0,0,1155,269,1,0,0,0, + 1156,1157,3,268,126,0,1157,1158,1,0,0,0,1158,1159,6,127,26,0,1159,271,1, + 0,0,0,1160,1161,3,60,22,0,1161,1162,1,0,0,0,1162,1163,6,128,11,0,1163,273, + 1,0,0,0,1164,1165,3,62,23,0,1165,1166,1,0,0,0,1166,1167,6,129,11,0,1167, + 275,1,0,0,0,1168,1169,3,64,24,0,1169,1170,1,0,0,0,1170,1171,6,130,11,0, + 1171,277,1,0,0,0,1172,1173,3,80,32,0,1173,1174,1,0,0,0,1174,1175,6,131, + 14,0,1175,1176,6,131,15,0,1176,1177,6,131,15,0,1177,279,1,0,0,0,1178,1179, + 3,114,49,0,1179,1180,1,0,0,0,1180,1181,6,132,19,0,1181,281,1,0,0,0,1182, + 1183,3,118,51,0,1183,1184,1,0,0,0,1184,1185,6,133,18,0,1185,283,1,0,0,0, + 1186,1187,3,122,53,0,1187,1188,1,0,0,0,1188,1189,6,134,22,0,1189,285,1, + 0,0,0,1190,1191,3,264,124,0,1191,1192,1,0,0,0,1192,1193,6,135,27,0,1193, + 287,1,0,0,0,1194,1195,3,232,108,0,1195,1196,1,0,0,0,1196,1197,6,136,23, + 0,1197,289,1,0,0,0,1198,1199,3,190,87,0,1199,1200,1,0,0,0,1200,1201,6,137, + 28,0,1201,291,1,0,0,0,1202,1203,3,60,22,0,1203,1204,1,0,0,0,1204,1205,6, + 138,11,0,1205,293,1,0,0,0,1206,1207,3,62,23,0,1207,1208,1,0,0,0,1208,1209, + 6,139,11,0,1209,295,1,0,0,0,1210,1211,3,64,24,0,1211,1212,1,0,0,0,1212, + 1213,6,140,11,0,1213,297,1,0,0,0,1214,1215,3,80,32,0,1215,1216,1,0,0,0, + 1216,1217,6,141,14,0,1217,1218,6,141,15,0,1218,299,1,0,0,0,1219,1220,3, + 368,176,0,1220,1221,1,0,0,0,1221,1222,6,142,17,0,1222,301,1,0,0,0,1223, + 1224,3,118,51,0,1224,1225,1,0,0,0,1225,1226,6,143,18,0,1226,303,1,0,0,0, + 1227,1228,3,122,53,0,1228,1229,1,0,0,0,1229,1230,6,144,22,0,1230,305,1, + 0,0,0,1231,1232,3,262,123,0,1232,1233,1,0,0,0,1233,1234,6,145,29,0,1234, + 1235,6,145,30,0,1235,307,1,0,0,0,1236,1237,3,68,26,0,1237,1238,1,0,0,0, + 1238,1239,6,146,20,0,1239,309,1,0,0,0,1240,1241,3,102,43,0,1241,1242,1, + 0,0,0,1242,1243,6,147,21,0,1243,311,1,0,0,0,1244,1245,3,60,22,0,1245,1246, + 1,0,0,0,1246,1247,6,148,11,0,1247,313,1,0,0,0,1248,1249,3,62,23,0,1249, + 1250,1,0,0,0,1250,1251,6,149,11,0,1251,315,1,0,0,0,1252,1253,3,64,24,0, + 1253,1254,1,0,0,0,1254,1255,6,150,11,0,1255,317,1,0,0,0,1256,1257,3,80, + 32,0,1257,1258,1,0,0,0,1258,1259,6,151,14,0,1259,1260,6,151,15,0,1260,1261, + 6,151,15,0,1261,319,1,0,0,0,1262,1263,3,118,51,0,1263,1264,1,0,0,0,1264, + 1265,6,152,18,0,1265,321,1,0,0,0,1266,1267,3,122,53,0,1267,1268,1,0,0,0, + 1268,1269,6,153,22,0,1269,323,1,0,0,0,1270,1271,3,232,108,0,1271,1272,1, + 0,0,0,1272,1273,6,154,23,0,1273,325,1,0,0,0,1274,1275,3,60,22,0,1275,1276, + 1,0,0,0,1276,1277,6,155,11,0,1277,327,1,0,0,0,1278,1279,3,62,23,0,1279, + 1280,1,0,0,0,1280,1281,6,156,11,0,1281,329,1,0,0,0,1282,1283,3,64,24,0, + 1283,1284,1,0,0,0,1284,1285,6,157,11,0,1285,331,1,0,0,0,1286,1287,3,80, + 32,0,1287,1288,1,0,0,0,1288,1289,6,158,14,0,1289,1290,6,158,15,0,1290,333, + 1,0,0,0,1291,1292,3,122,53,0,1292,1293,1,0,0,0,1293,1294,6,159,22,0,1294, + 335,1,0,0,0,1295,1296,3,190,87,0,1296,1297,1,0,0,0,1297,1298,6,160,28,0, + 1298,337,1,0,0,0,1299,1300,3,186,85,0,1300,1301,1,0,0,0,1301,1302,6,161, + 31,0,1302,339,1,0,0,0,1303,1304,3,60,22,0,1304,1305,1,0,0,0,1305,1306,6, + 162,11,0,1306,341,1,0,0,0,1307,1308,3,62,23,0,1308,1309,1,0,0,0,1309,1310, + 6,163,11,0,1310,343,1,0,0,0,1311,1312,3,64,24,0,1312,1313,1,0,0,0,1313, + 1314,6,164,11,0,1314,345,1,0,0,0,1315,1316,3,80,32,0,1316,1317,1,0,0,0, + 1317,1318,6,165,14,0,1318,1319,6,165,15,0,1319,347,1,0,0,0,1320,1321,7, + 1,0,0,1321,1322,7,9,0,0,1322,1323,7,15,0,0,1323,1324,7,7,0,0,1324,349,1, + 0,0,0,1325,1326,3,60,22,0,1326,1327,1,0,0,0,1327,1328,6,167,11,0,1328,351, + 1,0,0,0,1329,1330,3,62,23,0,1330,1331,1,0,0,0,1331,1332,6,168,11,0,1332, + 353,1,0,0,0,1333,1334,3,64,24,0,1334,1335,1,0,0,0,1335,1336,6,169,11,0, + 1336,355,1,0,0,0,1337,1338,3,80,32,0,1338,1339,1,0,0,0,1339,1340,6,170, + 14,0,1340,1341,6,170,15,0,1341,357,1,0,0,0,1342,1343,7,15,0,0,1343,1344, + 7,19,0,0,1344,1345,7,9,0,0,1345,1346,7,4,0,0,1346,1347,7,5,0,0,1347,1348, + 7,1,0,0,1348,1349,7,7,0,0,1349,1350,7,9,0,0,1350,1351,7,2,0,0,1351,359, + 1,0,0,0,1352,1353,3,60,22,0,1353,1354,1,0,0,0,1354,1355,6,172,11,0,1355, + 361,1,0,0,0,1356,1357,3,62,23,0,1357,1358,1,0,0,0,1358,1359,6,173,11,0, + 1359,363,1,0,0,0,1360,1361,3,64,24,0,1361,1362,1,0,0,0,1362,1363,6,174, + 11,0,1363,365,1,0,0,0,1364,1365,3,184,84,0,1365,1366,1,0,0,0,1366,1367, + 6,175,16,0,1367,1368,6,175,15,0,1368,367,1,0,0,0,1369,1370,5,58,0,0,1370, + 369,1,0,0,0,1371,1377,3,92,38,0,1372,1377,3,82,33,0,1373,1377,3,122,53, + 0,1374,1377,3,84,34,0,1375,1377,3,98,41,0,1376,1371,1,0,0,0,1376,1372,1, + 0,0,0,1376,1373,1,0,0,0,1376,1374,1,0,0,0,1376,1375,1,0,0,0,1377,1378,1, + 0,0,0,1378,1376,1,0,0,0,1378,1379,1,0,0,0,1379,371,1,0,0,0,1380,1381,3, + 60,22,0,1381,1382,1,0,0,0,1382,1383,6,178,11,0,1383,373,1,0,0,0,1384,1385, + 3,62,23,0,1385,1386,1,0,0,0,1386,1387,6,179,11,0,1387,375,1,0,0,0,1388, + 1389,3,64,24,0,1389,1390,1,0,0,0,1390,1391,6,180,11,0,1391,377,1,0,0,0, + 1392,1393,3,80,32,0,1393,1394,1,0,0,0,1394,1395,6,181,14,0,1395,1396,6, + 181,15,0,1396,379,1,0,0,0,1397,1398,3,68,26,0,1398,1399,1,0,0,0,1399,1400, + 6,182,20,0,1400,1401,6,182,15,0,1401,1402,6,182,32,0,1402,381,1,0,0,0,1403, + 1404,3,102,43,0,1404,1405,1,0,0,0,1405,1406,6,183,21,0,1406,1407,6,183, + 15,0,1407,1408,6,183,32,0,1408,383,1,0,0,0,1409,1410,3,60,22,0,1410,1411, + 1,0,0,0,1411,1412,6,184,11,0,1412,385,1,0,0,0,1413,1414,3,62,23,0,1414, + 1415,1,0,0,0,1415,1416,6,185,11,0,1416,387,1,0,0,0,1417,1418,3,64,24,0, + 1418,1419,1,0,0,0,1419,1420,6,186,11,0,1420,389,1,0,0,0,1421,1422,3,368, + 176,0,1422,1423,1,0,0,0,1423,1424,6,187,17,0,1424,1425,6,187,15,0,1425, + 1426,6,187,7,0,1426,391,1,0,0,0,1427,1428,3,118,51,0,1428,1429,1,0,0,0, + 1429,1430,6,188,18,0,1430,1431,6,188,15,0,1431,1432,6,188,7,0,1432,393, + 1,0,0,0,1433,1434,3,60,22,0,1434,1435,1,0,0,0,1435,1436,6,189,11,0,1436, + 395,1,0,0,0,1437,1438,3,62,23,0,1438,1439,1,0,0,0,1439,1440,6,190,11,0, + 1440,397,1,0,0,0,1441,1442,3,64,24,0,1442,1443,1,0,0,0,1443,1444,6,191, + 11,0,1444,399,1,0,0,0,1445,1446,3,190,87,0,1446,1447,1,0,0,0,1447,1448, + 6,192,15,0,1448,1449,6,192,0,0,1449,1450,6,192,28,0,1450,401,1,0,0,0,1451, + 1452,3,186,85,0,1452,1453,1,0,0,0,1453,1454,6,193,15,0,1454,1455,6,193, + 0,0,1455,1456,6,193,31,0,1456,403,1,0,0,0,1457,1458,3,108,46,0,1458,1459, + 1,0,0,0,1459,1460,6,194,15,0,1460,1461,6,194,0,0,1461,1462,6,194,33,0,1462, + 405,1,0,0,0,1463,1464,3,80,32,0,1464,1465,1,0,0,0,1465,1466,6,195,14,0, + 1466,1467,6,195,15,0,1467,407,1,0,0,0,65,0,1,2,3,4,5,6,7,8,9,10,11,12,13, + 14,15,588,598,602,605,614,616,627,634,639,678,683,692,699,704,706,717,725, + 728,730,735,740,746,753,758,764,767,775,779,909,916,918,934,939,944,946, + 952,1041,1045,1050,1055,1060,1062,1066,1068,1145,1149,1154,1376,1378,34, + 5,2,0,5,4,0,5,6,0,5,1,0,5,3,0,5,8,0,5,12,0,5,14,0,5,10,0,5,5,0,5,11,0,0, + 1,0,7,71,0,5,0,0,7,30,0,4,0,0,7,72,0,7,116,0,7,39,0,7,37,0,7,26,0,7,31, + 0,7,41,0,7,82,0,5,13,0,5,7,0,7,92,0,7,91,0,7,74,0,7,90,0,5,9,0,7,73,0,5, + 15,0,7,34,0]; private static __ATN: ATN; public static get _ATN(): ATN { diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.g4 b/packages/kbn-esql-ast/src/antlr/esql_parser.g4 index 5d243a504386c..d7e78ceda4578 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.g4 +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.g4 @@ -52,6 +52,7 @@ processingCommand | grokCommand | enrichCommand | mvExpandCommand + | matchCommand ; whereCommand @@ -75,7 +76,7 @@ regexBooleanExpression ; matchBooleanExpression - : qualifiedName MATCH queryString=string + : qualifiedName MATCH_OPERATOR queryString=string ; valueExpression @@ -305,4 +306,12 @@ enrichWithClause lookupCommand : LOOKUP tableName=indexPattern ON matchFields=qualifiedNamePatterns + ; + +matchCommand + : MATCH matchQuery + ; + +matchQuery + : QUOTED_STRING ; \ No newline at end of file diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.interp b/packages/kbn-esql-ast/src/antlr/esql_parser.interp index b52db660b55ee..f415b4fce3170 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.interp +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.interp @@ -28,6 +28,7 @@ null null null null +null '|' null null @@ -47,7 +48,7 @@ null 'last' 'like' '(' -'match' +null 'not' 'null' 'nulls' @@ -148,6 +149,7 @@ SHOW SORT STATS WHERE +MATCH UNKNOWN_CMD LINE_COMMENT MULTILINE_COMMENT @@ -175,7 +177,7 @@ IS LAST LIKE LP -MATCH +MATCH_OPERATOR NOT NULL NULLS @@ -314,7 +316,9 @@ metaCommand enrichCommand enrichWithClause lookupCommand +matchCommand +matchQuery atn: -[4, 1, 125, 574, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 128, 8, 1, 10, 1, 12, 1, 131, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 139, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 155, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 168, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 175, 8, 5, 10, 5, 12, 5, 178, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 185, 8, 5, 1, 5, 1, 5, 3, 5, 189, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 197, 8, 5, 10, 5, 12, 5, 200, 9, 5, 1, 6, 1, 6, 3, 6, 204, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 211, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 216, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 227, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 233, 8, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 241, 8, 9, 10, 9, 12, 9, 244, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 254, 8, 10, 1, 10, 1, 10, 1, 10, 5, 10, 259, 8, 10, 10, 10, 12, 10, 262, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 270, 8, 11, 10, 11, 12, 11, 273, 9, 11, 3, 11, 275, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 5, 14, 287, 8, 14, 10, 14, 12, 14, 290, 9, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 297, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 303, 8, 16, 10, 16, 12, 16, 306, 9, 16, 1, 16, 3, 16, 309, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 316, 8, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 3, 20, 324, 8, 20, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 330, 8, 21, 10, 21, 12, 21, 333, 9, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 343, 8, 23, 10, 23, 12, 23, 346, 9, 23, 1, 23, 3, 23, 349, 8, 23, 1, 23, 1, 23, 3, 23, 353, 8, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 360, 8, 25, 1, 25, 1, 25, 3, 25, 364, 8, 25, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 370, 8, 26, 1, 27, 1, 27, 1, 27, 5, 27, 375, 8, 27, 10, 27, 12, 27, 378, 9, 27, 1, 28, 1, 28, 1, 28, 5, 28, 383, 8, 28, 10, 28, 12, 28, 386, 9, 28, 1, 29, 1, 29, 1, 29, 5, 29, 391, 8, 29, 10, 29, 12, 29, 394, 9, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 413, 8, 32, 10, 32, 12, 32, 416, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 424, 8, 32, 10, 32, 12, 32, 427, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 435, 8, 32, 10, 32, 12, 32, 438, 9, 32, 1, 32, 1, 32, 3, 32, 442, 8, 32, 1, 33, 1, 33, 3, 33, 446, 8, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 455, 8, 35, 10, 35, 12, 35, 458, 9, 35, 1, 36, 1, 36, 3, 36, 462, 8, 36, 1, 36, 1, 36, 3, 36, 466, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 478, 8, 39, 10, 39, 12, 39, 481, 9, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 491, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 5, 44, 503, 8, 44, 10, 44, 12, 44, 506, 9, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 516, 8, 47, 1, 48, 3, 48, 519, 8, 48, 1, 48, 1, 48, 1, 49, 3, 49, 524, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 549, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 555, 8, 56, 10, 56, 12, 56, 558, 9, 56, 3, 56, 560, 8, 56, 1, 57, 1, 57, 1, 57, 3, 57, 565, 8, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 0, 4, 2, 10, 18, 20, 59, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 0, 8, 1, 0, 64, 65, 1, 0, 66, 68, 2, 0, 25, 25, 30, 30, 1, 0, 72, 73, 2, 0, 35, 35, 39, 39, 2, 0, 42, 42, 45, 45, 2, 0, 41, 41, 56, 56, 2, 0, 57, 57, 59, 63, 599, 0, 118, 1, 0, 0, 0, 2, 121, 1, 0, 0, 0, 4, 138, 1, 0, 0, 0, 6, 154, 1, 0, 0, 0, 8, 156, 1, 0, 0, 0, 10, 188, 1, 0, 0, 0, 12, 215, 1, 0, 0, 0, 14, 217, 1, 0, 0, 0, 16, 226, 1, 0, 0, 0, 18, 232, 1, 0, 0, 0, 20, 253, 1, 0, 0, 0, 22, 263, 1, 0, 0, 0, 24, 278, 1, 0, 0, 0, 26, 280, 1, 0, 0, 0, 28, 283, 1, 0, 0, 0, 30, 296, 1, 0, 0, 0, 32, 298, 1, 0, 0, 0, 34, 315, 1, 0, 0, 0, 36, 317, 1, 0, 0, 0, 38, 319, 1, 0, 0, 0, 40, 323, 1, 0, 0, 0, 42, 325, 1, 0, 0, 0, 44, 334, 1, 0, 0, 0, 46, 338, 1, 0, 0, 0, 48, 354, 1, 0, 0, 0, 50, 357, 1, 0, 0, 0, 52, 365, 1, 0, 0, 0, 54, 371, 1, 0, 0, 0, 56, 379, 1, 0, 0, 0, 58, 387, 1, 0, 0, 0, 60, 395, 1, 0, 0, 0, 62, 397, 1, 0, 0, 0, 64, 441, 1, 0, 0, 0, 66, 445, 1, 0, 0, 0, 68, 447, 1, 0, 0, 0, 70, 450, 1, 0, 0, 0, 72, 459, 1, 0, 0, 0, 74, 467, 1, 0, 0, 0, 76, 470, 1, 0, 0, 0, 78, 473, 1, 0, 0, 0, 80, 482, 1, 0, 0, 0, 82, 486, 1, 0, 0, 0, 84, 492, 1, 0, 0, 0, 86, 496, 1, 0, 0, 0, 88, 499, 1, 0, 0, 0, 90, 507, 1, 0, 0, 0, 92, 511, 1, 0, 0, 0, 94, 515, 1, 0, 0, 0, 96, 518, 1, 0, 0, 0, 98, 523, 1, 0, 0, 0, 100, 527, 1, 0, 0, 0, 102, 529, 1, 0, 0, 0, 104, 531, 1, 0, 0, 0, 106, 534, 1, 0, 0, 0, 108, 538, 1, 0, 0, 0, 110, 541, 1, 0, 0, 0, 112, 544, 1, 0, 0, 0, 114, 564, 1, 0, 0, 0, 116, 568, 1, 0, 0, 0, 118, 119, 3, 2, 1, 0, 119, 120, 5, 0, 0, 1, 120, 1, 1, 0, 0, 0, 121, 122, 6, 1, -1, 0, 122, 123, 3, 4, 2, 0, 123, 129, 1, 0, 0, 0, 124, 125, 10, 1, 0, 0, 125, 126, 5, 29, 0, 0, 126, 128, 3, 6, 3, 0, 127, 124, 1, 0, 0, 0, 128, 131, 1, 0, 0, 0, 129, 127, 1, 0, 0, 0, 129, 130, 1, 0, 0, 0, 130, 3, 1, 0, 0, 0, 131, 129, 1, 0, 0, 0, 132, 139, 3, 104, 52, 0, 133, 139, 3, 32, 16, 0, 134, 139, 3, 26, 13, 0, 135, 139, 3, 46, 23, 0, 136, 139, 3, 108, 54, 0, 137, 139, 3, 110, 55, 0, 138, 132, 1, 0, 0, 0, 138, 133, 1, 0, 0, 0, 138, 134, 1, 0, 0, 0, 138, 135, 1, 0, 0, 0, 138, 136, 1, 0, 0, 0, 138, 137, 1, 0, 0, 0, 139, 5, 1, 0, 0, 0, 140, 155, 3, 48, 24, 0, 141, 155, 3, 52, 26, 0, 142, 155, 3, 68, 34, 0, 143, 155, 3, 116, 58, 0, 144, 155, 3, 74, 37, 0, 145, 155, 3, 70, 35, 0, 146, 155, 3, 50, 25, 0, 147, 155, 3, 8, 4, 0, 148, 155, 3, 76, 38, 0, 149, 155, 3, 78, 39, 0, 150, 155, 3, 82, 41, 0, 151, 155, 3, 84, 42, 0, 152, 155, 3, 112, 56, 0, 153, 155, 3, 86, 43, 0, 154, 140, 1, 0, 0, 0, 154, 141, 1, 0, 0, 0, 154, 142, 1, 0, 0, 0, 154, 143, 1, 0, 0, 0, 154, 144, 1, 0, 0, 0, 154, 145, 1, 0, 0, 0, 154, 146, 1, 0, 0, 0, 154, 147, 1, 0, 0, 0, 154, 148, 1, 0, 0, 0, 154, 149, 1, 0, 0, 0, 154, 150, 1, 0, 0, 0, 154, 151, 1, 0, 0, 0, 154, 152, 1, 0, 0, 0, 154, 153, 1, 0, 0, 0, 155, 7, 1, 0, 0, 0, 156, 157, 5, 20, 0, 0, 157, 158, 3, 10, 5, 0, 158, 9, 1, 0, 0, 0, 159, 160, 6, 5, -1, 0, 160, 161, 5, 49, 0, 0, 161, 189, 3, 10, 5, 8, 162, 189, 3, 16, 8, 0, 163, 189, 3, 12, 6, 0, 164, 189, 3, 14, 7, 0, 165, 167, 3, 16, 8, 0, 166, 168, 5, 49, 0, 0, 167, 166, 1, 0, 0, 0, 167, 168, 1, 0, 0, 0, 168, 169, 1, 0, 0, 0, 169, 170, 5, 43, 0, 0, 170, 171, 5, 47, 0, 0, 171, 176, 3, 16, 8, 0, 172, 173, 5, 38, 0, 0, 173, 175, 3, 16, 8, 0, 174, 172, 1, 0, 0, 0, 175, 178, 1, 0, 0, 0, 176, 174, 1, 0, 0, 0, 176, 177, 1, 0, 0, 0, 177, 179, 1, 0, 0, 0, 178, 176, 1, 0, 0, 0, 179, 180, 5, 55, 0, 0, 180, 189, 1, 0, 0, 0, 181, 182, 3, 16, 8, 0, 182, 184, 5, 44, 0, 0, 183, 185, 5, 49, 0, 0, 184, 183, 1, 0, 0, 0, 184, 185, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 187, 5, 50, 0, 0, 187, 189, 1, 0, 0, 0, 188, 159, 1, 0, 0, 0, 188, 162, 1, 0, 0, 0, 188, 163, 1, 0, 0, 0, 188, 164, 1, 0, 0, 0, 188, 165, 1, 0, 0, 0, 188, 181, 1, 0, 0, 0, 189, 198, 1, 0, 0, 0, 190, 191, 10, 4, 0, 0, 191, 192, 5, 34, 0, 0, 192, 197, 3, 10, 5, 5, 193, 194, 10, 3, 0, 0, 194, 195, 5, 52, 0, 0, 195, 197, 3, 10, 5, 4, 196, 190, 1, 0, 0, 0, 196, 193, 1, 0, 0, 0, 197, 200, 1, 0, 0, 0, 198, 196, 1, 0, 0, 0, 198, 199, 1, 0, 0, 0, 199, 11, 1, 0, 0, 0, 200, 198, 1, 0, 0, 0, 201, 203, 3, 16, 8, 0, 202, 204, 5, 49, 0, 0, 203, 202, 1, 0, 0, 0, 203, 204, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 206, 5, 46, 0, 0, 206, 207, 3, 100, 50, 0, 207, 216, 1, 0, 0, 0, 208, 210, 3, 16, 8, 0, 209, 211, 5, 49, 0, 0, 210, 209, 1, 0, 0, 0, 210, 211, 1, 0, 0, 0, 211, 212, 1, 0, 0, 0, 212, 213, 5, 54, 0, 0, 213, 214, 3, 100, 50, 0, 214, 216, 1, 0, 0, 0, 215, 201, 1, 0, 0, 0, 215, 208, 1, 0, 0, 0, 216, 13, 1, 0, 0, 0, 217, 218, 3, 54, 27, 0, 218, 219, 5, 48, 0, 0, 219, 220, 3, 100, 50, 0, 220, 15, 1, 0, 0, 0, 221, 227, 3, 18, 9, 0, 222, 223, 3, 18, 9, 0, 223, 224, 3, 102, 51, 0, 224, 225, 3, 18, 9, 0, 225, 227, 1, 0, 0, 0, 226, 221, 1, 0, 0, 0, 226, 222, 1, 0, 0, 0, 227, 17, 1, 0, 0, 0, 228, 229, 6, 9, -1, 0, 229, 233, 3, 20, 10, 0, 230, 231, 7, 0, 0, 0, 231, 233, 3, 18, 9, 3, 232, 228, 1, 0, 0, 0, 232, 230, 1, 0, 0, 0, 233, 242, 1, 0, 0, 0, 234, 235, 10, 2, 0, 0, 235, 236, 7, 1, 0, 0, 236, 241, 3, 18, 9, 3, 237, 238, 10, 1, 0, 0, 238, 239, 7, 0, 0, 0, 239, 241, 3, 18, 9, 2, 240, 234, 1, 0, 0, 0, 240, 237, 1, 0, 0, 0, 241, 244, 1, 0, 0, 0, 242, 240, 1, 0, 0, 0, 242, 243, 1, 0, 0, 0, 243, 19, 1, 0, 0, 0, 244, 242, 1, 0, 0, 0, 245, 246, 6, 10, -1, 0, 246, 254, 3, 64, 32, 0, 247, 254, 3, 54, 27, 0, 248, 254, 3, 22, 11, 0, 249, 250, 5, 47, 0, 0, 250, 251, 3, 10, 5, 0, 251, 252, 5, 55, 0, 0, 252, 254, 1, 0, 0, 0, 253, 245, 1, 0, 0, 0, 253, 247, 1, 0, 0, 0, 253, 248, 1, 0, 0, 0, 253, 249, 1, 0, 0, 0, 254, 260, 1, 0, 0, 0, 255, 256, 10, 1, 0, 0, 256, 257, 5, 37, 0, 0, 257, 259, 3, 24, 12, 0, 258, 255, 1, 0, 0, 0, 259, 262, 1, 0, 0, 0, 260, 258, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 21, 1, 0, 0, 0, 262, 260, 1, 0, 0, 0, 263, 264, 3, 60, 30, 0, 264, 274, 5, 47, 0, 0, 265, 275, 5, 66, 0, 0, 266, 271, 3, 10, 5, 0, 267, 268, 5, 38, 0, 0, 268, 270, 3, 10, 5, 0, 269, 267, 1, 0, 0, 0, 270, 273, 1, 0, 0, 0, 271, 269, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 275, 1, 0, 0, 0, 273, 271, 1, 0, 0, 0, 274, 265, 1, 0, 0, 0, 274, 266, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 276, 1, 0, 0, 0, 276, 277, 5, 55, 0, 0, 277, 23, 1, 0, 0, 0, 278, 279, 3, 60, 30, 0, 279, 25, 1, 0, 0, 0, 280, 281, 5, 16, 0, 0, 281, 282, 3, 28, 14, 0, 282, 27, 1, 0, 0, 0, 283, 288, 3, 30, 15, 0, 284, 285, 5, 38, 0, 0, 285, 287, 3, 30, 15, 0, 286, 284, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 29, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 297, 3, 10, 5, 0, 292, 293, 3, 54, 27, 0, 293, 294, 5, 36, 0, 0, 294, 295, 3, 10, 5, 0, 295, 297, 1, 0, 0, 0, 296, 291, 1, 0, 0, 0, 296, 292, 1, 0, 0, 0, 297, 31, 1, 0, 0, 0, 298, 299, 5, 6, 0, 0, 299, 304, 3, 34, 17, 0, 300, 301, 5, 38, 0, 0, 301, 303, 3, 34, 17, 0, 302, 300, 1, 0, 0, 0, 303, 306, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 308, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 307, 309, 3, 40, 20, 0, 308, 307, 1, 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 33, 1, 0, 0, 0, 310, 311, 3, 36, 18, 0, 311, 312, 5, 115, 0, 0, 312, 313, 3, 38, 19, 0, 313, 316, 1, 0, 0, 0, 314, 316, 3, 38, 19, 0, 315, 310, 1, 0, 0, 0, 315, 314, 1, 0, 0, 0, 316, 35, 1, 0, 0, 0, 317, 318, 5, 25, 0, 0, 318, 37, 1, 0, 0, 0, 319, 320, 7, 2, 0, 0, 320, 39, 1, 0, 0, 0, 321, 324, 3, 42, 21, 0, 322, 324, 3, 44, 22, 0, 323, 321, 1, 0, 0, 0, 323, 322, 1, 0, 0, 0, 324, 41, 1, 0, 0, 0, 325, 326, 5, 77, 0, 0, 326, 331, 5, 25, 0, 0, 327, 328, 5, 38, 0, 0, 328, 330, 5, 25, 0, 0, 329, 327, 1, 0, 0, 0, 330, 333, 1, 0, 0, 0, 331, 329, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 43, 1, 0, 0, 0, 333, 331, 1, 0, 0, 0, 334, 335, 5, 70, 0, 0, 335, 336, 3, 42, 21, 0, 336, 337, 5, 71, 0, 0, 337, 45, 1, 0, 0, 0, 338, 339, 5, 13, 0, 0, 339, 344, 3, 34, 17, 0, 340, 341, 5, 38, 0, 0, 341, 343, 3, 34, 17, 0, 342, 340, 1, 0, 0, 0, 343, 346, 1, 0, 0, 0, 344, 342, 1, 0, 0, 0, 344, 345, 1, 0, 0, 0, 345, 348, 1, 0, 0, 0, 346, 344, 1, 0, 0, 0, 347, 349, 3, 28, 14, 0, 348, 347, 1, 0, 0, 0, 348, 349, 1, 0, 0, 0, 349, 352, 1, 0, 0, 0, 350, 351, 5, 33, 0, 0, 351, 353, 3, 28, 14, 0, 352, 350, 1, 0, 0, 0, 352, 353, 1, 0, 0, 0, 353, 47, 1, 0, 0, 0, 354, 355, 5, 4, 0, 0, 355, 356, 3, 28, 14, 0, 356, 49, 1, 0, 0, 0, 357, 359, 5, 19, 0, 0, 358, 360, 3, 28, 14, 0, 359, 358, 1, 0, 0, 0, 359, 360, 1, 0, 0, 0, 360, 363, 1, 0, 0, 0, 361, 362, 5, 33, 0, 0, 362, 364, 3, 28, 14, 0, 363, 361, 1, 0, 0, 0, 363, 364, 1, 0, 0, 0, 364, 51, 1, 0, 0, 0, 365, 366, 5, 8, 0, 0, 366, 369, 3, 28, 14, 0, 367, 368, 5, 33, 0, 0, 368, 370, 3, 28, 14, 0, 369, 367, 1, 0, 0, 0, 369, 370, 1, 0, 0, 0, 370, 53, 1, 0, 0, 0, 371, 376, 3, 60, 30, 0, 372, 373, 5, 40, 0, 0, 373, 375, 3, 60, 30, 0, 374, 372, 1, 0, 0, 0, 375, 378, 1, 0, 0, 0, 376, 374, 1, 0, 0, 0, 376, 377, 1, 0, 0, 0, 377, 55, 1, 0, 0, 0, 378, 376, 1, 0, 0, 0, 379, 384, 3, 62, 31, 0, 380, 381, 5, 40, 0, 0, 381, 383, 3, 62, 31, 0, 382, 380, 1, 0, 0, 0, 383, 386, 1, 0, 0, 0, 384, 382, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 57, 1, 0, 0, 0, 386, 384, 1, 0, 0, 0, 387, 392, 3, 56, 28, 0, 388, 389, 5, 38, 0, 0, 389, 391, 3, 56, 28, 0, 390, 388, 1, 0, 0, 0, 391, 394, 1, 0, 0, 0, 392, 390, 1, 0, 0, 0, 392, 393, 1, 0, 0, 0, 393, 59, 1, 0, 0, 0, 394, 392, 1, 0, 0, 0, 395, 396, 7, 3, 0, 0, 396, 61, 1, 0, 0, 0, 397, 398, 5, 81, 0, 0, 398, 63, 1, 0, 0, 0, 399, 442, 5, 50, 0, 0, 400, 401, 3, 98, 49, 0, 401, 402, 5, 72, 0, 0, 402, 442, 1, 0, 0, 0, 403, 442, 3, 96, 48, 0, 404, 442, 3, 98, 49, 0, 405, 442, 3, 92, 46, 0, 406, 442, 3, 66, 33, 0, 407, 442, 3, 100, 50, 0, 408, 409, 5, 70, 0, 0, 409, 414, 3, 94, 47, 0, 410, 411, 5, 38, 0, 0, 411, 413, 3, 94, 47, 0, 412, 410, 1, 0, 0, 0, 413, 416, 1, 0, 0, 0, 414, 412, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 417, 1, 0, 0, 0, 416, 414, 1, 0, 0, 0, 417, 418, 5, 71, 0, 0, 418, 442, 1, 0, 0, 0, 419, 420, 5, 70, 0, 0, 420, 425, 3, 92, 46, 0, 421, 422, 5, 38, 0, 0, 422, 424, 3, 92, 46, 0, 423, 421, 1, 0, 0, 0, 424, 427, 1, 0, 0, 0, 425, 423, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 428, 1, 0, 0, 0, 427, 425, 1, 0, 0, 0, 428, 429, 5, 71, 0, 0, 429, 442, 1, 0, 0, 0, 430, 431, 5, 70, 0, 0, 431, 436, 3, 100, 50, 0, 432, 433, 5, 38, 0, 0, 433, 435, 3, 100, 50, 0, 434, 432, 1, 0, 0, 0, 435, 438, 1, 0, 0, 0, 436, 434, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 439, 1, 0, 0, 0, 438, 436, 1, 0, 0, 0, 439, 440, 5, 71, 0, 0, 440, 442, 1, 0, 0, 0, 441, 399, 1, 0, 0, 0, 441, 400, 1, 0, 0, 0, 441, 403, 1, 0, 0, 0, 441, 404, 1, 0, 0, 0, 441, 405, 1, 0, 0, 0, 441, 406, 1, 0, 0, 0, 441, 407, 1, 0, 0, 0, 441, 408, 1, 0, 0, 0, 441, 419, 1, 0, 0, 0, 441, 430, 1, 0, 0, 0, 442, 65, 1, 0, 0, 0, 443, 446, 5, 53, 0, 0, 444, 446, 5, 69, 0, 0, 445, 443, 1, 0, 0, 0, 445, 444, 1, 0, 0, 0, 446, 67, 1, 0, 0, 0, 447, 448, 5, 10, 0, 0, 448, 449, 5, 31, 0, 0, 449, 69, 1, 0, 0, 0, 450, 451, 5, 18, 0, 0, 451, 456, 3, 72, 36, 0, 452, 453, 5, 38, 0, 0, 453, 455, 3, 72, 36, 0, 454, 452, 1, 0, 0, 0, 455, 458, 1, 0, 0, 0, 456, 454, 1, 0, 0, 0, 456, 457, 1, 0, 0, 0, 457, 71, 1, 0, 0, 0, 458, 456, 1, 0, 0, 0, 459, 461, 3, 10, 5, 0, 460, 462, 7, 4, 0, 0, 461, 460, 1, 0, 0, 0, 461, 462, 1, 0, 0, 0, 462, 465, 1, 0, 0, 0, 463, 464, 5, 51, 0, 0, 464, 466, 7, 5, 0, 0, 465, 463, 1, 0, 0, 0, 465, 466, 1, 0, 0, 0, 466, 73, 1, 0, 0, 0, 467, 468, 5, 9, 0, 0, 468, 469, 3, 58, 29, 0, 469, 75, 1, 0, 0, 0, 470, 471, 5, 2, 0, 0, 471, 472, 3, 58, 29, 0, 472, 77, 1, 0, 0, 0, 473, 474, 5, 15, 0, 0, 474, 479, 3, 80, 40, 0, 475, 476, 5, 38, 0, 0, 476, 478, 3, 80, 40, 0, 477, 475, 1, 0, 0, 0, 478, 481, 1, 0, 0, 0, 479, 477, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 79, 1, 0, 0, 0, 481, 479, 1, 0, 0, 0, 482, 483, 3, 56, 28, 0, 483, 484, 5, 85, 0, 0, 484, 485, 3, 56, 28, 0, 485, 81, 1, 0, 0, 0, 486, 487, 5, 1, 0, 0, 487, 488, 3, 20, 10, 0, 488, 490, 3, 100, 50, 0, 489, 491, 3, 88, 44, 0, 490, 489, 1, 0, 0, 0, 490, 491, 1, 0, 0, 0, 491, 83, 1, 0, 0, 0, 492, 493, 5, 7, 0, 0, 493, 494, 3, 20, 10, 0, 494, 495, 3, 100, 50, 0, 495, 85, 1, 0, 0, 0, 496, 497, 5, 14, 0, 0, 497, 498, 3, 54, 27, 0, 498, 87, 1, 0, 0, 0, 499, 504, 3, 90, 45, 0, 500, 501, 5, 38, 0, 0, 501, 503, 3, 90, 45, 0, 502, 500, 1, 0, 0, 0, 503, 506, 1, 0, 0, 0, 504, 502, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 89, 1, 0, 0, 0, 506, 504, 1, 0, 0, 0, 507, 508, 3, 60, 30, 0, 508, 509, 5, 36, 0, 0, 509, 510, 3, 64, 32, 0, 510, 91, 1, 0, 0, 0, 511, 512, 7, 6, 0, 0, 512, 93, 1, 0, 0, 0, 513, 516, 3, 96, 48, 0, 514, 516, 3, 98, 49, 0, 515, 513, 1, 0, 0, 0, 515, 514, 1, 0, 0, 0, 516, 95, 1, 0, 0, 0, 517, 519, 7, 0, 0, 0, 518, 517, 1, 0, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 1, 0, 0, 0, 520, 521, 5, 32, 0, 0, 521, 97, 1, 0, 0, 0, 522, 524, 7, 0, 0, 0, 523, 522, 1, 0, 0, 0, 523, 524, 1, 0, 0, 0, 524, 525, 1, 0, 0, 0, 525, 526, 5, 31, 0, 0, 526, 99, 1, 0, 0, 0, 527, 528, 5, 30, 0, 0, 528, 101, 1, 0, 0, 0, 529, 530, 7, 7, 0, 0, 530, 103, 1, 0, 0, 0, 531, 532, 5, 5, 0, 0, 532, 533, 3, 106, 53, 0, 533, 105, 1, 0, 0, 0, 534, 535, 5, 70, 0, 0, 535, 536, 3, 2, 1, 0, 536, 537, 5, 71, 0, 0, 537, 107, 1, 0, 0, 0, 538, 539, 5, 17, 0, 0, 539, 540, 5, 107, 0, 0, 540, 109, 1, 0, 0, 0, 541, 542, 5, 12, 0, 0, 542, 543, 5, 111, 0, 0, 543, 111, 1, 0, 0, 0, 544, 545, 5, 3, 0, 0, 545, 548, 5, 91, 0, 0, 546, 547, 5, 89, 0, 0, 547, 549, 3, 56, 28, 0, 548, 546, 1, 0, 0, 0, 548, 549, 1, 0, 0, 0, 549, 559, 1, 0, 0, 0, 550, 551, 5, 90, 0, 0, 551, 556, 3, 114, 57, 0, 552, 553, 5, 38, 0, 0, 553, 555, 3, 114, 57, 0, 554, 552, 1, 0, 0, 0, 555, 558, 1, 0, 0, 0, 556, 554, 1, 0, 0, 0, 556, 557, 1, 0, 0, 0, 557, 560, 1, 0, 0, 0, 558, 556, 1, 0, 0, 0, 559, 550, 1, 0, 0, 0, 559, 560, 1, 0, 0, 0, 560, 113, 1, 0, 0, 0, 561, 562, 3, 56, 28, 0, 562, 563, 5, 36, 0, 0, 563, 565, 1, 0, 0, 0, 564, 561, 1, 0, 0, 0, 564, 565, 1, 0, 0, 0, 565, 566, 1, 0, 0, 0, 566, 567, 3, 56, 28, 0, 567, 115, 1, 0, 0, 0, 568, 569, 5, 11, 0, 0, 569, 570, 3, 34, 17, 0, 570, 571, 5, 89, 0, 0, 571, 572, 3, 58, 29, 0, 572, 117, 1, 0, 0, 0, 54, 129, 138, 154, 167, 176, 184, 188, 196, 198, 203, 210, 215, 226, 232, 240, 242, 253, 260, 271, 274, 288, 296, 304, 308, 315, 323, 331, 344, 348, 352, 359, 363, 369, 376, 384, 392, 414, 425, 436, 441, 445, 456, 461, 465, 479, 490, 504, 515, 518, 523, 548, 556, 559, 564] \ No newline at end of file +[4, 1, 126, 584, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 132, 8, 1, 10, 1, 12, 1, 135, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 143, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 160, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 173, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 180, 8, 5, 10, 5, 12, 5, 183, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 190, 8, 5, 1, 5, 1, 5, 3, 5, 194, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 202, 8, 5, 10, 5, 12, 5, 205, 9, 5, 1, 6, 1, 6, 3, 6, 209, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 216, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 221, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 232, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 238, 8, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 246, 8, 9, 10, 9, 12, 9, 249, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 259, 8, 10, 1, 10, 1, 10, 1, 10, 5, 10, 264, 8, 10, 10, 10, 12, 10, 267, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 275, 8, 11, 10, 11, 12, 11, 278, 9, 11, 3, 11, 280, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 5, 14, 292, 8, 14, 10, 14, 12, 14, 295, 9, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 302, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 308, 8, 16, 10, 16, 12, 16, 311, 9, 16, 1, 16, 3, 16, 314, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 321, 8, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 3, 20, 329, 8, 20, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 335, 8, 21, 10, 21, 12, 21, 338, 9, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 348, 8, 23, 10, 23, 12, 23, 351, 9, 23, 1, 23, 3, 23, 354, 8, 23, 1, 23, 1, 23, 3, 23, 358, 8, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 365, 8, 25, 1, 25, 1, 25, 3, 25, 369, 8, 25, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 375, 8, 26, 1, 27, 1, 27, 1, 27, 5, 27, 380, 8, 27, 10, 27, 12, 27, 383, 9, 27, 1, 28, 1, 28, 1, 28, 5, 28, 388, 8, 28, 10, 28, 12, 28, 391, 9, 28, 1, 29, 1, 29, 1, 29, 5, 29, 396, 8, 29, 10, 29, 12, 29, 399, 9, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 418, 8, 32, 10, 32, 12, 32, 421, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 429, 8, 32, 10, 32, 12, 32, 432, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 440, 8, 32, 10, 32, 12, 32, 443, 9, 32, 1, 32, 1, 32, 3, 32, 447, 8, 32, 1, 33, 1, 33, 3, 33, 451, 8, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 460, 8, 35, 10, 35, 12, 35, 463, 9, 35, 1, 36, 1, 36, 3, 36, 467, 8, 36, 1, 36, 1, 36, 3, 36, 471, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 483, 8, 39, 10, 39, 12, 39, 486, 9, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 496, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 5, 44, 508, 8, 44, 10, 44, 12, 44, 511, 9, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 521, 8, 47, 1, 48, 3, 48, 524, 8, 48, 1, 48, 1, 48, 1, 49, 3, 49, 529, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 554, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 560, 8, 56, 10, 56, 12, 56, 563, 9, 56, 3, 56, 565, 8, 56, 1, 57, 1, 57, 1, 57, 3, 57, 570, 8, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 0, 4, 2, 10, 18, 20, 61, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 0, 8, 1, 0, 65, 66, 1, 0, 67, 69, 2, 0, 26, 26, 31, 31, 1, 0, 73, 74, 2, 0, 36, 36, 40, 40, 2, 0, 43, 43, 46, 46, 2, 0, 42, 42, 57, 57, 2, 0, 58, 58, 60, 64, 608, 0, 122, 1, 0, 0, 0, 2, 125, 1, 0, 0, 0, 4, 142, 1, 0, 0, 0, 6, 159, 1, 0, 0, 0, 8, 161, 1, 0, 0, 0, 10, 193, 1, 0, 0, 0, 12, 220, 1, 0, 0, 0, 14, 222, 1, 0, 0, 0, 16, 231, 1, 0, 0, 0, 18, 237, 1, 0, 0, 0, 20, 258, 1, 0, 0, 0, 22, 268, 1, 0, 0, 0, 24, 283, 1, 0, 0, 0, 26, 285, 1, 0, 0, 0, 28, 288, 1, 0, 0, 0, 30, 301, 1, 0, 0, 0, 32, 303, 1, 0, 0, 0, 34, 320, 1, 0, 0, 0, 36, 322, 1, 0, 0, 0, 38, 324, 1, 0, 0, 0, 40, 328, 1, 0, 0, 0, 42, 330, 1, 0, 0, 0, 44, 339, 1, 0, 0, 0, 46, 343, 1, 0, 0, 0, 48, 359, 1, 0, 0, 0, 50, 362, 1, 0, 0, 0, 52, 370, 1, 0, 0, 0, 54, 376, 1, 0, 0, 0, 56, 384, 1, 0, 0, 0, 58, 392, 1, 0, 0, 0, 60, 400, 1, 0, 0, 0, 62, 402, 1, 0, 0, 0, 64, 446, 1, 0, 0, 0, 66, 450, 1, 0, 0, 0, 68, 452, 1, 0, 0, 0, 70, 455, 1, 0, 0, 0, 72, 464, 1, 0, 0, 0, 74, 472, 1, 0, 0, 0, 76, 475, 1, 0, 0, 0, 78, 478, 1, 0, 0, 0, 80, 487, 1, 0, 0, 0, 82, 491, 1, 0, 0, 0, 84, 497, 1, 0, 0, 0, 86, 501, 1, 0, 0, 0, 88, 504, 1, 0, 0, 0, 90, 512, 1, 0, 0, 0, 92, 516, 1, 0, 0, 0, 94, 520, 1, 0, 0, 0, 96, 523, 1, 0, 0, 0, 98, 528, 1, 0, 0, 0, 100, 532, 1, 0, 0, 0, 102, 534, 1, 0, 0, 0, 104, 536, 1, 0, 0, 0, 106, 539, 1, 0, 0, 0, 108, 543, 1, 0, 0, 0, 110, 546, 1, 0, 0, 0, 112, 549, 1, 0, 0, 0, 114, 569, 1, 0, 0, 0, 116, 573, 1, 0, 0, 0, 118, 578, 1, 0, 0, 0, 120, 581, 1, 0, 0, 0, 122, 123, 3, 2, 1, 0, 123, 124, 5, 0, 0, 1, 124, 1, 1, 0, 0, 0, 125, 126, 6, 1, -1, 0, 126, 127, 3, 4, 2, 0, 127, 133, 1, 0, 0, 0, 128, 129, 10, 1, 0, 0, 129, 130, 5, 30, 0, 0, 130, 132, 3, 6, 3, 0, 131, 128, 1, 0, 0, 0, 132, 135, 1, 0, 0, 0, 133, 131, 1, 0, 0, 0, 133, 134, 1, 0, 0, 0, 134, 3, 1, 0, 0, 0, 135, 133, 1, 0, 0, 0, 136, 143, 3, 104, 52, 0, 137, 143, 3, 32, 16, 0, 138, 143, 3, 26, 13, 0, 139, 143, 3, 46, 23, 0, 140, 143, 3, 108, 54, 0, 141, 143, 3, 110, 55, 0, 142, 136, 1, 0, 0, 0, 142, 137, 1, 0, 0, 0, 142, 138, 1, 0, 0, 0, 142, 139, 1, 0, 0, 0, 142, 140, 1, 0, 0, 0, 142, 141, 1, 0, 0, 0, 143, 5, 1, 0, 0, 0, 144, 160, 3, 48, 24, 0, 145, 160, 3, 52, 26, 0, 146, 160, 3, 68, 34, 0, 147, 160, 3, 116, 58, 0, 148, 160, 3, 74, 37, 0, 149, 160, 3, 70, 35, 0, 150, 160, 3, 50, 25, 0, 151, 160, 3, 8, 4, 0, 152, 160, 3, 76, 38, 0, 153, 160, 3, 78, 39, 0, 154, 160, 3, 82, 41, 0, 155, 160, 3, 84, 42, 0, 156, 160, 3, 112, 56, 0, 157, 160, 3, 86, 43, 0, 158, 160, 3, 118, 59, 0, 159, 144, 1, 0, 0, 0, 159, 145, 1, 0, 0, 0, 159, 146, 1, 0, 0, 0, 159, 147, 1, 0, 0, 0, 159, 148, 1, 0, 0, 0, 159, 149, 1, 0, 0, 0, 159, 150, 1, 0, 0, 0, 159, 151, 1, 0, 0, 0, 159, 152, 1, 0, 0, 0, 159, 153, 1, 0, 0, 0, 159, 154, 1, 0, 0, 0, 159, 155, 1, 0, 0, 0, 159, 156, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 159, 158, 1, 0, 0, 0, 160, 7, 1, 0, 0, 0, 161, 162, 5, 20, 0, 0, 162, 163, 3, 10, 5, 0, 163, 9, 1, 0, 0, 0, 164, 165, 6, 5, -1, 0, 165, 166, 5, 50, 0, 0, 166, 194, 3, 10, 5, 8, 167, 194, 3, 16, 8, 0, 168, 194, 3, 12, 6, 0, 169, 194, 3, 14, 7, 0, 170, 172, 3, 16, 8, 0, 171, 173, 5, 50, 0, 0, 172, 171, 1, 0, 0, 0, 172, 173, 1, 0, 0, 0, 173, 174, 1, 0, 0, 0, 174, 175, 5, 44, 0, 0, 175, 176, 5, 48, 0, 0, 176, 181, 3, 16, 8, 0, 177, 178, 5, 39, 0, 0, 178, 180, 3, 16, 8, 0, 179, 177, 1, 0, 0, 0, 180, 183, 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 184, 1, 0, 0, 0, 183, 181, 1, 0, 0, 0, 184, 185, 5, 56, 0, 0, 185, 194, 1, 0, 0, 0, 186, 187, 3, 16, 8, 0, 187, 189, 5, 45, 0, 0, 188, 190, 5, 50, 0, 0, 189, 188, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 191, 1, 0, 0, 0, 191, 192, 5, 51, 0, 0, 192, 194, 1, 0, 0, 0, 193, 164, 1, 0, 0, 0, 193, 167, 1, 0, 0, 0, 193, 168, 1, 0, 0, 0, 193, 169, 1, 0, 0, 0, 193, 170, 1, 0, 0, 0, 193, 186, 1, 0, 0, 0, 194, 203, 1, 0, 0, 0, 195, 196, 10, 4, 0, 0, 196, 197, 5, 35, 0, 0, 197, 202, 3, 10, 5, 5, 198, 199, 10, 3, 0, 0, 199, 200, 5, 53, 0, 0, 200, 202, 3, 10, 5, 4, 201, 195, 1, 0, 0, 0, 201, 198, 1, 0, 0, 0, 202, 205, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 203, 204, 1, 0, 0, 0, 204, 11, 1, 0, 0, 0, 205, 203, 1, 0, 0, 0, 206, 208, 3, 16, 8, 0, 207, 209, 5, 50, 0, 0, 208, 207, 1, 0, 0, 0, 208, 209, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 211, 5, 47, 0, 0, 211, 212, 3, 100, 50, 0, 212, 221, 1, 0, 0, 0, 213, 215, 3, 16, 8, 0, 214, 216, 5, 50, 0, 0, 215, 214, 1, 0, 0, 0, 215, 216, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 218, 5, 55, 0, 0, 218, 219, 3, 100, 50, 0, 219, 221, 1, 0, 0, 0, 220, 206, 1, 0, 0, 0, 220, 213, 1, 0, 0, 0, 221, 13, 1, 0, 0, 0, 222, 223, 3, 54, 27, 0, 223, 224, 5, 49, 0, 0, 224, 225, 3, 100, 50, 0, 225, 15, 1, 0, 0, 0, 226, 232, 3, 18, 9, 0, 227, 228, 3, 18, 9, 0, 228, 229, 3, 102, 51, 0, 229, 230, 3, 18, 9, 0, 230, 232, 1, 0, 0, 0, 231, 226, 1, 0, 0, 0, 231, 227, 1, 0, 0, 0, 232, 17, 1, 0, 0, 0, 233, 234, 6, 9, -1, 0, 234, 238, 3, 20, 10, 0, 235, 236, 7, 0, 0, 0, 236, 238, 3, 18, 9, 3, 237, 233, 1, 0, 0, 0, 237, 235, 1, 0, 0, 0, 238, 247, 1, 0, 0, 0, 239, 240, 10, 2, 0, 0, 240, 241, 7, 1, 0, 0, 241, 246, 3, 18, 9, 3, 242, 243, 10, 1, 0, 0, 243, 244, 7, 0, 0, 0, 244, 246, 3, 18, 9, 2, 245, 239, 1, 0, 0, 0, 245, 242, 1, 0, 0, 0, 246, 249, 1, 0, 0, 0, 247, 245, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 19, 1, 0, 0, 0, 249, 247, 1, 0, 0, 0, 250, 251, 6, 10, -1, 0, 251, 259, 3, 64, 32, 0, 252, 259, 3, 54, 27, 0, 253, 259, 3, 22, 11, 0, 254, 255, 5, 48, 0, 0, 255, 256, 3, 10, 5, 0, 256, 257, 5, 56, 0, 0, 257, 259, 1, 0, 0, 0, 258, 250, 1, 0, 0, 0, 258, 252, 1, 0, 0, 0, 258, 253, 1, 0, 0, 0, 258, 254, 1, 0, 0, 0, 259, 265, 1, 0, 0, 0, 260, 261, 10, 1, 0, 0, 261, 262, 5, 38, 0, 0, 262, 264, 3, 24, 12, 0, 263, 260, 1, 0, 0, 0, 264, 267, 1, 0, 0, 0, 265, 263, 1, 0, 0, 0, 265, 266, 1, 0, 0, 0, 266, 21, 1, 0, 0, 0, 267, 265, 1, 0, 0, 0, 268, 269, 3, 60, 30, 0, 269, 279, 5, 48, 0, 0, 270, 280, 5, 67, 0, 0, 271, 276, 3, 10, 5, 0, 272, 273, 5, 39, 0, 0, 273, 275, 3, 10, 5, 0, 274, 272, 1, 0, 0, 0, 275, 278, 1, 0, 0, 0, 276, 274, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 280, 1, 0, 0, 0, 278, 276, 1, 0, 0, 0, 279, 270, 1, 0, 0, 0, 279, 271, 1, 0, 0, 0, 279, 280, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 282, 5, 56, 0, 0, 282, 23, 1, 0, 0, 0, 283, 284, 3, 60, 30, 0, 284, 25, 1, 0, 0, 0, 285, 286, 5, 16, 0, 0, 286, 287, 3, 28, 14, 0, 287, 27, 1, 0, 0, 0, 288, 293, 3, 30, 15, 0, 289, 290, 5, 39, 0, 0, 290, 292, 3, 30, 15, 0, 291, 289, 1, 0, 0, 0, 292, 295, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 293, 294, 1, 0, 0, 0, 294, 29, 1, 0, 0, 0, 295, 293, 1, 0, 0, 0, 296, 302, 3, 10, 5, 0, 297, 298, 3, 54, 27, 0, 298, 299, 5, 37, 0, 0, 299, 300, 3, 10, 5, 0, 300, 302, 1, 0, 0, 0, 301, 296, 1, 0, 0, 0, 301, 297, 1, 0, 0, 0, 302, 31, 1, 0, 0, 0, 303, 304, 5, 6, 0, 0, 304, 309, 3, 34, 17, 0, 305, 306, 5, 39, 0, 0, 306, 308, 3, 34, 17, 0, 307, 305, 1, 0, 0, 0, 308, 311, 1, 0, 0, 0, 309, 307, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 313, 1, 0, 0, 0, 311, 309, 1, 0, 0, 0, 312, 314, 3, 40, 20, 0, 313, 312, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 33, 1, 0, 0, 0, 315, 316, 3, 36, 18, 0, 316, 317, 5, 116, 0, 0, 317, 318, 3, 38, 19, 0, 318, 321, 1, 0, 0, 0, 319, 321, 3, 38, 19, 0, 320, 315, 1, 0, 0, 0, 320, 319, 1, 0, 0, 0, 321, 35, 1, 0, 0, 0, 322, 323, 5, 26, 0, 0, 323, 37, 1, 0, 0, 0, 324, 325, 7, 2, 0, 0, 325, 39, 1, 0, 0, 0, 326, 329, 3, 42, 21, 0, 327, 329, 3, 44, 22, 0, 328, 326, 1, 0, 0, 0, 328, 327, 1, 0, 0, 0, 329, 41, 1, 0, 0, 0, 330, 331, 5, 78, 0, 0, 331, 336, 5, 26, 0, 0, 332, 333, 5, 39, 0, 0, 333, 335, 5, 26, 0, 0, 334, 332, 1, 0, 0, 0, 335, 338, 1, 0, 0, 0, 336, 334, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 337, 43, 1, 0, 0, 0, 338, 336, 1, 0, 0, 0, 339, 340, 5, 71, 0, 0, 340, 341, 3, 42, 21, 0, 341, 342, 5, 72, 0, 0, 342, 45, 1, 0, 0, 0, 343, 344, 5, 13, 0, 0, 344, 349, 3, 34, 17, 0, 345, 346, 5, 39, 0, 0, 346, 348, 3, 34, 17, 0, 347, 345, 1, 0, 0, 0, 348, 351, 1, 0, 0, 0, 349, 347, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 353, 1, 0, 0, 0, 351, 349, 1, 0, 0, 0, 352, 354, 3, 28, 14, 0, 353, 352, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 357, 1, 0, 0, 0, 355, 356, 5, 34, 0, 0, 356, 358, 3, 28, 14, 0, 357, 355, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 47, 1, 0, 0, 0, 359, 360, 5, 4, 0, 0, 360, 361, 3, 28, 14, 0, 361, 49, 1, 0, 0, 0, 362, 364, 5, 19, 0, 0, 363, 365, 3, 28, 14, 0, 364, 363, 1, 0, 0, 0, 364, 365, 1, 0, 0, 0, 365, 368, 1, 0, 0, 0, 366, 367, 5, 34, 0, 0, 367, 369, 3, 28, 14, 0, 368, 366, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 51, 1, 0, 0, 0, 370, 371, 5, 8, 0, 0, 371, 374, 3, 28, 14, 0, 372, 373, 5, 34, 0, 0, 373, 375, 3, 28, 14, 0, 374, 372, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 53, 1, 0, 0, 0, 376, 381, 3, 60, 30, 0, 377, 378, 5, 41, 0, 0, 378, 380, 3, 60, 30, 0, 379, 377, 1, 0, 0, 0, 380, 383, 1, 0, 0, 0, 381, 379, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 55, 1, 0, 0, 0, 383, 381, 1, 0, 0, 0, 384, 389, 3, 62, 31, 0, 385, 386, 5, 41, 0, 0, 386, 388, 3, 62, 31, 0, 387, 385, 1, 0, 0, 0, 388, 391, 1, 0, 0, 0, 389, 387, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 57, 1, 0, 0, 0, 391, 389, 1, 0, 0, 0, 392, 397, 3, 56, 28, 0, 393, 394, 5, 39, 0, 0, 394, 396, 3, 56, 28, 0, 395, 393, 1, 0, 0, 0, 396, 399, 1, 0, 0, 0, 397, 395, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 59, 1, 0, 0, 0, 399, 397, 1, 0, 0, 0, 400, 401, 7, 3, 0, 0, 401, 61, 1, 0, 0, 0, 402, 403, 5, 82, 0, 0, 403, 63, 1, 0, 0, 0, 404, 447, 5, 51, 0, 0, 405, 406, 3, 98, 49, 0, 406, 407, 5, 73, 0, 0, 407, 447, 1, 0, 0, 0, 408, 447, 3, 96, 48, 0, 409, 447, 3, 98, 49, 0, 410, 447, 3, 92, 46, 0, 411, 447, 3, 66, 33, 0, 412, 447, 3, 100, 50, 0, 413, 414, 5, 71, 0, 0, 414, 419, 3, 94, 47, 0, 415, 416, 5, 39, 0, 0, 416, 418, 3, 94, 47, 0, 417, 415, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 423, 5, 72, 0, 0, 423, 447, 1, 0, 0, 0, 424, 425, 5, 71, 0, 0, 425, 430, 3, 92, 46, 0, 426, 427, 5, 39, 0, 0, 427, 429, 3, 92, 46, 0, 428, 426, 1, 0, 0, 0, 429, 432, 1, 0, 0, 0, 430, 428, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 433, 1, 0, 0, 0, 432, 430, 1, 0, 0, 0, 433, 434, 5, 72, 0, 0, 434, 447, 1, 0, 0, 0, 435, 436, 5, 71, 0, 0, 436, 441, 3, 100, 50, 0, 437, 438, 5, 39, 0, 0, 438, 440, 3, 100, 50, 0, 439, 437, 1, 0, 0, 0, 440, 443, 1, 0, 0, 0, 441, 439, 1, 0, 0, 0, 441, 442, 1, 0, 0, 0, 442, 444, 1, 0, 0, 0, 443, 441, 1, 0, 0, 0, 444, 445, 5, 72, 0, 0, 445, 447, 1, 0, 0, 0, 446, 404, 1, 0, 0, 0, 446, 405, 1, 0, 0, 0, 446, 408, 1, 0, 0, 0, 446, 409, 1, 0, 0, 0, 446, 410, 1, 0, 0, 0, 446, 411, 1, 0, 0, 0, 446, 412, 1, 0, 0, 0, 446, 413, 1, 0, 0, 0, 446, 424, 1, 0, 0, 0, 446, 435, 1, 0, 0, 0, 447, 65, 1, 0, 0, 0, 448, 451, 5, 54, 0, 0, 449, 451, 5, 70, 0, 0, 450, 448, 1, 0, 0, 0, 450, 449, 1, 0, 0, 0, 451, 67, 1, 0, 0, 0, 452, 453, 5, 10, 0, 0, 453, 454, 5, 32, 0, 0, 454, 69, 1, 0, 0, 0, 455, 456, 5, 18, 0, 0, 456, 461, 3, 72, 36, 0, 457, 458, 5, 39, 0, 0, 458, 460, 3, 72, 36, 0, 459, 457, 1, 0, 0, 0, 460, 463, 1, 0, 0, 0, 461, 459, 1, 0, 0, 0, 461, 462, 1, 0, 0, 0, 462, 71, 1, 0, 0, 0, 463, 461, 1, 0, 0, 0, 464, 466, 3, 10, 5, 0, 465, 467, 7, 4, 0, 0, 466, 465, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 470, 1, 0, 0, 0, 468, 469, 5, 52, 0, 0, 469, 471, 7, 5, 0, 0, 470, 468, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 73, 1, 0, 0, 0, 472, 473, 5, 9, 0, 0, 473, 474, 3, 58, 29, 0, 474, 75, 1, 0, 0, 0, 475, 476, 5, 2, 0, 0, 476, 477, 3, 58, 29, 0, 477, 77, 1, 0, 0, 0, 478, 479, 5, 15, 0, 0, 479, 484, 3, 80, 40, 0, 480, 481, 5, 39, 0, 0, 481, 483, 3, 80, 40, 0, 482, 480, 1, 0, 0, 0, 483, 486, 1, 0, 0, 0, 484, 482, 1, 0, 0, 0, 484, 485, 1, 0, 0, 0, 485, 79, 1, 0, 0, 0, 486, 484, 1, 0, 0, 0, 487, 488, 3, 56, 28, 0, 488, 489, 5, 86, 0, 0, 489, 490, 3, 56, 28, 0, 490, 81, 1, 0, 0, 0, 491, 492, 5, 1, 0, 0, 492, 493, 3, 20, 10, 0, 493, 495, 3, 100, 50, 0, 494, 496, 3, 88, 44, 0, 495, 494, 1, 0, 0, 0, 495, 496, 1, 0, 0, 0, 496, 83, 1, 0, 0, 0, 497, 498, 5, 7, 0, 0, 498, 499, 3, 20, 10, 0, 499, 500, 3, 100, 50, 0, 500, 85, 1, 0, 0, 0, 501, 502, 5, 14, 0, 0, 502, 503, 3, 54, 27, 0, 503, 87, 1, 0, 0, 0, 504, 509, 3, 90, 45, 0, 505, 506, 5, 39, 0, 0, 506, 508, 3, 90, 45, 0, 507, 505, 1, 0, 0, 0, 508, 511, 1, 0, 0, 0, 509, 507, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 89, 1, 0, 0, 0, 511, 509, 1, 0, 0, 0, 512, 513, 3, 60, 30, 0, 513, 514, 5, 37, 0, 0, 514, 515, 3, 64, 32, 0, 515, 91, 1, 0, 0, 0, 516, 517, 7, 6, 0, 0, 517, 93, 1, 0, 0, 0, 518, 521, 3, 96, 48, 0, 519, 521, 3, 98, 49, 0, 520, 518, 1, 0, 0, 0, 520, 519, 1, 0, 0, 0, 521, 95, 1, 0, 0, 0, 522, 524, 7, 0, 0, 0, 523, 522, 1, 0, 0, 0, 523, 524, 1, 0, 0, 0, 524, 525, 1, 0, 0, 0, 525, 526, 5, 33, 0, 0, 526, 97, 1, 0, 0, 0, 527, 529, 7, 0, 0, 0, 528, 527, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 531, 5, 32, 0, 0, 531, 99, 1, 0, 0, 0, 532, 533, 5, 31, 0, 0, 533, 101, 1, 0, 0, 0, 534, 535, 7, 7, 0, 0, 535, 103, 1, 0, 0, 0, 536, 537, 5, 5, 0, 0, 537, 538, 3, 106, 53, 0, 538, 105, 1, 0, 0, 0, 539, 540, 5, 71, 0, 0, 540, 541, 3, 2, 1, 0, 541, 542, 5, 72, 0, 0, 542, 107, 1, 0, 0, 0, 543, 544, 5, 17, 0, 0, 544, 545, 5, 108, 0, 0, 545, 109, 1, 0, 0, 0, 546, 547, 5, 12, 0, 0, 547, 548, 5, 112, 0, 0, 548, 111, 1, 0, 0, 0, 549, 550, 5, 3, 0, 0, 550, 553, 5, 92, 0, 0, 551, 552, 5, 90, 0, 0, 552, 554, 3, 56, 28, 0, 553, 551, 1, 0, 0, 0, 553, 554, 1, 0, 0, 0, 554, 564, 1, 0, 0, 0, 555, 556, 5, 91, 0, 0, 556, 561, 3, 114, 57, 0, 557, 558, 5, 39, 0, 0, 558, 560, 3, 114, 57, 0, 559, 557, 1, 0, 0, 0, 560, 563, 1, 0, 0, 0, 561, 559, 1, 0, 0, 0, 561, 562, 1, 0, 0, 0, 562, 565, 1, 0, 0, 0, 563, 561, 1, 0, 0, 0, 564, 555, 1, 0, 0, 0, 564, 565, 1, 0, 0, 0, 565, 113, 1, 0, 0, 0, 566, 567, 3, 56, 28, 0, 567, 568, 5, 37, 0, 0, 568, 570, 1, 0, 0, 0, 569, 566, 1, 0, 0, 0, 569, 570, 1, 0, 0, 0, 570, 571, 1, 0, 0, 0, 571, 572, 3, 56, 28, 0, 572, 115, 1, 0, 0, 0, 573, 574, 5, 11, 0, 0, 574, 575, 3, 34, 17, 0, 575, 576, 5, 90, 0, 0, 576, 577, 3, 58, 29, 0, 577, 117, 1, 0, 0, 0, 578, 579, 5, 21, 0, 0, 579, 580, 3, 120, 60, 0, 580, 119, 1, 0, 0, 0, 581, 582, 5, 31, 0, 0, 582, 121, 1, 0, 0, 0, 54, 133, 142, 159, 172, 181, 189, 193, 201, 203, 208, 215, 220, 231, 237, 245, 247, 258, 265, 276, 279, 293, 301, 309, 313, 320, 328, 336, 349, 353, 357, 364, 368, 374, 381, 389, 397, 419, 430, 441, 446, 450, 461, 466, 470, 484, 495, 509, 520, 523, 528, 553, 561, 564, 569] \ No newline at end of file diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.tokens b/packages/kbn-esql-ast/src/antlr/esql_parser.tokens index 4cac289a33634..2d4bb481826f5 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.tokens +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.tokens @@ -18,111 +18,112 @@ SHOW=17 SORT=18 STATS=19 WHERE=20 -UNKNOWN_CMD=21 -LINE_COMMENT=22 -MULTILINE_COMMENT=23 -WS=24 -UNQUOTED_SOURCE=25 -EXPLAIN_WS=26 -EXPLAIN_LINE_COMMENT=27 -EXPLAIN_MULTILINE_COMMENT=28 -PIPE=29 -QUOTED_STRING=30 -INTEGER_LITERAL=31 -DECIMAL_LITERAL=32 -BY=33 -AND=34 -ASC=35 -ASSIGN=36 -CAST_OP=37 -COMMA=38 -DESC=39 -DOT=40 -FALSE=41 -FIRST=42 -IN=43 -IS=44 -LAST=45 -LIKE=46 -LP=47 -MATCH=48 -NOT=49 -NULL=50 -NULLS=51 -OR=52 -PARAM=53 -RLIKE=54 -RP=55 -TRUE=56 -EQ=57 -CIEQ=58 -NEQ=59 -LT=60 -LTE=61 -GT=62 -GTE=63 -PLUS=64 -MINUS=65 -ASTERISK=66 -SLASH=67 -PERCENT=68 -NAMED_OR_POSITIONAL_PARAM=69 -OPENING_BRACKET=70 -CLOSING_BRACKET=71 -UNQUOTED_IDENTIFIER=72 -QUOTED_IDENTIFIER=73 -EXPR_LINE_COMMENT=74 -EXPR_MULTILINE_COMMENT=75 -EXPR_WS=76 -METADATA=77 -FROM_LINE_COMMENT=78 -FROM_MULTILINE_COMMENT=79 -FROM_WS=80 -ID_PATTERN=81 -PROJECT_LINE_COMMENT=82 -PROJECT_MULTILINE_COMMENT=83 -PROJECT_WS=84 -AS=85 -RENAME_LINE_COMMENT=86 -RENAME_MULTILINE_COMMENT=87 -RENAME_WS=88 -ON=89 -WITH=90 -ENRICH_POLICY_NAME=91 -ENRICH_LINE_COMMENT=92 -ENRICH_MULTILINE_COMMENT=93 -ENRICH_WS=94 -ENRICH_FIELD_LINE_COMMENT=95 -ENRICH_FIELD_MULTILINE_COMMENT=96 -ENRICH_FIELD_WS=97 -LOOKUP_LINE_COMMENT=98 -LOOKUP_MULTILINE_COMMENT=99 -LOOKUP_WS=100 -LOOKUP_FIELD_LINE_COMMENT=101 -LOOKUP_FIELD_MULTILINE_COMMENT=102 -LOOKUP_FIELD_WS=103 -MVEXPAND_LINE_COMMENT=104 -MVEXPAND_MULTILINE_COMMENT=105 -MVEXPAND_WS=106 -INFO=107 -SHOW_LINE_COMMENT=108 -SHOW_MULTILINE_COMMENT=109 -SHOW_WS=110 -FUNCTIONS=111 -META_LINE_COMMENT=112 -META_MULTILINE_COMMENT=113 -META_WS=114 -COLON=115 -SETTING=116 -SETTING_LINE_COMMENT=117 -SETTTING_MULTILINE_COMMENT=118 -SETTING_WS=119 -METRICS_LINE_COMMENT=120 -METRICS_MULTILINE_COMMENT=121 -METRICS_WS=122 -CLOSING_METRICS_LINE_COMMENT=123 -CLOSING_METRICS_MULTILINE_COMMENT=124 -CLOSING_METRICS_WS=125 +MATCH=21 +UNKNOWN_CMD=22 +LINE_COMMENT=23 +MULTILINE_COMMENT=24 +WS=25 +UNQUOTED_SOURCE=26 +EXPLAIN_WS=27 +EXPLAIN_LINE_COMMENT=28 +EXPLAIN_MULTILINE_COMMENT=29 +PIPE=30 +QUOTED_STRING=31 +INTEGER_LITERAL=32 +DECIMAL_LITERAL=33 +BY=34 +AND=35 +ASC=36 +ASSIGN=37 +CAST_OP=38 +COMMA=39 +DESC=40 +DOT=41 +FALSE=42 +FIRST=43 +IN=44 +IS=45 +LAST=46 +LIKE=47 +LP=48 +MATCH_OPERATOR=49 +NOT=50 +NULL=51 +NULLS=52 +OR=53 +PARAM=54 +RLIKE=55 +RP=56 +TRUE=57 +EQ=58 +CIEQ=59 +NEQ=60 +LT=61 +LTE=62 +GT=63 +GTE=64 +PLUS=65 +MINUS=66 +ASTERISK=67 +SLASH=68 +PERCENT=69 +NAMED_OR_POSITIONAL_PARAM=70 +OPENING_BRACKET=71 +CLOSING_BRACKET=72 +UNQUOTED_IDENTIFIER=73 +QUOTED_IDENTIFIER=74 +EXPR_LINE_COMMENT=75 +EXPR_MULTILINE_COMMENT=76 +EXPR_WS=77 +METADATA=78 +FROM_LINE_COMMENT=79 +FROM_MULTILINE_COMMENT=80 +FROM_WS=81 +ID_PATTERN=82 +PROJECT_LINE_COMMENT=83 +PROJECT_MULTILINE_COMMENT=84 +PROJECT_WS=85 +AS=86 +RENAME_LINE_COMMENT=87 +RENAME_MULTILINE_COMMENT=88 +RENAME_WS=89 +ON=90 +WITH=91 +ENRICH_POLICY_NAME=92 +ENRICH_LINE_COMMENT=93 +ENRICH_MULTILINE_COMMENT=94 +ENRICH_WS=95 +ENRICH_FIELD_LINE_COMMENT=96 +ENRICH_FIELD_MULTILINE_COMMENT=97 +ENRICH_FIELD_WS=98 +LOOKUP_LINE_COMMENT=99 +LOOKUP_MULTILINE_COMMENT=100 +LOOKUP_WS=101 +LOOKUP_FIELD_LINE_COMMENT=102 +LOOKUP_FIELD_MULTILINE_COMMENT=103 +LOOKUP_FIELD_WS=104 +MVEXPAND_LINE_COMMENT=105 +MVEXPAND_MULTILINE_COMMENT=106 +MVEXPAND_WS=107 +INFO=108 +SHOW_LINE_COMMENT=109 +SHOW_MULTILINE_COMMENT=110 +SHOW_WS=111 +FUNCTIONS=112 +META_LINE_COMMENT=113 +META_MULTILINE_COMMENT=114 +META_WS=115 +COLON=116 +SETTING=117 +SETTING_LINE_COMMENT=118 +SETTTING_MULTILINE_COMMENT=119 +SETTING_WS=120 +METRICS_LINE_COMMENT=121 +METRICS_MULTILINE_COMMENT=122 +METRICS_WS=123 +CLOSING_METRICS_LINE_COMMENT=124 +CLOSING_METRICS_MULTILINE_COMMENT=125 +CLOSING_METRICS_WS=126 'dissect'=1 'drop'=2 'enrich'=3 @@ -143,48 +144,47 @@ CLOSING_METRICS_WS=125 'sort'=18 'stats'=19 'where'=20 -'|'=29 -'by'=33 -'and'=34 -'asc'=35 -'='=36 -'::'=37 -','=38 -'desc'=39 -'.'=40 -'false'=41 -'first'=42 -'in'=43 -'is'=44 -'last'=45 -'like'=46 -'('=47 -'match'=48 -'not'=49 -'null'=50 -'nulls'=51 -'or'=52 -'?'=53 -'rlike'=54 -')'=55 -'true'=56 -'=='=57 -'=~'=58 -'!='=59 -'<'=60 -'<='=61 -'>'=62 -'>='=63 -'+'=64 -'-'=65 -'*'=66 -'/'=67 -'%'=68 -']'=71 -'metadata'=77 -'as'=85 -'on'=89 -'with'=90 -'info'=107 -'functions'=111 -':'=115 +'|'=30 +'by'=34 +'and'=35 +'asc'=36 +'='=37 +'::'=38 +','=39 +'desc'=40 +'.'=41 +'false'=42 +'first'=43 +'in'=44 +'is'=45 +'last'=46 +'like'=47 +'('=48 +'not'=50 +'null'=51 +'nulls'=52 +'or'=53 +'?'=54 +'rlike'=55 +')'=56 +'true'=57 +'=='=58 +'=~'=59 +'!='=60 +'<'=61 +'<='=62 +'>'=63 +'>='=64 +'+'=65 +'-'=66 +'*'=67 +'/'=68 +'%'=69 +']'=72 +'metadata'=78 +'as'=86 +'on'=90 +'with'=91 +'info'=108 +'functions'=112 +':'=116 diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.ts b/packages/kbn-esql-ast/src/antlr/esql_parser.ts index b6b55f3c1d089..f2903de828ca5 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.ts +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.ts @@ -1,5 +1,5 @@ // @ts-nocheck -// Generated from src/antlr/esql_parser.g4 by ANTLR 4.13.1 +// Generated from src/antlr/esql_parser.g4 by ANTLR 4.13.2 // noinspection ES6UnusedImports,JSUnusedGlobalSymbols,JSUnusedLocalSymbols import { @@ -38,112 +38,113 @@ export default class esql_parser extends Parser { public static readonly SORT = 18; public static readonly STATS = 19; public static readonly WHERE = 20; - public static readonly UNKNOWN_CMD = 21; - public static readonly LINE_COMMENT = 22; - public static readonly MULTILINE_COMMENT = 23; - public static readonly WS = 24; - public static readonly UNQUOTED_SOURCE = 25; - public static readonly EXPLAIN_WS = 26; - public static readonly EXPLAIN_LINE_COMMENT = 27; - public static readonly EXPLAIN_MULTILINE_COMMENT = 28; - public static readonly PIPE = 29; - public static readonly QUOTED_STRING = 30; - public static readonly INTEGER_LITERAL = 31; - public static readonly DECIMAL_LITERAL = 32; - public static readonly BY = 33; - public static readonly AND = 34; - public static readonly ASC = 35; - public static readonly ASSIGN = 36; - public static readonly CAST_OP = 37; - public static readonly COMMA = 38; - public static readonly DESC = 39; - public static readonly DOT = 40; - public static readonly FALSE = 41; - public static readonly FIRST = 42; - public static readonly IN = 43; - public static readonly IS = 44; - public static readonly LAST = 45; - public static readonly LIKE = 46; - public static readonly LP = 47; - public static readonly MATCH = 48; - public static readonly NOT = 49; - public static readonly NULL = 50; - public static readonly NULLS = 51; - public static readonly OR = 52; - public static readonly PARAM = 53; - public static readonly RLIKE = 54; - public static readonly RP = 55; - public static readonly TRUE = 56; - public static readonly EQ = 57; - public static readonly CIEQ = 58; - public static readonly NEQ = 59; - public static readonly LT = 60; - public static readonly LTE = 61; - public static readonly GT = 62; - public static readonly GTE = 63; - public static readonly PLUS = 64; - public static readonly MINUS = 65; - public static readonly ASTERISK = 66; - public static readonly SLASH = 67; - public static readonly PERCENT = 68; - public static readonly NAMED_OR_POSITIONAL_PARAM = 69; - public static readonly OPENING_BRACKET = 70; - public static readonly CLOSING_BRACKET = 71; - public static readonly UNQUOTED_IDENTIFIER = 72; - public static readonly QUOTED_IDENTIFIER = 73; - public static readonly EXPR_LINE_COMMENT = 74; - public static readonly EXPR_MULTILINE_COMMENT = 75; - public static readonly EXPR_WS = 76; - public static readonly METADATA = 77; - public static readonly FROM_LINE_COMMENT = 78; - public static readonly FROM_MULTILINE_COMMENT = 79; - public static readonly FROM_WS = 80; - public static readonly ID_PATTERN = 81; - public static readonly PROJECT_LINE_COMMENT = 82; - public static readonly PROJECT_MULTILINE_COMMENT = 83; - public static readonly PROJECT_WS = 84; - public static readonly AS = 85; - public static readonly RENAME_LINE_COMMENT = 86; - public static readonly RENAME_MULTILINE_COMMENT = 87; - public static readonly RENAME_WS = 88; - public static readonly ON = 89; - public static readonly WITH = 90; - public static readonly ENRICH_POLICY_NAME = 91; - public static readonly ENRICH_LINE_COMMENT = 92; - public static readonly ENRICH_MULTILINE_COMMENT = 93; - public static readonly ENRICH_WS = 94; - public static readonly ENRICH_FIELD_LINE_COMMENT = 95; - public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 96; - public static readonly ENRICH_FIELD_WS = 97; - public static readonly LOOKUP_LINE_COMMENT = 98; - public static readonly LOOKUP_MULTILINE_COMMENT = 99; - public static readonly LOOKUP_WS = 100; - public static readonly LOOKUP_FIELD_LINE_COMMENT = 101; - public static readonly LOOKUP_FIELD_MULTILINE_COMMENT = 102; - public static readonly LOOKUP_FIELD_WS = 103; - public static readonly MVEXPAND_LINE_COMMENT = 104; - public static readonly MVEXPAND_MULTILINE_COMMENT = 105; - public static readonly MVEXPAND_WS = 106; - public static readonly INFO = 107; - public static readonly SHOW_LINE_COMMENT = 108; - public static readonly SHOW_MULTILINE_COMMENT = 109; - public static readonly SHOW_WS = 110; - public static readonly FUNCTIONS = 111; - public static readonly META_LINE_COMMENT = 112; - public static readonly META_MULTILINE_COMMENT = 113; - public static readonly META_WS = 114; - public static readonly COLON = 115; - public static readonly SETTING = 116; - public static readonly SETTING_LINE_COMMENT = 117; - public static readonly SETTTING_MULTILINE_COMMENT = 118; - public static readonly SETTING_WS = 119; - public static readonly METRICS_LINE_COMMENT = 120; - public static readonly METRICS_MULTILINE_COMMENT = 121; - public static readonly METRICS_WS = 122; - public static readonly CLOSING_METRICS_LINE_COMMENT = 123; - public static readonly CLOSING_METRICS_MULTILINE_COMMENT = 124; - public static readonly CLOSING_METRICS_WS = 125; - public static readonly EOF = Token.EOF; + public static readonly MATCH = 21; + public static readonly UNKNOWN_CMD = 22; + public static readonly LINE_COMMENT = 23; + public static readonly MULTILINE_COMMENT = 24; + public static readonly WS = 25; + public static readonly UNQUOTED_SOURCE = 26; + public static readonly EXPLAIN_WS = 27; + public static readonly EXPLAIN_LINE_COMMENT = 28; + public static readonly EXPLAIN_MULTILINE_COMMENT = 29; + public static readonly PIPE = 30; + public static readonly QUOTED_STRING = 31; + public static readonly INTEGER_LITERAL = 32; + public static readonly DECIMAL_LITERAL = 33; + public static readonly BY = 34; + public static readonly AND = 35; + public static readonly ASC = 36; + public static readonly ASSIGN = 37; + public static readonly CAST_OP = 38; + public static readonly COMMA = 39; + public static readonly DESC = 40; + public static readonly DOT = 41; + public static readonly FALSE = 42; + public static readonly FIRST = 43; + public static readonly IN = 44; + public static readonly IS = 45; + public static readonly LAST = 46; + public static readonly LIKE = 47; + public static readonly LP = 48; + public static readonly MATCH_OPERATOR = 49; + public static readonly NOT = 50; + public static readonly NULL = 51; + public static readonly NULLS = 52; + public static readonly OR = 53; + public static readonly PARAM = 54; + public static readonly RLIKE = 55; + public static readonly RP = 56; + public static readonly TRUE = 57; + public static readonly EQ = 58; + public static readonly CIEQ = 59; + public static readonly NEQ = 60; + public static readonly LT = 61; + public static readonly LTE = 62; + public static readonly GT = 63; + public static readonly GTE = 64; + public static readonly PLUS = 65; + public static readonly MINUS = 66; + public static readonly ASTERISK = 67; + public static readonly SLASH = 68; + public static readonly PERCENT = 69; + public static readonly NAMED_OR_POSITIONAL_PARAM = 70; + public static readonly OPENING_BRACKET = 71; + public static readonly CLOSING_BRACKET = 72; + public static readonly UNQUOTED_IDENTIFIER = 73; + public static readonly QUOTED_IDENTIFIER = 74; + public static readonly EXPR_LINE_COMMENT = 75; + public static readonly EXPR_MULTILINE_COMMENT = 76; + public static readonly EXPR_WS = 77; + public static readonly METADATA = 78; + public static readonly FROM_LINE_COMMENT = 79; + public static readonly FROM_MULTILINE_COMMENT = 80; + public static readonly FROM_WS = 81; + public static readonly ID_PATTERN = 82; + public static readonly PROJECT_LINE_COMMENT = 83; + public static readonly PROJECT_MULTILINE_COMMENT = 84; + public static readonly PROJECT_WS = 85; + public static readonly AS = 86; + public static readonly RENAME_LINE_COMMENT = 87; + public static readonly RENAME_MULTILINE_COMMENT = 88; + public static readonly RENAME_WS = 89; + public static readonly ON = 90; + public static readonly WITH = 91; + public static readonly ENRICH_POLICY_NAME = 92; + public static readonly ENRICH_LINE_COMMENT = 93; + public static readonly ENRICH_MULTILINE_COMMENT = 94; + public static readonly ENRICH_WS = 95; + public static readonly ENRICH_FIELD_LINE_COMMENT = 96; + public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 97; + public static readonly ENRICH_FIELD_WS = 98; + public static readonly LOOKUP_LINE_COMMENT = 99; + public static readonly LOOKUP_MULTILINE_COMMENT = 100; + public static readonly LOOKUP_WS = 101; + public static readonly LOOKUP_FIELD_LINE_COMMENT = 102; + public static readonly LOOKUP_FIELD_MULTILINE_COMMENT = 103; + public static readonly LOOKUP_FIELD_WS = 104; + public static readonly MVEXPAND_LINE_COMMENT = 105; + public static readonly MVEXPAND_MULTILINE_COMMENT = 106; + public static readonly MVEXPAND_WS = 107; + public static readonly INFO = 108; + public static readonly SHOW_LINE_COMMENT = 109; + public static readonly SHOW_MULTILINE_COMMENT = 110; + public static readonly SHOW_WS = 111; + public static readonly FUNCTIONS = 112; + public static readonly META_LINE_COMMENT = 113; + public static readonly META_MULTILINE_COMMENT = 114; + public static readonly META_WS = 115; + public static readonly COLON = 116; + public static readonly SETTING = 117; + public static readonly SETTING_LINE_COMMENT = 118; + public static readonly SETTTING_MULTILINE_COMMENT = 119; + public static readonly SETTING_WS = 120; + public static readonly METRICS_LINE_COMMENT = 121; + public static readonly METRICS_MULTILINE_COMMENT = 122; + public static readonly METRICS_WS = 123; + public static readonly CLOSING_METRICS_LINE_COMMENT = 124; + public static readonly CLOSING_METRICS_MULTILINE_COMMENT = 125; + public static readonly CLOSING_METRICS_WS = 126; + public static override readonly EOF = Token.EOF; public static readonly RULE_singleStatement = 0; public static readonly RULE_query = 1; public static readonly RULE_sourceCommand = 2; @@ -203,6 +204,8 @@ export default class esql_parser extends Parser { public static readonly RULE_enrichCommand = 56; public static readonly RULE_enrichWithClause = 57; public static readonly RULE_lookupCommand = 58; + public static readonly RULE_matchCommand = 59; + public static readonly RULE_matchQuery = 60; public static readonly literalNames: (string | null)[] = [ null, "'dissect'", "'drop'", "'enrich'", "'eval'", "'explain'", @@ -219,31 +222,32 @@ export default class esql_parser extends Parser { null, null, null, null, null, null, - null, "'|'", null, null, - null, "'by'", - "'and'", "'asc'", - "'='", "'::'", - "','", "'desc'", - "'.'", "'false'", - "'first'", "'in'", - "'is'", "'last'", - "'like'", "'('", - "'match'", "'not'", - "'null'", "'nulls'", - "'or'", "'?'", - "'rlike'", "')'", - "'true'", "'=='", - "'=~'", "'!='", - "'<'", "'<='", - "'>'", "'>='", - "'+'", "'-'", - "'*'", "'/'", - "'%'", null, - null, "']'", + "'|'", null, null, null, + "'by'", "'and'", + "'asc'", "'='", + "'::'", "','", + "'desc'", "'.'", + "'false'", "'first'", + "'in'", "'is'", + "'last'", "'like'", + "'('", null, + "'not'", "'null'", + "'nulls'", "'or'", + "'?'", "'rlike'", + "')'", "'true'", + "'=='", "'=~'", + "'!='", "'<'", + "'<='", "'>'", + "'>='", "'+'", + "'-'", "'*'", + "'/'", "'%'", null, null, - null, "'metadata'", + "']'", null, + null, null, + null, null, + "'metadata'", null, null, null, null, null, null, @@ -275,7 +279,7 @@ export default class esql_parser extends Parser { "RENAME", "ROW", "SHOW", "SORT", "STATS", "WHERE", - "UNKNOWN_CMD", + "MATCH", "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "UNQUOTED_SOURCE", @@ -293,16 +297,16 @@ export default class esql_parser extends Parser { "FIRST", "IN", "IS", "LAST", "LIKE", "LP", - "MATCH", "NOT", - "NULL", "NULLS", - "OR", "PARAM", - "RLIKE", "RP", - "TRUE", "EQ", - "CIEQ", "NEQ", - "LT", "LTE", - "GT", "GTE", - "PLUS", "MINUS", - "ASTERISK", + "MATCH_OPERATOR", + "NOT", "NULL", + "NULLS", "OR", + "PARAM", "RLIKE", + "RP", "TRUE", + "EQ", "CIEQ", + "NEQ", "LT", + "LTE", "GT", + "GTE", "PLUS", + "MINUS", "ASTERISK", "SLASH", "PERCENT", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", @@ -371,7 +375,8 @@ export default class esql_parser extends Parser { "dissectCommand", "grokCommand", "mvExpandCommand", "commandOptions", "commandOption", "booleanValue", "numericValue", "decimalValue", "integerValue", "string", "comparisonOperator", "explainCommand", "subqueryExpression", - "showCommand", "metaCommand", "enrichCommand", "enrichWithClause", "lookupCommand", + "showCommand", "metaCommand", "enrichCommand", "enrichWithClause", "lookupCommand", + "matchCommand", "matchQuery", ]; public get grammarFileName(): string { return "esql_parser.g4"; } public get literalNames(): (string | null)[] { return esql_parser.literalNames; } @@ -394,9 +399,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 118; + this.state = 122; this.query(0); - this.state = 119; + this.state = 123; this.match(esql_parser.EOF); } } @@ -438,11 +443,11 @@ export default class esql_parser extends Parser { this._ctx = localctx; _prevctx = localctx; - this.state = 122; + this.state = 126; this.sourceCommand(); } this._ctx.stop = this._input.LT(-1); - this.state = 129; + this.state = 133; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 0, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -455,18 +460,18 @@ export default class esql_parser extends Parser { { localctx = new CompositeQueryContext(this, new QueryContext(this, _parentctx, _parentState)); this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_query); - this.state = 124; + this.state = 128; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } - this.state = 125; + this.state = 129; this.match(esql_parser.PIPE); - this.state = 126; + this.state = 130; this.processingCommand(); } } } - this.state = 131; + this.state = 135; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 0, this._ctx); } @@ -491,48 +496,48 @@ export default class esql_parser extends Parser { let localctx: SourceCommandContext = new SourceCommandContext(this, this._ctx, this.state); this.enterRule(localctx, 4, esql_parser.RULE_sourceCommand); try { - this.state = 138; + this.state = 142; this._errHandler.sync(this); switch (this._input.LA(1)) { case 5: this.enterOuterAlt(localctx, 1); { - this.state = 132; + this.state = 136; this.explainCommand(); } break; case 6: this.enterOuterAlt(localctx, 2); { - this.state = 133; + this.state = 137; this.fromCommand(); } break; case 16: this.enterOuterAlt(localctx, 3); { - this.state = 134; + this.state = 138; this.rowCommand(); } break; case 13: this.enterOuterAlt(localctx, 4); { - this.state = 135; + this.state = 139; this.metricsCommand(); } break; case 17: this.enterOuterAlt(localctx, 5); { - this.state = 136; + this.state = 140; this.showCommand(); } break; case 12: this.enterOuterAlt(localctx, 6); { - this.state = 137; + this.state = 141; this.metaCommand(); } break; @@ -559,107 +564,114 @@ export default class esql_parser extends Parser { let localctx: ProcessingCommandContext = new ProcessingCommandContext(this, this._ctx, this.state); this.enterRule(localctx, 6, esql_parser.RULE_processingCommand); try { - this.state = 154; + this.state = 159; this._errHandler.sync(this); switch (this._input.LA(1)) { case 4: this.enterOuterAlt(localctx, 1); { - this.state = 140; + this.state = 144; this.evalCommand(); } break; case 8: this.enterOuterAlt(localctx, 2); { - this.state = 141; + this.state = 145; this.inlinestatsCommand(); } break; case 10: this.enterOuterAlt(localctx, 3); { - this.state = 142; + this.state = 146; this.limitCommand(); } break; case 11: this.enterOuterAlt(localctx, 4); { - this.state = 143; + this.state = 147; this.lookupCommand(); } break; case 9: this.enterOuterAlt(localctx, 5); { - this.state = 144; + this.state = 148; this.keepCommand(); } break; case 18: this.enterOuterAlt(localctx, 6); { - this.state = 145; + this.state = 149; this.sortCommand(); } break; case 19: this.enterOuterAlt(localctx, 7); { - this.state = 146; + this.state = 150; this.statsCommand(); } break; case 20: this.enterOuterAlt(localctx, 8); { - this.state = 147; + this.state = 151; this.whereCommand(); } break; case 2: this.enterOuterAlt(localctx, 9); { - this.state = 148; + this.state = 152; this.dropCommand(); } break; case 15: this.enterOuterAlt(localctx, 10); { - this.state = 149; + this.state = 153; this.renameCommand(); } break; case 1: this.enterOuterAlt(localctx, 11); { - this.state = 150; + this.state = 154; this.dissectCommand(); } break; case 7: this.enterOuterAlt(localctx, 12); { - this.state = 151; + this.state = 155; this.grokCommand(); } break; case 3: this.enterOuterAlt(localctx, 13); { - this.state = 152; + this.state = 156; this.enrichCommand(); } break; case 14: this.enterOuterAlt(localctx, 14); { - this.state = 153; + this.state = 157; this.mvExpandCommand(); } break; + case 21: + this.enterOuterAlt(localctx, 15); + { + this.state = 158; + this.matchCommand(); + } + break; default: throw new NoViableAltException(this); } @@ -685,9 +697,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 156; + this.state = 161; this.match(esql_parser.WHERE); - this.state = 157; + this.state = 162; this.booleanExpression(0); } } @@ -725,7 +737,7 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 188; + this.state = 193; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 6, this._ctx) ) { case 1: @@ -734,9 +746,9 @@ export default class esql_parser extends Parser { this._ctx = localctx; _prevctx = localctx; - this.state = 160; + this.state = 165; this.match(esql_parser.NOT); - this.state = 161; + this.state = 166; this.booleanExpression(8); } break; @@ -745,7 +757,7 @@ export default class esql_parser extends Parser { localctx = new BooleanDefaultContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 162; + this.state = 167; this.valueExpression(); } break; @@ -754,7 +766,7 @@ export default class esql_parser extends Parser { localctx = new RegexExpressionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 163; + this.state = 168; this.regexBooleanExpression(); } break; @@ -763,7 +775,7 @@ export default class esql_parser extends Parser { localctx = new MatchExpressionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 164; + this.state = 169; this.matchBooleanExpression(); } break; @@ -772,41 +784,41 @@ export default class esql_parser extends Parser { localctx = new LogicalInContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 165; + this.state = 170; this.valueExpression(); - this.state = 167; + this.state = 172; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===49) { + if (_la===50) { { - this.state = 166; + this.state = 171; this.match(esql_parser.NOT); } } - this.state = 169; + this.state = 174; this.match(esql_parser.IN); - this.state = 170; + this.state = 175; this.match(esql_parser.LP); - this.state = 171; - this.valueExpression(); this.state = 176; + this.valueExpression(); + this.state = 181; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===38) { + while (_la===39) { { { - this.state = 172; + this.state = 177; this.match(esql_parser.COMMA); - this.state = 173; + this.state = 178; this.valueExpression(); } } - this.state = 178; + this.state = 183; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 179; + this.state = 184; this.match(esql_parser.RP); } break; @@ -815,27 +827,27 @@ export default class esql_parser extends Parser { localctx = new IsNullContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 181; + this.state = 186; this.valueExpression(); - this.state = 182; + this.state = 187; this.match(esql_parser.IS); - this.state = 184; + this.state = 189; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===49) { + if (_la===50) { { - this.state = 183; + this.state = 188; this.match(esql_parser.NOT); } } - this.state = 186; + this.state = 191; this.match(esql_parser.NULL); } break; } this._ctx.stop = this._input.LT(-1); - this.state = 198; + this.state = 203; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 8, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -845,7 +857,7 @@ export default class esql_parser extends Parser { } _prevctx = localctx; { - this.state = 196; + this.state = 201; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 7, this._ctx) ) { case 1: @@ -853,13 +865,13 @@ export default class esql_parser extends Parser { localctx = new LogicalBinaryContext(this, new BooleanExpressionContext(this, _parentctx, _parentState)); (localctx as LogicalBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_booleanExpression); - this.state = 190; + this.state = 195; if (!(this.precpred(this._ctx, 4))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 4)"); } - this.state = 191; + this.state = 196; (localctx as LogicalBinaryContext)._operator = this.match(esql_parser.AND); - this.state = 192; + this.state = 197; (localctx as LogicalBinaryContext)._right = this.booleanExpression(5); } break; @@ -868,20 +880,20 @@ export default class esql_parser extends Parser { localctx = new LogicalBinaryContext(this, new BooleanExpressionContext(this, _parentctx, _parentState)); (localctx as LogicalBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_booleanExpression); - this.state = 193; + this.state = 198; if (!(this.precpred(this._ctx, 3))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 3)"); } - this.state = 194; + this.state = 199; (localctx as LogicalBinaryContext)._operator = this.match(esql_parser.OR); - this.state = 195; + this.state = 200; (localctx as LogicalBinaryContext)._right = this.booleanExpression(4); } break; } } } - this.state = 200; + this.state = 205; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 8, this._ctx); } @@ -907,48 +919,48 @@ export default class esql_parser extends Parser { this.enterRule(localctx, 12, esql_parser.RULE_regexBooleanExpression); let _la: number; try { - this.state = 215; + this.state = 220; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 11, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 201; + this.state = 206; this.valueExpression(); - this.state = 203; + this.state = 208; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===49) { + if (_la===50) { { - this.state = 202; + this.state = 207; this.match(esql_parser.NOT); } } - this.state = 205; + this.state = 210; localctx._kind = this.match(esql_parser.LIKE); - this.state = 206; + this.state = 211; localctx._pattern = this.string_(); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 208; + this.state = 213; this.valueExpression(); - this.state = 210; + this.state = 215; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===49) { + if (_la===50) { { - this.state = 209; + this.state = 214; this.match(esql_parser.NOT); } } - this.state = 212; + this.state = 217; localctx._kind = this.match(esql_parser.RLIKE); - this.state = 213; + this.state = 218; localctx._pattern = this.string_(); } break; @@ -975,11 +987,11 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 217; + this.state = 222; this.qualifiedName(); - this.state = 218; - this.match(esql_parser.MATCH); - this.state = 219; + this.state = 223; + this.match(esql_parser.MATCH_OPERATOR); + this.state = 224; localctx._queryString = this.string_(); } } @@ -1002,14 +1014,14 @@ export default class esql_parser extends Parser { let localctx: ValueExpressionContext = new ValueExpressionContext(this, this._ctx, this.state); this.enterRule(localctx, 16, esql_parser.RULE_valueExpression); try { - this.state = 226; + this.state = 231; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 12, this._ctx) ) { case 1: localctx = new ValueExpressionDefaultContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 221; + this.state = 226; this.operatorExpression(0); } break; @@ -1017,11 +1029,11 @@ export default class esql_parser extends Parser { localctx = new ComparisonContext(this, localctx); this.enterOuterAlt(localctx, 2); { - this.state = 222; + this.state = 227; (localctx as ComparisonContext)._left = this.operatorExpression(0); - this.state = 223; + this.state = 228; this.comparisonOperator(); - this.state = 224; + this.state = 229; (localctx as ComparisonContext)._right = this.operatorExpression(0); } break; @@ -1061,7 +1073,7 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 232; + this.state = 237; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 13, this._ctx) ) { case 1: @@ -1070,7 +1082,7 @@ export default class esql_parser extends Parser { this._ctx = localctx; _prevctx = localctx; - this.state = 229; + this.state = 234; this.primaryExpression(0); } break; @@ -1079,23 +1091,23 @@ export default class esql_parser extends Parser { localctx = new ArithmeticUnaryContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 230; + this.state = 235; (localctx as ArithmeticUnaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===64 || _la===65)) { + if(!(_la===65 || _la===66)) { (localctx as ArithmeticUnaryContext)._operator = this._errHandler.recoverInline(this); } else { this._errHandler.reportMatch(this); this.consume(); } - this.state = 231; + this.state = 236; this.operatorExpression(3); } break; } this._ctx.stop = this._input.LT(-1); - this.state = 242; + this.state = 247; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 15, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1105,7 +1117,7 @@ export default class esql_parser extends Parser { } _prevctx = localctx; { - this.state = 240; + this.state = 245; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 14, this._ctx) ) { case 1: @@ -1113,21 +1125,21 @@ export default class esql_parser extends Parser { localctx = new ArithmeticBinaryContext(this, new OperatorExpressionContext(this, _parentctx, _parentState)); (localctx as ArithmeticBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_operatorExpression); - this.state = 234; + this.state = 239; if (!(this.precpred(this._ctx, 2))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 2)"); } - this.state = 235; + this.state = 240; (localctx as ArithmeticBinaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); - if(!(((((_la - 66)) & ~0x1F) === 0 && ((1 << (_la - 66)) & 7) !== 0))) { + if(!(((((_la - 67)) & ~0x1F) === 0 && ((1 << (_la - 67)) & 7) !== 0))) { (localctx as ArithmeticBinaryContext)._operator = this._errHandler.recoverInline(this); } else { this._errHandler.reportMatch(this); this.consume(); } - this.state = 236; + this.state = 241; (localctx as ArithmeticBinaryContext)._right = this.operatorExpression(3); } break; @@ -1136,28 +1148,28 @@ export default class esql_parser extends Parser { localctx = new ArithmeticBinaryContext(this, new OperatorExpressionContext(this, _parentctx, _parentState)); (localctx as ArithmeticBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_operatorExpression); - this.state = 237; + this.state = 242; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } - this.state = 238; + this.state = 243; (localctx as ArithmeticBinaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===64 || _la===65)) { + if(!(_la===65 || _la===66)) { (localctx as ArithmeticBinaryContext)._operator = this._errHandler.recoverInline(this); } else { this._errHandler.reportMatch(this); this.consume(); } - this.state = 239; + this.state = 244; (localctx as ArithmeticBinaryContext)._right = this.operatorExpression(2); } break; } } } - this.state = 244; + this.state = 249; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 15, this._ctx); } @@ -1196,7 +1208,7 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 253; + this.state = 258; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 16, this._ctx) ) { case 1: @@ -1205,7 +1217,7 @@ export default class esql_parser extends Parser { this._ctx = localctx; _prevctx = localctx; - this.state = 246; + this.state = 251; this.constant(); } break; @@ -1214,7 +1226,7 @@ export default class esql_parser extends Parser { localctx = new DereferenceContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 247; + this.state = 252; this.qualifiedName(); } break; @@ -1223,7 +1235,7 @@ export default class esql_parser extends Parser { localctx = new FunctionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 248; + this.state = 253; this.functionExpression(); } break; @@ -1232,17 +1244,17 @@ export default class esql_parser extends Parser { localctx = new ParenthesizedExpressionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 249; + this.state = 254; this.match(esql_parser.LP); - this.state = 250; + this.state = 255; this.booleanExpression(0); - this.state = 251; + this.state = 256; this.match(esql_parser.RP); } break; } this._ctx.stop = this._input.LT(-1); - this.state = 260; + this.state = 265; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 17, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1255,18 +1267,18 @@ export default class esql_parser extends Parser { { localctx = new InlineCastContext(this, new PrimaryExpressionContext(this, _parentctx, _parentState)); this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_primaryExpression); - this.state = 255; + this.state = 260; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } - this.state = 256; + this.state = 261; this.match(esql_parser.CAST_OP); - this.state = 257; + this.state = 262; this.dataType(); } } } - this.state = 262; + this.state = 267; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 17, this._ctx); } @@ -1294,63 +1306,63 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 263; + this.state = 268; this.identifier(); - this.state = 264; + this.state = 269; this.match(esql_parser.LP); - this.state = 274; + this.state = 279; this._errHandler.sync(this); switch (this._input.LA(1)) { - case 66: + case 67: { - this.state = 265; + this.state = 270; this.match(esql_parser.ASTERISK); } break; - case 30: case 31: case 32: - case 41: - case 47: - case 49: + case 33: + case 42: + case 48: case 50: - case 53: - case 56: - case 64: + case 51: + case 54: + case 57: case 65: - case 69: + case 66: case 70: - case 72: + case 71: case 73: + case 74: { { - this.state = 266; - this.booleanExpression(0); this.state = 271; + this.booleanExpression(0); + this.state = 276; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===38) { + while (_la===39) { { { - this.state = 267; + this.state = 272; this.match(esql_parser.COMMA); - this.state = 268; + this.state = 273; this.booleanExpression(0); } } - this.state = 273; + this.state = 278; this._errHandler.sync(this); _la = this._input.LA(1); } } } break; - case 55: + case 56: break; default: break; } - this.state = 276; + this.state = 281; this.match(esql_parser.RP); } } @@ -1376,7 +1388,7 @@ export default class esql_parser extends Parser { localctx = new ToDataTypeContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 278; + this.state = 283; this.identifier(); } } @@ -1401,9 +1413,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 280; + this.state = 285; this.match(esql_parser.ROW); - this.state = 281; + this.state = 286; this.fields(); } } @@ -1429,23 +1441,23 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 283; - this.field(); this.state = 288; + this.field(); + this.state = 293; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 20, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 284; + this.state = 289; this.match(esql_parser.COMMA); - this.state = 285; + this.state = 290; this.field(); } } } - this.state = 290; + this.state = 295; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 20, this._ctx); } @@ -1470,24 +1482,24 @@ export default class esql_parser extends Parser { let localctx: FieldContext = new FieldContext(this, this._ctx, this.state); this.enterRule(localctx, 30, esql_parser.RULE_field); try { - this.state = 296; + this.state = 301; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 21, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 291; + this.state = 296; this.booleanExpression(0); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 292; + this.state = 297; this.qualifiedName(); - this.state = 293; + this.state = 298; this.match(esql_parser.ASSIGN); - this.state = 294; + this.state = 299; this.booleanExpression(0); } break; @@ -1515,34 +1527,34 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 298; + this.state = 303; this.match(esql_parser.FROM); - this.state = 299; - this.indexPattern(); this.state = 304; + this.indexPattern(); + this.state = 309; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 22, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 300; + this.state = 305; this.match(esql_parser.COMMA); - this.state = 301; + this.state = 306; this.indexPattern(); } } } - this.state = 306; + this.state = 311; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 22, this._ctx); } - this.state = 308; + this.state = 313; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 23, this._ctx) ) { case 1: { - this.state = 307; + this.state = 312; this.metadata(); } break; @@ -1568,24 +1580,24 @@ export default class esql_parser extends Parser { let localctx: IndexPatternContext = new IndexPatternContext(this, this._ctx, this.state); this.enterRule(localctx, 34, esql_parser.RULE_indexPattern); try { - this.state = 315; + this.state = 320; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 24, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 310; + this.state = 315; this.clusterString(); - this.state = 311; + this.state = 316; this.match(esql_parser.COLON); - this.state = 312; + this.state = 317; this.indexString(); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 314; + this.state = 319; this.indexString(); } break; @@ -1612,7 +1624,7 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 317; + this.state = 322; this.match(esql_parser.UNQUOTED_SOURCE); } } @@ -1638,9 +1650,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 319; + this.state = 324; _la = this._input.LA(1); - if(!(_la===25 || _la===30)) { + if(!(_la===26 || _la===31)) { this._errHandler.recoverInline(this); } else { @@ -1668,20 +1680,20 @@ export default class esql_parser extends Parser { let localctx: MetadataContext = new MetadataContext(this, this._ctx, this.state); this.enterRule(localctx, 40, esql_parser.RULE_metadata); try { - this.state = 323; + this.state = 328; this._errHandler.sync(this); switch (this._input.LA(1)) { - case 77: + case 78: this.enterOuterAlt(localctx, 1); { - this.state = 321; + this.state = 326; this.metadataOption(); } break; - case 70: + case 71: this.enterOuterAlt(localctx, 2); { - this.state = 322; + this.state = 327; this.deprecated_metadata(); } break; @@ -1711,25 +1723,25 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 325; + this.state = 330; this.match(esql_parser.METADATA); - this.state = 326; - this.match(esql_parser.UNQUOTED_SOURCE); this.state = 331; + this.match(esql_parser.UNQUOTED_SOURCE); + this.state = 336; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 26, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 327; + this.state = 332; this.match(esql_parser.COMMA); - this.state = 328; + this.state = 333; this.match(esql_parser.UNQUOTED_SOURCE); } } } - this.state = 333; + this.state = 338; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 26, this._ctx); } @@ -1756,11 +1768,11 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 334; + this.state = 339; this.match(esql_parser.OPENING_BRACKET); - this.state = 335; + this.state = 340; this.metadataOption(); - this.state = 336; + this.state = 341; this.match(esql_parser.CLOSING_BRACKET); } } @@ -1786,46 +1798,46 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 338; + this.state = 343; this.match(esql_parser.METRICS); - this.state = 339; - this.indexPattern(); this.state = 344; + this.indexPattern(); + this.state = 349; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 27, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 340; + this.state = 345; this.match(esql_parser.COMMA); - this.state = 341; + this.state = 346; this.indexPattern(); } } } - this.state = 346; + this.state = 351; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 27, this._ctx); } - this.state = 348; + this.state = 353; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 28, this._ctx) ) { case 1: { - this.state = 347; + this.state = 352; localctx._aggregates = this.fields(); } break; } - this.state = 352; + this.state = 357; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 29, this._ctx) ) { case 1: { - this.state = 350; + this.state = 355; this.match(esql_parser.BY); - this.state = 351; + this.state = 356; localctx._grouping = this.fields(); } break; @@ -1853,9 +1865,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 354; + this.state = 359; this.match(esql_parser.EVAL); - this.state = 355; + this.state = 360; this.fields(); } } @@ -1880,26 +1892,26 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 357; + this.state = 362; this.match(esql_parser.STATS); - this.state = 359; + this.state = 364; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 30, this._ctx) ) { case 1: { - this.state = 358; + this.state = 363; localctx._stats = this.fields(); } break; } - this.state = 363; + this.state = 368; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 31, this._ctx) ) { case 1: { - this.state = 361; + this.state = 366; this.match(esql_parser.BY); - this.state = 362; + this.state = 367; localctx._grouping = this.fields(); } break; @@ -1927,18 +1939,18 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 365; + this.state = 370; this.match(esql_parser.INLINESTATS); - this.state = 366; + this.state = 371; localctx._stats = this.fields(); - this.state = 369; + this.state = 374; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 32, this._ctx) ) { case 1: { - this.state = 367; + this.state = 372; this.match(esql_parser.BY); - this.state = 368; + this.state = 373; localctx._grouping = this.fields(); } break; @@ -1967,23 +1979,23 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 371; - this.identifier(); this.state = 376; + this.identifier(); + this.state = 381; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 33, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 372; + this.state = 377; this.match(esql_parser.DOT); - this.state = 373; + this.state = 378; this.identifier(); } } } - this.state = 378; + this.state = 383; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 33, this._ctx); } @@ -2011,23 +2023,23 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 379; - this.identifierPattern(); this.state = 384; + this.identifierPattern(); + this.state = 389; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 34, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 380; + this.state = 385; this.match(esql_parser.DOT); - this.state = 381; + this.state = 386; this.identifierPattern(); } } } - this.state = 386; + this.state = 391; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 34, this._ctx); } @@ -2055,23 +2067,23 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 387; - this.qualifiedNamePattern(); this.state = 392; + this.qualifiedNamePattern(); + this.state = 397; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 35, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 388; + this.state = 393; this.match(esql_parser.COMMA); - this.state = 389; + this.state = 394; this.qualifiedNamePattern(); } } } - this.state = 394; + this.state = 399; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 35, this._ctx); } @@ -2099,9 +2111,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 395; + this.state = 400; _la = this._input.LA(1); - if(!(_la===72 || _la===73)) { + if(!(_la===73 || _la===74)) { this._errHandler.recoverInline(this); } else { @@ -2131,7 +2143,7 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 397; + this.state = 402; this.match(esql_parser.ID_PATTERN); } } @@ -2155,14 +2167,14 @@ export default class esql_parser extends Parser { this.enterRule(localctx, 64, esql_parser.RULE_constant); let _la: number; try { - this.state = 441; + this.state = 446; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 39, this._ctx) ) { case 1: localctx = new NullLiteralContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 399; + this.state = 404; this.match(esql_parser.NULL); } break; @@ -2170,9 +2182,9 @@ export default class esql_parser extends Parser { localctx = new QualifiedIntegerLiteralContext(this, localctx); this.enterOuterAlt(localctx, 2); { - this.state = 400; + this.state = 405; this.integerValue(); - this.state = 401; + this.state = 406; this.match(esql_parser.UNQUOTED_IDENTIFIER); } break; @@ -2180,7 +2192,7 @@ export default class esql_parser extends Parser { localctx = new DecimalLiteralContext(this, localctx); this.enterOuterAlt(localctx, 3); { - this.state = 403; + this.state = 408; this.decimalValue(); } break; @@ -2188,7 +2200,7 @@ export default class esql_parser extends Parser { localctx = new IntegerLiteralContext(this, localctx); this.enterOuterAlt(localctx, 4); { - this.state = 404; + this.state = 409; this.integerValue(); } break; @@ -2196,7 +2208,7 @@ export default class esql_parser extends Parser { localctx = new BooleanLiteralContext(this, localctx); this.enterOuterAlt(localctx, 5); { - this.state = 405; + this.state = 410; this.booleanValue(); } break; @@ -2204,7 +2216,7 @@ export default class esql_parser extends Parser { localctx = new InputParamsContext(this, localctx); this.enterOuterAlt(localctx, 6); { - this.state = 406; + this.state = 411; this.params(); } break; @@ -2212,7 +2224,7 @@ export default class esql_parser extends Parser { localctx = new StringLiteralContext(this, localctx); this.enterOuterAlt(localctx, 7); { - this.state = 407; + this.state = 412; this.string_(); } break; @@ -2220,27 +2232,27 @@ export default class esql_parser extends Parser { localctx = new NumericArrayLiteralContext(this, localctx); this.enterOuterAlt(localctx, 8); { - this.state = 408; + this.state = 413; this.match(esql_parser.OPENING_BRACKET); - this.state = 409; - this.numericValue(); this.state = 414; + this.numericValue(); + this.state = 419; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===38) { + while (_la===39) { { { - this.state = 410; + this.state = 415; this.match(esql_parser.COMMA); - this.state = 411; + this.state = 416; this.numericValue(); } } - this.state = 416; + this.state = 421; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 417; + this.state = 422; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -2248,27 +2260,27 @@ export default class esql_parser extends Parser { localctx = new BooleanArrayLiteralContext(this, localctx); this.enterOuterAlt(localctx, 9); { - this.state = 419; + this.state = 424; this.match(esql_parser.OPENING_BRACKET); - this.state = 420; - this.booleanValue(); this.state = 425; + this.booleanValue(); + this.state = 430; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===38) { + while (_la===39) { { { - this.state = 421; + this.state = 426; this.match(esql_parser.COMMA); - this.state = 422; + this.state = 427; this.booleanValue(); } } - this.state = 427; + this.state = 432; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 428; + this.state = 433; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -2276,27 +2288,27 @@ export default class esql_parser extends Parser { localctx = new StringArrayLiteralContext(this, localctx); this.enterOuterAlt(localctx, 10); { - this.state = 430; + this.state = 435; this.match(esql_parser.OPENING_BRACKET); - this.state = 431; - this.string_(); this.state = 436; + this.string_(); + this.state = 441; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===38) { + while (_la===39) { { { - this.state = 432; + this.state = 437; this.match(esql_parser.COMMA); - this.state = 433; + this.state = 438; this.string_(); } } - this.state = 438; + this.state = 443; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 439; + this.state = 444; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -2321,22 +2333,22 @@ export default class esql_parser extends Parser { let localctx: ParamsContext = new ParamsContext(this, this._ctx, this.state); this.enterRule(localctx, 66, esql_parser.RULE_params); try { - this.state = 445; + this.state = 450; this._errHandler.sync(this); switch (this._input.LA(1)) { - case 53: + case 54: localctx = new InputParamContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 443; + this.state = 448; this.match(esql_parser.PARAM); } break; - case 69: + case 70: localctx = new InputNamedOrPositionalParamContext(this, localctx); this.enterOuterAlt(localctx, 2); { - this.state = 444; + this.state = 449; this.match(esql_parser.NAMED_OR_POSITIONAL_PARAM); } break; @@ -2365,9 +2377,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 447; + this.state = 452; this.match(esql_parser.LIMIT); - this.state = 448; + this.state = 453; this.match(esql_parser.INTEGER_LITERAL); } } @@ -2393,25 +2405,25 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 450; + this.state = 455; this.match(esql_parser.SORT); - this.state = 451; - this.orderExpression(); this.state = 456; + this.orderExpression(); + this.state = 461; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 41, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 452; + this.state = 457; this.match(esql_parser.COMMA); - this.state = 453; + this.state = 458; this.orderExpression(); } } } - this.state = 458; + this.state = 463; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 41, this._ctx); } @@ -2439,17 +2451,17 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 459; + this.state = 464; this.booleanExpression(0); - this.state = 461; + this.state = 466; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 42, this._ctx) ) { case 1: { - this.state = 460; + this.state = 465; localctx._ordering = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===35 || _la===39)) { + if(!(_la===36 || _la===40)) { localctx._ordering = this._errHandler.recoverInline(this); } else { @@ -2459,17 +2471,17 @@ export default class esql_parser extends Parser { } break; } - this.state = 465; + this.state = 470; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 43, this._ctx) ) { case 1: { - this.state = 463; + this.state = 468; this.match(esql_parser.NULLS); - this.state = 464; + this.state = 469; localctx._nullOrdering = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===42 || _la===45)) { + if(!(_la===43 || _la===46)) { localctx._nullOrdering = this._errHandler.recoverInline(this); } else { @@ -2502,9 +2514,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 467; + this.state = 472; this.match(esql_parser.KEEP); - this.state = 468; + this.state = 473; this.qualifiedNamePatterns(); } } @@ -2529,9 +2541,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 470; + this.state = 475; this.match(esql_parser.DROP); - this.state = 471; + this.state = 476; this.qualifiedNamePatterns(); } } @@ -2557,25 +2569,25 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 473; + this.state = 478; this.match(esql_parser.RENAME); - this.state = 474; - this.renameClause(); this.state = 479; + this.renameClause(); + this.state = 484; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 44, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 475; + this.state = 480; this.match(esql_parser.COMMA); - this.state = 476; + this.state = 481; this.renameClause(); } } } - this.state = 481; + this.state = 486; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 44, this._ctx); } @@ -2602,11 +2614,11 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 482; + this.state = 487; localctx._oldName = this.qualifiedNamePattern(); - this.state = 483; + this.state = 488; this.match(esql_parser.AS); - this.state = 484; + this.state = 489; localctx._newName = this.qualifiedNamePattern(); } } @@ -2631,18 +2643,18 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 486; + this.state = 491; this.match(esql_parser.DISSECT); - this.state = 487; + this.state = 492; this.primaryExpression(0); - this.state = 488; + this.state = 493; this.string_(); - this.state = 490; + this.state = 495; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 45, this._ctx) ) { case 1: { - this.state = 489; + this.state = 494; this.commandOptions(); } break; @@ -2670,11 +2682,11 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 492; + this.state = 497; this.match(esql_parser.GROK); - this.state = 493; + this.state = 498; this.primaryExpression(0); - this.state = 494; + this.state = 499; this.string_(); } } @@ -2699,9 +2711,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 496; + this.state = 501; this.match(esql_parser.MV_EXPAND); - this.state = 497; + this.state = 502; this.qualifiedName(); } } @@ -2727,23 +2739,23 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 499; - this.commandOption(); this.state = 504; + this.commandOption(); + this.state = 509; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 46, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 500; + this.state = 505; this.match(esql_parser.COMMA); - this.state = 501; + this.state = 506; this.commandOption(); } } } - this.state = 506; + this.state = 511; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 46, this._ctx); } @@ -2770,11 +2782,11 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 507; + this.state = 512; this.identifier(); - this.state = 508; + this.state = 513; this.match(esql_parser.ASSIGN); - this.state = 509; + this.state = 514; this.constant(); } } @@ -2800,9 +2812,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 511; + this.state = 516; _la = this._input.LA(1); - if(!(_la===41 || _la===56)) { + if(!(_la===42 || _la===57)) { this._errHandler.recoverInline(this); } else { @@ -2830,20 +2842,20 @@ export default class esql_parser extends Parser { let localctx: NumericValueContext = new NumericValueContext(this, this._ctx, this.state); this.enterRule(localctx, 94, esql_parser.RULE_numericValue); try { - this.state = 515; + this.state = 520; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 47, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 513; + this.state = 518; this.decimalValue(); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 514; + this.state = 519; this.integerValue(); } break; @@ -2871,14 +2883,14 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 518; + this.state = 523; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===64 || _la===65) { + if (_la===65 || _la===66) { { - this.state = 517; + this.state = 522; _la = this._input.LA(1); - if(!(_la===64 || _la===65)) { + if(!(_la===65 || _la===66)) { this._errHandler.recoverInline(this); } else { @@ -2888,7 +2900,7 @@ export default class esql_parser extends Parser { } } - this.state = 520; + this.state = 525; this.match(esql_parser.DECIMAL_LITERAL); } } @@ -2914,14 +2926,14 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 523; + this.state = 528; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===64 || _la===65) { + if (_la===65 || _la===66) { { - this.state = 522; + this.state = 527; _la = this._input.LA(1); - if(!(_la===64 || _la===65)) { + if(!(_la===65 || _la===66)) { this._errHandler.recoverInline(this); } else { @@ -2931,7 +2943,7 @@ export default class esql_parser extends Parser { } } - this.state = 525; + this.state = 530; this.match(esql_parser.INTEGER_LITERAL); } } @@ -2956,7 +2968,7 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 527; + this.state = 532; this.match(esql_parser.QUOTED_STRING); } } @@ -2982,9 +2994,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 529; + this.state = 534; _la = this._input.LA(1); - if(!(((((_la - 57)) & ~0x1F) === 0 && ((1 << (_la - 57)) & 125) !== 0))) { + if(!(((((_la - 58)) & ~0x1F) === 0 && ((1 << (_la - 58)) & 125) !== 0))) { this._errHandler.recoverInline(this); } else { @@ -3014,9 +3026,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 531; + this.state = 536; this.match(esql_parser.EXPLAIN); - this.state = 532; + this.state = 537; this.subqueryExpression(); } } @@ -3041,11 +3053,11 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 534; + this.state = 539; this.match(esql_parser.OPENING_BRACKET); - this.state = 535; + this.state = 540; this.query(0); - this.state = 536; + this.state = 541; this.match(esql_parser.CLOSING_BRACKET); } } @@ -3071,9 +3083,9 @@ export default class esql_parser extends Parser { localctx = new ShowInfoContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 538; + this.state = 543; this.match(esql_parser.SHOW); - this.state = 539; + this.state = 544; this.match(esql_parser.INFO); } } @@ -3099,9 +3111,9 @@ export default class esql_parser extends Parser { localctx = new MetaFunctionsContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 541; + this.state = 546; this.match(esql_parser.META); - this.state = 542; + this.state = 547; this.match(esql_parser.FUNCTIONS); } } @@ -3127,46 +3139,46 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 544; + this.state = 549; this.match(esql_parser.ENRICH); - this.state = 545; + this.state = 550; localctx._policyName = this.match(esql_parser.ENRICH_POLICY_NAME); - this.state = 548; + this.state = 553; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 50, this._ctx) ) { case 1: { - this.state = 546; + this.state = 551; this.match(esql_parser.ON); - this.state = 547; + this.state = 552; localctx._matchField = this.qualifiedNamePattern(); } break; } - this.state = 559; + this.state = 564; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 52, this._ctx) ) { case 1: { - this.state = 550; + this.state = 555; this.match(esql_parser.WITH); - this.state = 551; - this.enrichWithClause(); this.state = 556; + this.enrichWithClause(); + this.state = 561; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 51, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 552; + this.state = 557; this.match(esql_parser.COMMA); - this.state = 553; + this.state = 558; this.enrichWithClause(); } } } - this.state = 558; + this.state = 563; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 51, this._ctx); } @@ -3196,19 +3208,19 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 564; + this.state = 569; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 53, this._ctx) ) { case 1: { - this.state = 561; + this.state = 566; localctx._newName = this.qualifiedNamePattern(); - this.state = 562; + this.state = 567; this.match(esql_parser.ASSIGN); } break; } - this.state = 566; + this.state = 571; localctx._enrichField = this.qualifiedNamePattern(); } } @@ -3233,13 +3245,13 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 568; + this.state = 573; this.match(esql_parser.LOOKUP); - this.state = 569; + this.state = 574; localctx._tableName = this.indexPattern(); - this.state = 570; + this.state = 575; this.match(esql_parser.ON); - this.state = 571; + this.state = 576; localctx._matchFields = this.qualifiedNamePatterns(); } } @@ -3257,6 +3269,58 @@ export default class esql_parser extends Parser { } return localctx; } + // @RuleVersion(0) + public matchCommand(): MatchCommandContext { + let localctx: MatchCommandContext = new MatchCommandContext(this, this._ctx, this.state); + this.enterRule(localctx, 118, esql_parser.RULE_matchCommand); + try { + this.enterOuterAlt(localctx, 1); + { + this.state = 578; + this.match(esql_parser.MATCH); + this.state = 579; + this.matchQuery(); + } + } + catch (re) { + if (re instanceof RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localctx; + } + // @RuleVersion(0) + public matchQuery(): MatchQueryContext { + let localctx: MatchQueryContext = new MatchQueryContext(this, this._ctx, this.state); + this.enterRule(localctx, 120, esql_parser.RULE_matchQuery); + try { + this.enterOuterAlt(localctx, 1); + { + this.state = 581; + this.match(esql_parser.QUOTED_STRING); + } + } + catch (re) { + if (re instanceof RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localctx; + } public sempred(localctx: RuleContext, ruleIndex: number, predIndex: number): boolean { switch (ruleIndex) { @@ -3304,7 +3368,7 @@ export default class esql_parser extends Parser { return true; } - public static readonly _serializedATN: number[] = [4,1,125,574,2,0,7,0, + public static readonly _serializedATN: number[] = [4,1,126,584,2,0,7,0, 2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9, 2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2, 17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24, @@ -3312,185 +3376,188 @@ export default class esql_parser extends Parser { 31,2,32,7,32,2,33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38, 2,39,7,39,2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45,7,45,2, 46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2,52,7,52,2,53, - 7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58,7,58,1,0,1,0,1,0,1,1, - 1,1,1,1,1,1,1,1,1,1,5,1,128,8,1,10,1,12,1,131,9,1,1,2,1,2,1,2,1,2,1,2,1, - 2,3,2,139,8,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,3, - 3,155,8,3,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,168,8,5,1,5,1, - 5,1,5,1,5,1,5,5,5,175,8,5,10,5,12,5,178,9,5,1,5,1,5,1,5,1,5,1,5,3,5,185, - 8,5,1,5,1,5,3,5,189,8,5,1,5,1,5,1,5,1,5,1,5,1,5,5,5,197,8,5,10,5,12,5,200, - 9,5,1,6,1,6,3,6,204,8,6,1,6,1,6,1,6,1,6,1,6,3,6,211,8,6,1,6,1,6,1,6,3,6, - 216,8,6,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,3,8,227,8,8,1,9,1,9,1,9,1,9, - 3,9,233,8,9,1,9,1,9,1,9,1,9,1,9,1,9,5,9,241,8,9,10,9,12,9,244,9,9,1,10, - 1,10,1,10,1,10,1,10,1,10,1,10,1,10,3,10,254,8,10,1,10,1,10,1,10,5,10,259, - 8,10,10,10,12,10,262,9,10,1,11,1,11,1,11,1,11,1,11,1,11,5,11,270,8,11,10, - 11,12,11,273,9,11,3,11,275,8,11,1,11,1,11,1,12,1,12,1,13,1,13,1,13,1,14, - 1,14,1,14,5,14,287,8,14,10,14,12,14,290,9,14,1,15,1,15,1,15,1,15,1,15,3, - 15,297,8,15,1,16,1,16,1,16,1,16,5,16,303,8,16,10,16,12,16,306,9,16,1,16, - 3,16,309,8,16,1,17,1,17,1,17,1,17,1,17,3,17,316,8,17,1,18,1,18,1,19,1,19, - 1,20,1,20,3,20,324,8,20,1,21,1,21,1,21,1,21,5,21,330,8,21,10,21,12,21,333, - 9,21,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,5,23,343,8,23,10,23,12,23, - 346,9,23,1,23,3,23,349,8,23,1,23,1,23,3,23,353,8,23,1,24,1,24,1,24,1,25, - 1,25,3,25,360,8,25,1,25,1,25,3,25,364,8,25,1,26,1,26,1,26,1,26,3,26,370, - 8,26,1,27,1,27,1,27,5,27,375,8,27,10,27,12,27,378,9,27,1,28,1,28,1,28,5, - 28,383,8,28,10,28,12,28,386,9,28,1,29,1,29,1,29,5,29,391,8,29,10,29,12, - 29,394,9,29,1,30,1,30,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32, - 1,32,1,32,1,32,1,32,1,32,5,32,413,8,32,10,32,12,32,416,9,32,1,32,1,32,1, - 32,1,32,1,32,1,32,5,32,424,8,32,10,32,12,32,427,9,32,1,32,1,32,1,32,1,32, - 1,32,1,32,5,32,435,8,32,10,32,12,32,438,9,32,1,32,1,32,3,32,442,8,32,1, - 33,1,33,3,33,446,8,33,1,34,1,34,1,34,1,35,1,35,1,35,1,35,5,35,455,8,35, - 10,35,12,35,458,9,35,1,36,1,36,3,36,462,8,36,1,36,1,36,3,36,466,8,36,1, - 37,1,37,1,37,1,38,1,38,1,38,1,39,1,39,1,39,1,39,5,39,478,8,39,10,39,12, - 39,481,9,39,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1,41,3,41,491,8,41,1,42, - 1,42,1,42,1,42,1,43,1,43,1,43,1,44,1,44,1,44,5,44,503,8,44,10,44,12,44, - 506,9,44,1,45,1,45,1,45,1,45,1,46,1,46,1,47,1,47,3,47,516,8,47,1,48,3,48, - 519,8,48,1,48,1,48,1,49,3,49,524,8,49,1,49,1,49,1,50,1,50,1,51,1,51,1,52, - 1,52,1,52,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,55,1,55,1,55,1,56,1,56,1, - 56,1,56,3,56,549,8,56,1,56,1,56,1,56,1,56,5,56,555,8,56,10,56,12,56,558, - 9,56,3,56,560,8,56,1,57,1,57,1,57,3,57,565,8,57,1,57,1,57,1,58,1,58,1,58, - 1,58,1,58,1,58,0,4,2,10,18,20,59,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28, - 30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76, - 78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,0, - 8,1,0,64,65,1,0,66,68,2,0,25,25,30,30,1,0,72,73,2,0,35,35,39,39,2,0,42, - 42,45,45,2,0,41,41,56,56,2,0,57,57,59,63,599,0,118,1,0,0,0,2,121,1,0,0, - 0,4,138,1,0,0,0,6,154,1,0,0,0,8,156,1,0,0,0,10,188,1,0,0,0,12,215,1,0,0, - 0,14,217,1,0,0,0,16,226,1,0,0,0,18,232,1,0,0,0,20,253,1,0,0,0,22,263,1, - 0,0,0,24,278,1,0,0,0,26,280,1,0,0,0,28,283,1,0,0,0,30,296,1,0,0,0,32,298, - 1,0,0,0,34,315,1,0,0,0,36,317,1,0,0,0,38,319,1,0,0,0,40,323,1,0,0,0,42, - 325,1,0,0,0,44,334,1,0,0,0,46,338,1,0,0,0,48,354,1,0,0,0,50,357,1,0,0,0, - 52,365,1,0,0,0,54,371,1,0,0,0,56,379,1,0,0,0,58,387,1,0,0,0,60,395,1,0, - 0,0,62,397,1,0,0,0,64,441,1,0,0,0,66,445,1,0,0,0,68,447,1,0,0,0,70,450, - 1,0,0,0,72,459,1,0,0,0,74,467,1,0,0,0,76,470,1,0,0,0,78,473,1,0,0,0,80, - 482,1,0,0,0,82,486,1,0,0,0,84,492,1,0,0,0,86,496,1,0,0,0,88,499,1,0,0,0, - 90,507,1,0,0,0,92,511,1,0,0,0,94,515,1,0,0,0,96,518,1,0,0,0,98,523,1,0, - 0,0,100,527,1,0,0,0,102,529,1,0,0,0,104,531,1,0,0,0,106,534,1,0,0,0,108, - 538,1,0,0,0,110,541,1,0,0,0,112,544,1,0,0,0,114,564,1,0,0,0,116,568,1,0, - 0,0,118,119,3,2,1,0,119,120,5,0,0,1,120,1,1,0,0,0,121,122,6,1,-1,0,122, - 123,3,4,2,0,123,129,1,0,0,0,124,125,10,1,0,0,125,126,5,29,0,0,126,128,3, - 6,3,0,127,124,1,0,0,0,128,131,1,0,0,0,129,127,1,0,0,0,129,130,1,0,0,0,130, - 3,1,0,0,0,131,129,1,0,0,0,132,139,3,104,52,0,133,139,3,32,16,0,134,139, - 3,26,13,0,135,139,3,46,23,0,136,139,3,108,54,0,137,139,3,110,55,0,138,132, - 1,0,0,0,138,133,1,0,0,0,138,134,1,0,0,0,138,135,1,0,0,0,138,136,1,0,0,0, - 138,137,1,0,0,0,139,5,1,0,0,0,140,155,3,48,24,0,141,155,3,52,26,0,142,155, - 3,68,34,0,143,155,3,116,58,0,144,155,3,74,37,0,145,155,3,70,35,0,146,155, - 3,50,25,0,147,155,3,8,4,0,148,155,3,76,38,0,149,155,3,78,39,0,150,155,3, - 82,41,0,151,155,3,84,42,0,152,155,3,112,56,0,153,155,3,86,43,0,154,140, - 1,0,0,0,154,141,1,0,0,0,154,142,1,0,0,0,154,143,1,0,0,0,154,144,1,0,0,0, - 154,145,1,0,0,0,154,146,1,0,0,0,154,147,1,0,0,0,154,148,1,0,0,0,154,149, - 1,0,0,0,154,150,1,0,0,0,154,151,1,0,0,0,154,152,1,0,0,0,154,153,1,0,0,0, - 155,7,1,0,0,0,156,157,5,20,0,0,157,158,3,10,5,0,158,9,1,0,0,0,159,160,6, - 5,-1,0,160,161,5,49,0,0,161,189,3,10,5,8,162,189,3,16,8,0,163,189,3,12, - 6,0,164,189,3,14,7,0,165,167,3,16,8,0,166,168,5,49,0,0,167,166,1,0,0,0, - 167,168,1,0,0,0,168,169,1,0,0,0,169,170,5,43,0,0,170,171,5,47,0,0,171,176, - 3,16,8,0,172,173,5,38,0,0,173,175,3,16,8,0,174,172,1,0,0,0,175,178,1,0, - 0,0,176,174,1,0,0,0,176,177,1,0,0,0,177,179,1,0,0,0,178,176,1,0,0,0,179, - 180,5,55,0,0,180,189,1,0,0,0,181,182,3,16,8,0,182,184,5,44,0,0,183,185, - 5,49,0,0,184,183,1,0,0,0,184,185,1,0,0,0,185,186,1,0,0,0,186,187,5,50,0, - 0,187,189,1,0,0,0,188,159,1,0,0,0,188,162,1,0,0,0,188,163,1,0,0,0,188,164, - 1,0,0,0,188,165,1,0,0,0,188,181,1,0,0,0,189,198,1,0,0,0,190,191,10,4,0, - 0,191,192,5,34,0,0,192,197,3,10,5,5,193,194,10,3,0,0,194,195,5,52,0,0,195, - 197,3,10,5,4,196,190,1,0,0,0,196,193,1,0,0,0,197,200,1,0,0,0,198,196,1, - 0,0,0,198,199,1,0,0,0,199,11,1,0,0,0,200,198,1,0,0,0,201,203,3,16,8,0,202, - 204,5,49,0,0,203,202,1,0,0,0,203,204,1,0,0,0,204,205,1,0,0,0,205,206,5, - 46,0,0,206,207,3,100,50,0,207,216,1,0,0,0,208,210,3,16,8,0,209,211,5,49, - 0,0,210,209,1,0,0,0,210,211,1,0,0,0,211,212,1,0,0,0,212,213,5,54,0,0,213, - 214,3,100,50,0,214,216,1,0,0,0,215,201,1,0,0,0,215,208,1,0,0,0,216,13,1, - 0,0,0,217,218,3,54,27,0,218,219,5,48,0,0,219,220,3,100,50,0,220,15,1,0, - 0,0,221,227,3,18,9,0,222,223,3,18,9,0,223,224,3,102,51,0,224,225,3,18,9, - 0,225,227,1,0,0,0,226,221,1,0,0,0,226,222,1,0,0,0,227,17,1,0,0,0,228,229, - 6,9,-1,0,229,233,3,20,10,0,230,231,7,0,0,0,231,233,3,18,9,3,232,228,1,0, - 0,0,232,230,1,0,0,0,233,242,1,0,0,0,234,235,10,2,0,0,235,236,7,1,0,0,236, - 241,3,18,9,3,237,238,10,1,0,0,238,239,7,0,0,0,239,241,3,18,9,2,240,234, - 1,0,0,0,240,237,1,0,0,0,241,244,1,0,0,0,242,240,1,0,0,0,242,243,1,0,0,0, - 243,19,1,0,0,0,244,242,1,0,0,0,245,246,6,10,-1,0,246,254,3,64,32,0,247, - 254,3,54,27,0,248,254,3,22,11,0,249,250,5,47,0,0,250,251,3,10,5,0,251,252, - 5,55,0,0,252,254,1,0,0,0,253,245,1,0,0,0,253,247,1,0,0,0,253,248,1,0,0, - 0,253,249,1,0,0,0,254,260,1,0,0,0,255,256,10,1,0,0,256,257,5,37,0,0,257, - 259,3,24,12,0,258,255,1,0,0,0,259,262,1,0,0,0,260,258,1,0,0,0,260,261,1, - 0,0,0,261,21,1,0,0,0,262,260,1,0,0,0,263,264,3,60,30,0,264,274,5,47,0,0, - 265,275,5,66,0,0,266,271,3,10,5,0,267,268,5,38,0,0,268,270,3,10,5,0,269, - 267,1,0,0,0,270,273,1,0,0,0,271,269,1,0,0,0,271,272,1,0,0,0,272,275,1,0, - 0,0,273,271,1,0,0,0,274,265,1,0,0,0,274,266,1,0,0,0,274,275,1,0,0,0,275, - 276,1,0,0,0,276,277,5,55,0,0,277,23,1,0,0,0,278,279,3,60,30,0,279,25,1, - 0,0,0,280,281,5,16,0,0,281,282,3,28,14,0,282,27,1,0,0,0,283,288,3,30,15, - 0,284,285,5,38,0,0,285,287,3,30,15,0,286,284,1,0,0,0,287,290,1,0,0,0,288, - 286,1,0,0,0,288,289,1,0,0,0,289,29,1,0,0,0,290,288,1,0,0,0,291,297,3,10, - 5,0,292,293,3,54,27,0,293,294,5,36,0,0,294,295,3,10,5,0,295,297,1,0,0,0, - 296,291,1,0,0,0,296,292,1,0,0,0,297,31,1,0,0,0,298,299,5,6,0,0,299,304, - 3,34,17,0,300,301,5,38,0,0,301,303,3,34,17,0,302,300,1,0,0,0,303,306,1, - 0,0,0,304,302,1,0,0,0,304,305,1,0,0,0,305,308,1,0,0,0,306,304,1,0,0,0,307, - 309,3,40,20,0,308,307,1,0,0,0,308,309,1,0,0,0,309,33,1,0,0,0,310,311,3, - 36,18,0,311,312,5,115,0,0,312,313,3,38,19,0,313,316,1,0,0,0,314,316,3,38, - 19,0,315,310,1,0,0,0,315,314,1,0,0,0,316,35,1,0,0,0,317,318,5,25,0,0,318, - 37,1,0,0,0,319,320,7,2,0,0,320,39,1,0,0,0,321,324,3,42,21,0,322,324,3,44, - 22,0,323,321,1,0,0,0,323,322,1,0,0,0,324,41,1,0,0,0,325,326,5,77,0,0,326, - 331,5,25,0,0,327,328,5,38,0,0,328,330,5,25,0,0,329,327,1,0,0,0,330,333, - 1,0,0,0,331,329,1,0,0,0,331,332,1,0,0,0,332,43,1,0,0,0,333,331,1,0,0,0, - 334,335,5,70,0,0,335,336,3,42,21,0,336,337,5,71,0,0,337,45,1,0,0,0,338, - 339,5,13,0,0,339,344,3,34,17,0,340,341,5,38,0,0,341,343,3,34,17,0,342,340, - 1,0,0,0,343,346,1,0,0,0,344,342,1,0,0,0,344,345,1,0,0,0,345,348,1,0,0,0, - 346,344,1,0,0,0,347,349,3,28,14,0,348,347,1,0,0,0,348,349,1,0,0,0,349,352, - 1,0,0,0,350,351,5,33,0,0,351,353,3,28,14,0,352,350,1,0,0,0,352,353,1,0, - 0,0,353,47,1,0,0,0,354,355,5,4,0,0,355,356,3,28,14,0,356,49,1,0,0,0,357, - 359,5,19,0,0,358,360,3,28,14,0,359,358,1,0,0,0,359,360,1,0,0,0,360,363, - 1,0,0,0,361,362,5,33,0,0,362,364,3,28,14,0,363,361,1,0,0,0,363,364,1,0, - 0,0,364,51,1,0,0,0,365,366,5,8,0,0,366,369,3,28,14,0,367,368,5,33,0,0,368, - 370,3,28,14,0,369,367,1,0,0,0,369,370,1,0,0,0,370,53,1,0,0,0,371,376,3, - 60,30,0,372,373,5,40,0,0,373,375,3,60,30,0,374,372,1,0,0,0,375,378,1,0, - 0,0,376,374,1,0,0,0,376,377,1,0,0,0,377,55,1,0,0,0,378,376,1,0,0,0,379, - 384,3,62,31,0,380,381,5,40,0,0,381,383,3,62,31,0,382,380,1,0,0,0,383,386, - 1,0,0,0,384,382,1,0,0,0,384,385,1,0,0,0,385,57,1,0,0,0,386,384,1,0,0,0, - 387,392,3,56,28,0,388,389,5,38,0,0,389,391,3,56,28,0,390,388,1,0,0,0,391, - 394,1,0,0,0,392,390,1,0,0,0,392,393,1,0,0,0,393,59,1,0,0,0,394,392,1,0, - 0,0,395,396,7,3,0,0,396,61,1,0,0,0,397,398,5,81,0,0,398,63,1,0,0,0,399, - 442,5,50,0,0,400,401,3,98,49,0,401,402,5,72,0,0,402,442,1,0,0,0,403,442, - 3,96,48,0,404,442,3,98,49,0,405,442,3,92,46,0,406,442,3,66,33,0,407,442, - 3,100,50,0,408,409,5,70,0,0,409,414,3,94,47,0,410,411,5,38,0,0,411,413, - 3,94,47,0,412,410,1,0,0,0,413,416,1,0,0,0,414,412,1,0,0,0,414,415,1,0,0, - 0,415,417,1,0,0,0,416,414,1,0,0,0,417,418,5,71,0,0,418,442,1,0,0,0,419, - 420,5,70,0,0,420,425,3,92,46,0,421,422,5,38,0,0,422,424,3,92,46,0,423,421, - 1,0,0,0,424,427,1,0,0,0,425,423,1,0,0,0,425,426,1,0,0,0,426,428,1,0,0,0, - 427,425,1,0,0,0,428,429,5,71,0,0,429,442,1,0,0,0,430,431,5,70,0,0,431,436, - 3,100,50,0,432,433,5,38,0,0,433,435,3,100,50,0,434,432,1,0,0,0,435,438, - 1,0,0,0,436,434,1,0,0,0,436,437,1,0,0,0,437,439,1,0,0,0,438,436,1,0,0,0, - 439,440,5,71,0,0,440,442,1,0,0,0,441,399,1,0,0,0,441,400,1,0,0,0,441,403, - 1,0,0,0,441,404,1,0,0,0,441,405,1,0,0,0,441,406,1,0,0,0,441,407,1,0,0,0, - 441,408,1,0,0,0,441,419,1,0,0,0,441,430,1,0,0,0,442,65,1,0,0,0,443,446, - 5,53,0,0,444,446,5,69,0,0,445,443,1,0,0,0,445,444,1,0,0,0,446,67,1,0,0, - 0,447,448,5,10,0,0,448,449,5,31,0,0,449,69,1,0,0,0,450,451,5,18,0,0,451, - 456,3,72,36,0,452,453,5,38,0,0,453,455,3,72,36,0,454,452,1,0,0,0,455,458, - 1,0,0,0,456,454,1,0,0,0,456,457,1,0,0,0,457,71,1,0,0,0,458,456,1,0,0,0, - 459,461,3,10,5,0,460,462,7,4,0,0,461,460,1,0,0,0,461,462,1,0,0,0,462,465, - 1,0,0,0,463,464,5,51,0,0,464,466,7,5,0,0,465,463,1,0,0,0,465,466,1,0,0, - 0,466,73,1,0,0,0,467,468,5,9,0,0,468,469,3,58,29,0,469,75,1,0,0,0,470,471, - 5,2,0,0,471,472,3,58,29,0,472,77,1,0,0,0,473,474,5,15,0,0,474,479,3,80, - 40,0,475,476,5,38,0,0,476,478,3,80,40,0,477,475,1,0,0,0,478,481,1,0,0,0, - 479,477,1,0,0,0,479,480,1,0,0,0,480,79,1,0,0,0,481,479,1,0,0,0,482,483, - 3,56,28,0,483,484,5,85,0,0,484,485,3,56,28,0,485,81,1,0,0,0,486,487,5,1, - 0,0,487,488,3,20,10,0,488,490,3,100,50,0,489,491,3,88,44,0,490,489,1,0, - 0,0,490,491,1,0,0,0,491,83,1,0,0,0,492,493,5,7,0,0,493,494,3,20,10,0,494, - 495,3,100,50,0,495,85,1,0,0,0,496,497,5,14,0,0,497,498,3,54,27,0,498,87, - 1,0,0,0,499,504,3,90,45,0,500,501,5,38,0,0,501,503,3,90,45,0,502,500,1, - 0,0,0,503,506,1,0,0,0,504,502,1,0,0,0,504,505,1,0,0,0,505,89,1,0,0,0,506, - 504,1,0,0,0,507,508,3,60,30,0,508,509,5,36,0,0,509,510,3,64,32,0,510,91, - 1,0,0,0,511,512,7,6,0,0,512,93,1,0,0,0,513,516,3,96,48,0,514,516,3,98,49, - 0,515,513,1,0,0,0,515,514,1,0,0,0,516,95,1,0,0,0,517,519,7,0,0,0,518,517, - 1,0,0,0,518,519,1,0,0,0,519,520,1,0,0,0,520,521,5,32,0,0,521,97,1,0,0,0, - 522,524,7,0,0,0,523,522,1,0,0,0,523,524,1,0,0,0,524,525,1,0,0,0,525,526, - 5,31,0,0,526,99,1,0,0,0,527,528,5,30,0,0,528,101,1,0,0,0,529,530,7,7,0, - 0,530,103,1,0,0,0,531,532,5,5,0,0,532,533,3,106,53,0,533,105,1,0,0,0,534, - 535,5,70,0,0,535,536,3,2,1,0,536,537,5,71,0,0,537,107,1,0,0,0,538,539,5, - 17,0,0,539,540,5,107,0,0,540,109,1,0,0,0,541,542,5,12,0,0,542,543,5,111, - 0,0,543,111,1,0,0,0,544,545,5,3,0,0,545,548,5,91,0,0,546,547,5,89,0,0,547, - 549,3,56,28,0,548,546,1,0,0,0,548,549,1,0,0,0,549,559,1,0,0,0,550,551,5, - 90,0,0,551,556,3,114,57,0,552,553,5,38,0,0,553,555,3,114,57,0,554,552,1, - 0,0,0,555,558,1,0,0,0,556,554,1,0,0,0,556,557,1,0,0,0,557,560,1,0,0,0,558, - 556,1,0,0,0,559,550,1,0,0,0,559,560,1,0,0,0,560,113,1,0,0,0,561,562,3,56, - 28,0,562,563,5,36,0,0,563,565,1,0,0,0,564,561,1,0,0,0,564,565,1,0,0,0,565, - 566,1,0,0,0,566,567,3,56,28,0,567,115,1,0,0,0,568,569,5,11,0,0,569,570, - 3,34,17,0,570,571,5,89,0,0,571,572,3,58,29,0,572,117,1,0,0,0,54,129,138, - 154,167,176,184,188,196,198,203,210,215,226,232,240,242,253,260,271,274, - 288,296,304,308,315,323,331,344,348,352,359,363,369,376,384,392,414,425, - 436,441,445,456,461,465,479,490,504,515,518,523,548,556,559,564]; + 7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58,7,58,2,59,7,59,2,60,7, + 60,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,5,1,132,8,1,10,1,12,1,135,9,1,1, + 2,1,2,1,2,1,2,1,2,1,2,3,2,143,8,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1, + 3,1,3,1,3,1,3,1,3,1,3,3,3,160,8,3,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1, + 5,1,5,3,5,173,8,5,1,5,1,5,1,5,1,5,1,5,5,5,180,8,5,10,5,12,5,183,9,5,1,5, + 1,5,1,5,1,5,1,5,3,5,190,8,5,1,5,1,5,3,5,194,8,5,1,5,1,5,1,5,1,5,1,5,1,5, + 5,5,202,8,5,10,5,12,5,205,9,5,1,6,1,6,3,6,209,8,6,1,6,1,6,1,6,1,6,1,6,3, + 6,216,8,6,1,6,1,6,1,6,3,6,221,8,6,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,3, + 8,232,8,8,1,9,1,9,1,9,1,9,3,9,238,8,9,1,9,1,9,1,9,1,9,1,9,1,9,5,9,246,8, + 9,10,9,12,9,249,9,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,3,10,259,8, + 10,1,10,1,10,1,10,5,10,264,8,10,10,10,12,10,267,9,10,1,11,1,11,1,11,1,11, + 1,11,1,11,5,11,275,8,11,10,11,12,11,278,9,11,3,11,280,8,11,1,11,1,11,1, + 12,1,12,1,13,1,13,1,13,1,14,1,14,1,14,5,14,292,8,14,10,14,12,14,295,9,14, + 1,15,1,15,1,15,1,15,1,15,3,15,302,8,15,1,16,1,16,1,16,1,16,5,16,308,8,16, + 10,16,12,16,311,9,16,1,16,3,16,314,8,16,1,17,1,17,1,17,1,17,1,17,3,17,321, + 8,17,1,18,1,18,1,19,1,19,1,20,1,20,3,20,329,8,20,1,21,1,21,1,21,1,21,5, + 21,335,8,21,10,21,12,21,338,9,21,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23, + 5,23,348,8,23,10,23,12,23,351,9,23,1,23,3,23,354,8,23,1,23,1,23,3,23,358, + 8,23,1,24,1,24,1,24,1,25,1,25,3,25,365,8,25,1,25,1,25,3,25,369,8,25,1,26, + 1,26,1,26,1,26,3,26,375,8,26,1,27,1,27,1,27,5,27,380,8,27,10,27,12,27,383, + 9,27,1,28,1,28,1,28,5,28,388,8,28,10,28,12,28,391,9,28,1,29,1,29,1,29,5, + 29,396,8,29,10,29,12,29,399,9,29,1,30,1,30,1,31,1,31,1,32,1,32,1,32,1,32, + 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,5,32,418,8,32,10,32,12,32, + 421,9,32,1,32,1,32,1,32,1,32,1,32,1,32,5,32,429,8,32,10,32,12,32,432,9, + 32,1,32,1,32,1,32,1,32,1,32,1,32,5,32,440,8,32,10,32,12,32,443,9,32,1,32, + 1,32,3,32,447,8,32,1,33,1,33,3,33,451,8,33,1,34,1,34,1,34,1,35,1,35,1,35, + 1,35,5,35,460,8,35,10,35,12,35,463,9,35,1,36,1,36,3,36,467,8,36,1,36,1, + 36,3,36,471,8,36,1,37,1,37,1,37,1,38,1,38,1,38,1,39,1,39,1,39,1,39,5,39, + 483,8,39,10,39,12,39,486,9,39,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1,41,3, + 41,496,8,41,1,42,1,42,1,42,1,42,1,43,1,43,1,43,1,44,1,44,1,44,5,44,508, + 8,44,10,44,12,44,511,9,44,1,45,1,45,1,45,1,45,1,46,1,46,1,47,1,47,3,47, + 521,8,47,1,48,3,48,524,8,48,1,48,1,48,1,49,3,49,529,8,49,1,49,1,49,1,50, + 1,50,1,51,1,51,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,55,1, + 55,1,55,1,56,1,56,1,56,1,56,3,56,554,8,56,1,56,1,56,1,56,1,56,5,56,560, + 8,56,10,56,12,56,563,9,56,3,56,565,8,56,1,57,1,57,1,57,3,57,570,8,57,1, + 57,1,57,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,60,1,60,1,60,0,4,2,10, + 18,20,61,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44, + 46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92, + 94,96,98,100,102,104,106,108,110,112,114,116,118,120,0,8,1,0,65,66,1,0, + 67,69,2,0,26,26,31,31,1,0,73,74,2,0,36,36,40,40,2,0,43,43,46,46,2,0,42, + 42,57,57,2,0,58,58,60,64,608,0,122,1,0,0,0,2,125,1,0,0,0,4,142,1,0,0,0, + 6,159,1,0,0,0,8,161,1,0,0,0,10,193,1,0,0,0,12,220,1,0,0,0,14,222,1,0,0, + 0,16,231,1,0,0,0,18,237,1,0,0,0,20,258,1,0,0,0,22,268,1,0,0,0,24,283,1, + 0,0,0,26,285,1,0,0,0,28,288,1,0,0,0,30,301,1,0,0,0,32,303,1,0,0,0,34,320, + 1,0,0,0,36,322,1,0,0,0,38,324,1,0,0,0,40,328,1,0,0,0,42,330,1,0,0,0,44, + 339,1,0,0,0,46,343,1,0,0,0,48,359,1,0,0,0,50,362,1,0,0,0,52,370,1,0,0,0, + 54,376,1,0,0,0,56,384,1,0,0,0,58,392,1,0,0,0,60,400,1,0,0,0,62,402,1,0, + 0,0,64,446,1,0,0,0,66,450,1,0,0,0,68,452,1,0,0,0,70,455,1,0,0,0,72,464, + 1,0,0,0,74,472,1,0,0,0,76,475,1,0,0,0,78,478,1,0,0,0,80,487,1,0,0,0,82, + 491,1,0,0,0,84,497,1,0,0,0,86,501,1,0,0,0,88,504,1,0,0,0,90,512,1,0,0,0, + 92,516,1,0,0,0,94,520,1,0,0,0,96,523,1,0,0,0,98,528,1,0,0,0,100,532,1,0, + 0,0,102,534,1,0,0,0,104,536,1,0,0,0,106,539,1,0,0,0,108,543,1,0,0,0,110, + 546,1,0,0,0,112,549,1,0,0,0,114,569,1,0,0,0,116,573,1,0,0,0,118,578,1,0, + 0,0,120,581,1,0,0,0,122,123,3,2,1,0,123,124,5,0,0,1,124,1,1,0,0,0,125,126, + 6,1,-1,0,126,127,3,4,2,0,127,133,1,0,0,0,128,129,10,1,0,0,129,130,5,30, + 0,0,130,132,3,6,3,0,131,128,1,0,0,0,132,135,1,0,0,0,133,131,1,0,0,0,133, + 134,1,0,0,0,134,3,1,0,0,0,135,133,1,0,0,0,136,143,3,104,52,0,137,143,3, + 32,16,0,138,143,3,26,13,0,139,143,3,46,23,0,140,143,3,108,54,0,141,143, + 3,110,55,0,142,136,1,0,0,0,142,137,1,0,0,0,142,138,1,0,0,0,142,139,1,0, + 0,0,142,140,1,0,0,0,142,141,1,0,0,0,143,5,1,0,0,0,144,160,3,48,24,0,145, + 160,3,52,26,0,146,160,3,68,34,0,147,160,3,116,58,0,148,160,3,74,37,0,149, + 160,3,70,35,0,150,160,3,50,25,0,151,160,3,8,4,0,152,160,3,76,38,0,153,160, + 3,78,39,0,154,160,3,82,41,0,155,160,3,84,42,0,156,160,3,112,56,0,157,160, + 3,86,43,0,158,160,3,118,59,0,159,144,1,0,0,0,159,145,1,0,0,0,159,146,1, + 0,0,0,159,147,1,0,0,0,159,148,1,0,0,0,159,149,1,0,0,0,159,150,1,0,0,0,159, + 151,1,0,0,0,159,152,1,0,0,0,159,153,1,0,0,0,159,154,1,0,0,0,159,155,1,0, + 0,0,159,156,1,0,0,0,159,157,1,0,0,0,159,158,1,0,0,0,160,7,1,0,0,0,161,162, + 5,20,0,0,162,163,3,10,5,0,163,9,1,0,0,0,164,165,6,5,-1,0,165,166,5,50,0, + 0,166,194,3,10,5,8,167,194,3,16,8,0,168,194,3,12,6,0,169,194,3,14,7,0,170, + 172,3,16,8,0,171,173,5,50,0,0,172,171,1,0,0,0,172,173,1,0,0,0,173,174,1, + 0,0,0,174,175,5,44,0,0,175,176,5,48,0,0,176,181,3,16,8,0,177,178,5,39,0, + 0,178,180,3,16,8,0,179,177,1,0,0,0,180,183,1,0,0,0,181,179,1,0,0,0,181, + 182,1,0,0,0,182,184,1,0,0,0,183,181,1,0,0,0,184,185,5,56,0,0,185,194,1, + 0,0,0,186,187,3,16,8,0,187,189,5,45,0,0,188,190,5,50,0,0,189,188,1,0,0, + 0,189,190,1,0,0,0,190,191,1,0,0,0,191,192,5,51,0,0,192,194,1,0,0,0,193, + 164,1,0,0,0,193,167,1,0,0,0,193,168,1,0,0,0,193,169,1,0,0,0,193,170,1,0, + 0,0,193,186,1,0,0,0,194,203,1,0,0,0,195,196,10,4,0,0,196,197,5,35,0,0,197, + 202,3,10,5,5,198,199,10,3,0,0,199,200,5,53,0,0,200,202,3,10,5,4,201,195, + 1,0,0,0,201,198,1,0,0,0,202,205,1,0,0,0,203,201,1,0,0,0,203,204,1,0,0,0, + 204,11,1,0,0,0,205,203,1,0,0,0,206,208,3,16,8,0,207,209,5,50,0,0,208,207, + 1,0,0,0,208,209,1,0,0,0,209,210,1,0,0,0,210,211,5,47,0,0,211,212,3,100, + 50,0,212,221,1,0,0,0,213,215,3,16,8,0,214,216,5,50,0,0,215,214,1,0,0,0, + 215,216,1,0,0,0,216,217,1,0,0,0,217,218,5,55,0,0,218,219,3,100,50,0,219, + 221,1,0,0,0,220,206,1,0,0,0,220,213,1,0,0,0,221,13,1,0,0,0,222,223,3,54, + 27,0,223,224,5,49,0,0,224,225,3,100,50,0,225,15,1,0,0,0,226,232,3,18,9, + 0,227,228,3,18,9,0,228,229,3,102,51,0,229,230,3,18,9,0,230,232,1,0,0,0, + 231,226,1,0,0,0,231,227,1,0,0,0,232,17,1,0,0,0,233,234,6,9,-1,0,234,238, + 3,20,10,0,235,236,7,0,0,0,236,238,3,18,9,3,237,233,1,0,0,0,237,235,1,0, + 0,0,238,247,1,0,0,0,239,240,10,2,0,0,240,241,7,1,0,0,241,246,3,18,9,3,242, + 243,10,1,0,0,243,244,7,0,0,0,244,246,3,18,9,2,245,239,1,0,0,0,245,242,1, + 0,0,0,246,249,1,0,0,0,247,245,1,0,0,0,247,248,1,0,0,0,248,19,1,0,0,0,249, + 247,1,0,0,0,250,251,6,10,-1,0,251,259,3,64,32,0,252,259,3,54,27,0,253,259, + 3,22,11,0,254,255,5,48,0,0,255,256,3,10,5,0,256,257,5,56,0,0,257,259,1, + 0,0,0,258,250,1,0,0,0,258,252,1,0,0,0,258,253,1,0,0,0,258,254,1,0,0,0,259, + 265,1,0,0,0,260,261,10,1,0,0,261,262,5,38,0,0,262,264,3,24,12,0,263,260, + 1,0,0,0,264,267,1,0,0,0,265,263,1,0,0,0,265,266,1,0,0,0,266,21,1,0,0,0, + 267,265,1,0,0,0,268,269,3,60,30,0,269,279,5,48,0,0,270,280,5,67,0,0,271, + 276,3,10,5,0,272,273,5,39,0,0,273,275,3,10,5,0,274,272,1,0,0,0,275,278, + 1,0,0,0,276,274,1,0,0,0,276,277,1,0,0,0,277,280,1,0,0,0,278,276,1,0,0,0, + 279,270,1,0,0,0,279,271,1,0,0,0,279,280,1,0,0,0,280,281,1,0,0,0,281,282, + 5,56,0,0,282,23,1,0,0,0,283,284,3,60,30,0,284,25,1,0,0,0,285,286,5,16,0, + 0,286,287,3,28,14,0,287,27,1,0,0,0,288,293,3,30,15,0,289,290,5,39,0,0,290, + 292,3,30,15,0,291,289,1,0,0,0,292,295,1,0,0,0,293,291,1,0,0,0,293,294,1, + 0,0,0,294,29,1,0,0,0,295,293,1,0,0,0,296,302,3,10,5,0,297,298,3,54,27,0, + 298,299,5,37,0,0,299,300,3,10,5,0,300,302,1,0,0,0,301,296,1,0,0,0,301,297, + 1,0,0,0,302,31,1,0,0,0,303,304,5,6,0,0,304,309,3,34,17,0,305,306,5,39,0, + 0,306,308,3,34,17,0,307,305,1,0,0,0,308,311,1,0,0,0,309,307,1,0,0,0,309, + 310,1,0,0,0,310,313,1,0,0,0,311,309,1,0,0,0,312,314,3,40,20,0,313,312,1, + 0,0,0,313,314,1,0,0,0,314,33,1,0,0,0,315,316,3,36,18,0,316,317,5,116,0, + 0,317,318,3,38,19,0,318,321,1,0,0,0,319,321,3,38,19,0,320,315,1,0,0,0,320, + 319,1,0,0,0,321,35,1,0,0,0,322,323,5,26,0,0,323,37,1,0,0,0,324,325,7,2, + 0,0,325,39,1,0,0,0,326,329,3,42,21,0,327,329,3,44,22,0,328,326,1,0,0,0, + 328,327,1,0,0,0,329,41,1,0,0,0,330,331,5,78,0,0,331,336,5,26,0,0,332,333, + 5,39,0,0,333,335,5,26,0,0,334,332,1,0,0,0,335,338,1,0,0,0,336,334,1,0,0, + 0,336,337,1,0,0,0,337,43,1,0,0,0,338,336,1,0,0,0,339,340,5,71,0,0,340,341, + 3,42,21,0,341,342,5,72,0,0,342,45,1,0,0,0,343,344,5,13,0,0,344,349,3,34, + 17,0,345,346,5,39,0,0,346,348,3,34,17,0,347,345,1,0,0,0,348,351,1,0,0,0, + 349,347,1,0,0,0,349,350,1,0,0,0,350,353,1,0,0,0,351,349,1,0,0,0,352,354, + 3,28,14,0,353,352,1,0,0,0,353,354,1,0,0,0,354,357,1,0,0,0,355,356,5,34, + 0,0,356,358,3,28,14,0,357,355,1,0,0,0,357,358,1,0,0,0,358,47,1,0,0,0,359, + 360,5,4,0,0,360,361,3,28,14,0,361,49,1,0,0,0,362,364,5,19,0,0,363,365,3, + 28,14,0,364,363,1,0,0,0,364,365,1,0,0,0,365,368,1,0,0,0,366,367,5,34,0, + 0,367,369,3,28,14,0,368,366,1,0,0,0,368,369,1,0,0,0,369,51,1,0,0,0,370, + 371,5,8,0,0,371,374,3,28,14,0,372,373,5,34,0,0,373,375,3,28,14,0,374,372, + 1,0,0,0,374,375,1,0,0,0,375,53,1,0,0,0,376,381,3,60,30,0,377,378,5,41,0, + 0,378,380,3,60,30,0,379,377,1,0,0,0,380,383,1,0,0,0,381,379,1,0,0,0,381, + 382,1,0,0,0,382,55,1,0,0,0,383,381,1,0,0,0,384,389,3,62,31,0,385,386,5, + 41,0,0,386,388,3,62,31,0,387,385,1,0,0,0,388,391,1,0,0,0,389,387,1,0,0, + 0,389,390,1,0,0,0,390,57,1,0,0,0,391,389,1,0,0,0,392,397,3,56,28,0,393, + 394,5,39,0,0,394,396,3,56,28,0,395,393,1,0,0,0,396,399,1,0,0,0,397,395, + 1,0,0,0,397,398,1,0,0,0,398,59,1,0,0,0,399,397,1,0,0,0,400,401,7,3,0,0, + 401,61,1,0,0,0,402,403,5,82,0,0,403,63,1,0,0,0,404,447,5,51,0,0,405,406, + 3,98,49,0,406,407,5,73,0,0,407,447,1,0,0,0,408,447,3,96,48,0,409,447,3, + 98,49,0,410,447,3,92,46,0,411,447,3,66,33,0,412,447,3,100,50,0,413,414, + 5,71,0,0,414,419,3,94,47,0,415,416,5,39,0,0,416,418,3,94,47,0,417,415,1, + 0,0,0,418,421,1,0,0,0,419,417,1,0,0,0,419,420,1,0,0,0,420,422,1,0,0,0,421, + 419,1,0,0,0,422,423,5,72,0,0,423,447,1,0,0,0,424,425,5,71,0,0,425,430,3, + 92,46,0,426,427,5,39,0,0,427,429,3,92,46,0,428,426,1,0,0,0,429,432,1,0, + 0,0,430,428,1,0,0,0,430,431,1,0,0,0,431,433,1,0,0,0,432,430,1,0,0,0,433, + 434,5,72,0,0,434,447,1,0,0,0,435,436,5,71,0,0,436,441,3,100,50,0,437,438, + 5,39,0,0,438,440,3,100,50,0,439,437,1,0,0,0,440,443,1,0,0,0,441,439,1,0, + 0,0,441,442,1,0,0,0,442,444,1,0,0,0,443,441,1,0,0,0,444,445,5,72,0,0,445, + 447,1,0,0,0,446,404,1,0,0,0,446,405,1,0,0,0,446,408,1,0,0,0,446,409,1,0, + 0,0,446,410,1,0,0,0,446,411,1,0,0,0,446,412,1,0,0,0,446,413,1,0,0,0,446, + 424,1,0,0,0,446,435,1,0,0,0,447,65,1,0,0,0,448,451,5,54,0,0,449,451,5,70, + 0,0,450,448,1,0,0,0,450,449,1,0,0,0,451,67,1,0,0,0,452,453,5,10,0,0,453, + 454,5,32,0,0,454,69,1,0,0,0,455,456,5,18,0,0,456,461,3,72,36,0,457,458, + 5,39,0,0,458,460,3,72,36,0,459,457,1,0,0,0,460,463,1,0,0,0,461,459,1,0, + 0,0,461,462,1,0,0,0,462,71,1,0,0,0,463,461,1,0,0,0,464,466,3,10,5,0,465, + 467,7,4,0,0,466,465,1,0,0,0,466,467,1,0,0,0,467,470,1,0,0,0,468,469,5,52, + 0,0,469,471,7,5,0,0,470,468,1,0,0,0,470,471,1,0,0,0,471,73,1,0,0,0,472, + 473,5,9,0,0,473,474,3,58,29,0,474,75,1,0,0,0,475,476,5,2,0,0,476,477,3, + 58,29,0,477,77,1,0,0,0,478,479,5,15,0,0,479,484,3,80,40,0,480,481,5,39, + 0,0,481,483,3,80,40,0,482,480,1,0,0,0,483,486,1,0,0,0,484,482,1,0,0,0,484, + 485,1,0,0,0,485,79,1,0,0,0,486,484,1,0,0,0,487,488,3,56,28,0,488,489,5, + 86,0,0,489,490,3,56,28,0,490,81,1,0,0,0,491,492,5,1,0,0,492,493,3,20,10, + 0,493,495,3,100,50,0,494,496,3,88,44,0,495,494,1,0,0,0,495,496,1,0,0,0, + 496,83,1,0,0,0,497,498,5,7,0,0,498,499,3,20,10,0,499,500,3,100,50,0,500, + 85,1,0,0,0,501,502,5,14,0,0,502,503,3,54,27,0,503,87,1,0,0,0,504,509,3, + 90,45,0,505,506,5,39,0,0,506,508,3,90,45,0,507,505,1,0,0,0,508,511,1,0, + 0,0,509,507,1,0,0,0,509,510,1,0,0,0,510,89,1,0,0,0,511,509,1,0,0,0,512, + 513,3,60,30,0,513,514,5,37,0,0,514,515,3,64,32,0,515,91,1,0,0,0,516,517, + 7,6,0,0,517,93,1,0,0,0,518,521,3,96,48,0,519,521,3,98,49,0,520,518,1,0, + 0,0,520,519,1,0,0,0,521,95,1,0,0,0,522,524,7,0,0,0,523,522,1,0,0,0,523, + 524,1,0,0,0,524,525,1,0,0,0,525,526,5,33,0,0,526,97,1,0,0,0,527,529,7,0, + 0,0,528,527,1,0,0,0,528,529,1,0,0,0,529,530,1,0,0,0,530,531,5,32,0,0,531, + 99,1,0,0,0,532,533,5,31,0,0,533,101,1,0,0,0,534,535,7,7,0,0,535,103,1,0, + 0,0,536,537,5,5,0,0,537,538,3,106,53,0,538,105,1,0,0,0,539,540,5,71,0,0, + 540,541,3,2,1,0,541,542,5,72,0,0,542,107,1,0,0,0,543,544,5,17,0,0,544,545, + 5,108,0,0,545,109,1,0,0,0,546,547,5,12,0,0,547,548,5,112,0,0,548,111,1, + 0,0,0,549,550,5,3,0,0,550,553,5,92,0,0,551,552,5,90,0,0,552,554,3,56,28, + 0,553,551,1,0,0,0,553,554,1,0,0,0,554,564,1,0,0,0,555,556,5,91,0,0,556, + 561,3,114,57,0,557,558,5,39,0,0,558,560,3,114,57,0,559,557,1,0,0,0,560, + 563,1,0,0,0,561,559,1,0,0,0,561,562,1,0,0,0,562,565,1,0,0,0,563,561,1,0, + 0,0,564,555,1,0,0,0,564,565,1,0,0,0,565,113,1,0,0,0,566,567,3,56,28,0,567, + 568,5,37,0,0,568,570,1,0,0,0,569,566,1,0,0,0,569,570,1,0,0,0,570,571,1, + 0,0,0,571,572,3,56,28,0,572,115,1,0,0,0,573,574,5,11,0,0,574,575,3,34,17, + 0,575,576,5,90,0,0,576,577,3,58,29,0,577,117,1,0,0,0,578,579,5,21,0,0,579, + 580,3,120,60,0,580,119,1,0,0,0,581,582,5,31,0,0,582,121,1,0,0,0,54,133, + 142,159,172,181,189,193,201,203,208,215,220,231,237,245,247,258,265,276, + 279,293,301,309,313,320,328,336,349,353,357,364,368,374,381,389,397,419, + 430,441,446,450,461,466,470,484,495,509,520,523,528,553,561,564,569]; private static __ATN: ATN; public static get _ATN(): ATN { @@ -3541,7 +3608,7 @@ export class QueryContext extends ParserRuleContext { public get ruleIndex(): number { return esql_parser.RULE_query; } - public copyFrom(ctx: QueryContext): void { + public override copyFrom(ctx: QueryContext): void { super.copyFrom(ctx); } } @@ -3677,6 +3744,9 @@ export class ProcessingCommandContext extends ParserRuleContext { public mvExpandCommand(): MvExpandCommandContext { return this.getTypedRuleContext(MvExpandCommandContext, 0) as MvExpandCommandContext; } + public matchCommand(): MatchCommandContext { + return this.getTypedRuleContext(MatchCommandContext, 0) as MatchCommandContext; + } public get ruleIndex(): number { return esql_parser.RULE_processingCommand; } @@ -3728,7 +3798,7 @@ export class BooleanExpressionContext extends ParserRuleContext { public get ruleIndex(): number { return esql_parser.RULE_booleanExpression; } - public copyFrom(ctx: BooleanExpressionContext): void { + public override copyFrom(ctx: BooleanExpressionContext): void { super.copyFrom(ctx); } } @@ -3959,8 +4029,8 @@ export class MatchBooleanExpressionContext extends ParserRuleContext { public qualifiedName(): QualifiedNameContext { return this.getTypedRuleContext(QualifiedNameContext, 0) as QualifiedNameContext; } - public MATCH(): TerminalNode { - return this.getToken(esql_parser.MATCH, 0); + public MATCH_OPERATOR(): TerminalNode { + return this.getToken(esql_parser.MATCH_OPERATOR, 0); } public string_(): StringContext { return this.getTypedRuleContext(StringContext, 0) as StringContext; @@ -3989,7 +4059,7 @@ export class ValueExpressionContext extends ParserRuleContext { public get ruleIndex(): number { return esql_parser.RULE_valueExpression; } - public copyFrom(ctx: ValueExpressionContext): void { + public override copyFrom(ctx: ValueExpressionContext): void { super.copyFrom(ctx); } } @@ -4049,7 +4119,7 @@ export class OperatorExpressionContext extends ParserRuleContext { public get ruleIndex(): number { return esql_parser.RULE_operatorExpression; } - public copyFrom(ctx: OperatorExpressionContext): void { + public override copyFrom(ctx: OperatorExpressionContext): void { super.copyFrom(ctx); } } @@ -4148,7 +4218,7 @@ export class PrimaryExpressionContext extends ParserRuleContext { public get ruleIndex(): number { return esql_parser.RULE_primaryExpression; } - public copyFrom(ctx: PrimaryExpressionContext): void { + public override copyFrom(ctx: PrimaryExpressionContext): void { super.copyFrom(ctx); } } @@ -4314,7 +4384,7 @@ export class DataTypeContext extends ParserRuleContext { public get ruleIndex(): number { return esql_parser.RULE_dataType; } - public copyFrom(ctx: DataTypeContext): void { + public override copyFrom(ctx: DataTypeContext): void { super.copyFrom(ctx); } } @@ -4944,7 +5014,7 @@ export class ConstantContext extends ParserRuleContext { public get ruleIndex(): number { return esql_parser.RULE_constant; } - public copyFrom(ctx: ConstantContext): void { + public override copyFrom(ctx: ConstantContext): void { super.copyFrom(ctx); } } @@ -5196,7 +5266,7 @@ export class ParamsContext extends ParserRuleContext { public get ruleIndex(): number { return esql_parser.RULE_params; } - public copyFrom(ctx: ParamsContext): void { + public override copyFrom(ctx: ParamsContext): void { super.copyFrom(ctx); } } @@ -5861,7 +5931,7 @@ export class ShowCommandContext extends ParserRuleContext { public get ruleIndex(): number { return esql_parser.RULE_showCommand; } - public copyFrom(ctx: ShowCommandContext): void { + public override copyFrom(ctx: ShowCommandContext): void { super.copyFrom(ctx); } } @@ -5897,7 +5967,7 @@ export class MetaCommandContext extends ParserRuleContext { public get ruleIndex(): number { return esql_parser.RULE_metaCommand; } - public copyFrom(ctx: MetaCommandContext): void { + public override copyFrom(ctx: MetaCommandContext): void { super.copyFrom(ctx); } } @@ -6040,3 +6110,54 @@ export class LookupCommandContext extends ParserRuleContext { } } } + + +export class MatchCommandContext extends ParserRuleContext { + constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } + public MATCH(): TerminalNode { + return this.getToken(esql_parser.MATCH, 0); + } + public matchQuery(): MatchQueryContext { + return this.getTypedRuleContext(MatchQueryContext, 0) as MatchQueryContext; + } + public get ruleIndex(): number { + return esql_parser.RULE_matchCommand; + } + public enterRule(listener: esql_parserListener): void { + if(listener.enterMatchCommand) { + listener.enterMatchCommand(this); + } + } + public exitRule(listener: esql_parserListener): void { + if(listener.exitMatchCommand) { + listener.exitMatchCommand(this); + } + } +} + + +export class MatchQueryContext extends ParserRuleContext { + constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } + public QUOTED_STRING(): TerminalNode { + return this.getToken(esql_parser.QUOTED_STRING, 0); + } + public get ruleIndex(): number { + return esql_parser.RULE_matchQuery; + } + public enterRule(listener: esql_parserListener): void { + if(listener.enterMatchQuery) { + listener.enterMatchQuery(this); + } + } + public exitRule(listener: esql_parserListener): void { + if(listener.exitMatchQuery) { + listener.exitMatchQuery(this); + } + } +} diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts b/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts index 13d5049a6ba9d..768ff5910602f 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts +++ b/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts @@ -1,92 +1,94 @@ // @ts-nocheck -// Generated from src/antlr/esql_parser.g4 by ANTLR 4.13.1 +// Generated from src/antlr/esql_parser.g4 by ANTLR 4.13.2 import {ParseTreeListener} from "antlr4"; -import { SingleStatementContext } from "./esql_parser"; -import { CompositeQueryContext } from "./esql_parser"; -import { SingleCommandQueryContext } from "./esql_parser"; -import { SourceCommandContext } from "./esql_parser"; -import { ProcessingCommandContext } from "./esql_parser"; -import { WhereCommandContext } from "./esql_parser"; -import { MatchExpressionContext } from "./esql_parser"; -import { LogicalNotContext } from "./esql_parser"; -import { BooleanDefaultContext } from "./esql_parser"; -import { IsNullContext } from "./esql_parser"; -import { RegexExpressionContext } from "./esql_parser"; -import { LogicalInContext } from "./esql_parser"; -import { LogicalBinaryContext } from "./esql_parser"; -import { RegexBooleanExpressionContext } from "./esql_parser"; -import { MatchBooleanExpressionContext } from "./esql_parser"; -import { ValueExpressionDefaultContext } from "./esql_parser"; -import { ComparisonContext } from "./esql_parser"; -import { OperatorExpressionDefaultContext } from "./esql_parser"; -import { ArithmeticBinaryContext } from "./esql_parser"; -import { ArithmeticUnaryContext } from "./esql_parser"; -import { DereferenceContext } from "./esql_parser"; -import { InlineCastContext } from "./esql_parser"; -import { ConstantDefaultContext } from "./esql_parser"; -import { ParenthesizedExpressionContext } from "./esql_parser"; -import { FunctionContext } from "./esql_parser"; -import { FunctionExpressionContext } from "./esql_parser"; -import { ToDataTypeContext } from "./esql_parser"; -import { RowCommandContext } from "./esql_parser"; -import { FieldsContext } from "./esql_parser"; -import { FieldContext } from "./esql_parser"; -import { FromCommandContext } from "./esql_parser"; -import { IndexPatternContext } from "./esql_parser"; -import { ClusterStringContext } from "./esql_parser"; -import { IndexStringContext } from "./esql_parser"; -import { MetadataContext } from "./esql_parser"; -import { MetadataOptionContext } from "./esql_parser"; -import { Deprecated_metadataContext } from "./esql_parser"; -import { MetricsCommandContext } from "./esql_parser"; -import { EvalCommandContext } from "./esql_parser"; -import { StatsCommandContext } from "./esql_parser"; -import { InlinestatsCommandContext } from "./esql_parser"; -import { QualifiedNameContext } from "./esql_parser"; -import { QualifiedNamePatternContext } from "./esql_parser"; -import { QualifiedNamePatternsContext } from "./esql_parser"; -import { IdentifierContext } from "./esql_parser"; -import { IdentifierPatternContext } from "./esql_parser"; -import { NullLiteralContext } from "./esql_parser"; -import { QualifiedIntegerLiteralContext } from "./esql_parser"; -import { DecimalLiteralContext } from "./esql_parser"; -import { IntegerLiteralContext } from "./esql_parser"; -import { BooleanLiteralContext } from "./esql_parser"; -import { InputParamsContext } from "./esql_parser"; -import { StringLiteralContext } from "./esql_parser"; -import { NumericArrayLiteralContext } from "./esql_parser"; -import { BooleanArrayLiteralContext } from "./esql_parser"; -import { StringArrayLiteralContext } from "./esql_parser"; -import { InputParamContext } from "./esql_parser"; -import { InputNamedOrPositionalParamContext } from "./esql_parser"; -import { LimitCommandContext } from "./esql_parser"; -import { SortCommandContext } from "./esql_parser"; -import { OrderExpressionContext } from "./esql_parser"; -import { KeepCommandContext } from "./esql_parser"; -import { DropCommandContext } from "./esql_parser"; -import { RenameCommandContext } from "./esql_parser"; -import { RenameClauseContext } from "./esql_parser"; -import { DissectCommandContext } from "./esql_parser"; -import { GrokCommandContext } from "./esql_parser"; -import { MvExpandCommandContext } from "./esql_parser"; -import { CommandOptionsContext } from "./esql_parser"; -import { CommandOptionContext } from "./esql_parser"; -import { BooleanValueContext } from "./esql_parser"; -import { NumericValueContext } from "./esql_parser"; -import { DecimalValueContext } from "./esql_parser"; -import { IntegerValueContext } from "./esql_parser"; -import { StringContext } from "./esql_parser"; -import { ComparisonOperatorContext } from "./esql_parser"; -import { ExplainCommandContext } from "./esql_parser"; -import { SubqueryExpressionContext } from "./esql_parser"; -import { ShowInfoContext } from "./esql_parser"; -import { MetaFunctionsContext } from "./esql_parser"; -import { EnrichCommandContext } from "./esql_parser"; -import { EnrichWithClauseContext } from "./esql_parser"; -import { LookupCommandContext } from "./esql_parser"; +import { SingleStatementContext } from "./esql_parser.js"; +import { CompositeQueryContext } from "./esql_parser.js"; +import { SingleCommandQueryContext } from "./esql_parser.js"; +import { SourceCommandContext } from "./esql_parser.js"; +import { ProcessingCommandContext } from "./esql_parser.js"; +import { WhereCommandContext } from "./esql_parser.js"; +import { MatchExpressionContext } from "./esql_parser.js"; +import { LogicalNotContext } from "./esql_parser.js"; +import { BooleanDefaultContext } from "./esql_parser.js"; +import { IsNullContext } from "./esql_parser.js"; +import { RegexExpressionContext } from "./esql_parser.js"; +import { LogicalInContext } from "./esql_parser.js"; +import { LogicalBinaryContext } from "./esql_parser.js"; +import { RegexBooleanExpressionContext } from "./esql_parser.js"; +import { MatchBooleanExpressionContext } from "./esql_parser.js"; +import { ValueExpressionDefaultContext } from "./esql_parser.js"; +import { ComparisonContext } from "./esql_parser.js"; +import { OperatorExpressionDefaultContext } from "./esql_parser.js"; +import { ArithmeticBinaryContext } from "./esql_parser.js"; +import { ArithmeticUnaryContext } from "./esql_parser.js"; +import { DereferenceContext } from "./esql_parser.js"; +import { InlineCastContext } from "./esql_parser.js"; +import { ConstantDefaultContext } from "./esql_parser.js"; +import { ParenthesizedExpressionContext } from "./esql_parser.js"; +import { FunctionContext } from "./esql_parser.js"; +import { FunctionExpressionContext } from "./esql_parser.js"; +import { ToDataTypeContext } from "./esql_parser.js"; +import { RowCommandContext } from "./esql_parser.js"; +import { FieldsContext } from "./esql_parser.js"; +import { FieldContext } from "./esql_parser.js"; +import { FromCommandContext } from "./esql_parser.js"; +import { IndexPatternContext } from "./esql_parser.js"; +import { ClusterStringContext } from "./esql_parser.js"; +import { IndexStringContext } from "./esql_parser.js"; +import { MetadataContext } from "./esql_parser.js"; +import { MetadataOptionContext } from "./esql_parser.js"; +import { Deprecated_metadataContext } from "./esql_parser.js"; +import { MetricsCommandContext } from "./esql_parser.js"; +import { EvalCommandContext } from "./esql_parser.js"; +import { StatsCommandContext } from "./esql_parser.js"; +import { InlinestatsCommandContext } from "./esql_parser.js"; +import { QualifiedNameContext } from "./esql_parser.js"; +import { QualifiedNamePatternContext } from "./esql_parser.js"; +import { QualifiedNamePatternsContext } from "./esql_parser.js"; +import { IdentifierContext } from "./esql_parser.js"; +import { IdentifierPatternContext } from "./esql_parser.js"; +import { NullLiteralContext } from "./esql_parser.js"; +import { QualifiedIntegerLiteralContext } from "./esql_parser.js"; +import { DecimalLiteralContext } from "./esql_parser.js"; +import { IntegerLiteralContext } from "./esql_parser.js"; +import { BooleanLiteralContext } from "./esql_parser.js"; +import { InputParamsContext } from "./esql_parser.js"; +import { StringLiteralContext } from "./esql_parser.js"; +import { NumericArrayLiteralContext } from "./esql_parser.js"; +import { BooleanArrayLiteralContext } from "./esql_parser.js"; +import { StringArrayLiteralContext } from "./esql_parser.js"; +import { InputParamContext } from "./esql_parser.js"; +import { InputNamedOrPositionalParamContext } from "./esql_parser.js"; +import { LimitCommandContext } from "./esql_parser.js"; +import { SortCommandContext } from "./esql_parser.js"; +import { OrderExpressionContext } from "./esql_parser.js"; +import { KeepCommandContext } from "./esql_parser.js"; +import { DropCommandContext } from "./esql_parser.js"; +import { RenameCommandContext } from "./esql_parser.js"; +import { RenameClauseContext } from "./esql_parser.js"; +import { DissectCommandContext } from "./esql_parser.js"; +import { GrokCommandContext } from "./esql_parser.js"; +import { MvExpandCommandContext } from "./esql_parser.js"; +import { CommandOptionsContext } from "./esql_parser.js"; +import { CommandOptionContext } from "./esql_parser.js"; +import { BooleanValueContext } from "./esql_parser.js"; +import { NumericValueContext } from "./esql_parser.js"; +import { DecimalValueContext } from "./esql_parser.js"; +import { IntegerValueContext } from "./esql_parser.js"; +import { StringContext } from "./esql_parser.js"; +import { ComparisonOperatorContext } from "./esql_parser.js"; +import { ExplainCommandContext } from "./esql_parser.js"; +import { SubqueryExpressionContext } from "./esql_parser.js"; +import { ShowInfoContext } from "./esql_parser.js"; +import { MetaFunctionsContext } from "./esql_parser.js"; +import { EnrichCommandContext } from "./esql_parser.js"; +import { EnrichWithClauseContext } from "./esql_parser.js"; +import { LookupCommandContext } from "./esql_parser.js"; +import { MatchCommandContext } from "./esql_parser.js"; +import { MatchQueryContext } from "./esql_parser.js"; /** @@ -992,5 +994,25 @@ export default class esql_parserListener extends ParseTreeListener { * @param ctx the parse tree */ exitLookupCommand?: (ctx: LookupCommandContext) => void; + /** + * Enter a parse tree produced by `esql_parser.matchCommand`. + * @param ctx the parse tree + */ + enterMatchCommand?: (ctx: MatchCommandContext) => void; + /** + * Exit a parse tree produced by `esql_parser.matchCommand`. + * @param ctx the parse tree + */ + exitMatchCommand?: (ctx: MatchCommandContext) => void; + /** + * Enter a parse tree produced by `esql_parser.matchQuery`. + * @param ctx the parse tree + */ + enterMatchQuery?: (ctx: MatchQueryContext) => void; + /** + * Exit a parse tree produced by `esql_parser.matchQuery`. + * @param ctx the parse tree + */ + exitMatchQuery?: (ctx: MatchQueryContext) => void; } diff --git a/packages/kbn-esql-ast/src/walker/walker.test.ts b/packages/kbn-esql-ast/src/walker/walker.test.ts index 59375b275b162..1a3f1b0a0b6d7 100644 --- a/packages/kbn-esql-ast/src/walker/walker.test.ts +++ b/packages/kbn-esql-ast/src/walker/walker.test.ts @@ -791,7 +791,8 @@ describe('Walker.params()', () => { }); test('can collect all params from grouping functions', () => { - const query = 'ROW x=1, time=2024-07-10 | stats z = avg(x) by bucket(time, 20, ?start,?end)'; + const query = + 'ROW x=1, time=2024-07-10 | stats z = avg(x) by bucket(time, 20, ?t_start,?t_end)'; const { ast } = getAstAndSyntaxErrors(query); const params = Walker.params(ast); @@ -800,13 +801,13 @@ describe('Walker.params()', () => { type: 'literal', literalType: 'param', paramType: 'named', - value: 'start', + value: 't_start', }, { type: 'literal', literalType: 'param', paramType: 'named', - value: 'end', + value: 't_end', }, ]); }); diff --git a/packages/kbn-esql-utils/src/utils/get_initial_esql_query.test.ts b/packages/kbn-esql-utils/src/utils/get_initial_esql_query.test.ts index 26d3b1c0c4a89..0a2a6c6eef4b3 100644 --- a/packages/kbn-esql-utils/src/utils/get_initial_esql_query.test.ts +++ b/packages/kbn-esql-utils/src/utils/get_initial_esql_query.test.ts @@ -96,7 +96,7 @@ describe('getInitialESQLQuery', () => { ] as DataView['fields']; const dataView = getDataView('logs*', fields, '@custom_timestamp'); expect(getInitialESQLQuery(dataView)).toBe( - 'FROM logs* | WHERE @custom_timestamp >= ?start AND @custom_timestamp <= ?end | LIMIT 10' + 'FROM logs* | WHERE @custom_timestamp >= ?t_start AND @custom_timestamp <= ?t_end | LIMIT 10' ); }); }); diff --git a/packages/kbn-esql-utils/src/utils/get_initial_esql_query.ts b/packages/kbn-esql-utils/src/utils/get_initial_esql_query.ts index 1d78432b14269..920cd3a873ca8 100644 --- a/packages/kbn-esql-utils/src/utils/get_initial_esql_query.ts +++ b/packages/kbn-esql-utils/src/utils/get_initial_esql_query.ts @@ -18,7 +18,7 @@ export function getInitialESQLQuery(dataView: DataView): string { const timeFieldName = dataView?.timeFieldName; const filterByTimeParams = !hasAtTimestampField && timeFieldName - ? ` | WHERE ${timeFieldName} >= ?start AND ${timeFieldName} <= ?end` + ? ` | WHERE ${timeFieldName} >= ?t_start AND ${timeFieldName} <= ?t_end` : ''; return `FROM ${dataView.getIndexPattern()}${filterByTimeParams} | LIMIT 10`; } diff --git a/packages/kbn-esql-utils/src/utils/query_parsing_helpers.test.ts b/packages/kbn-esql-utils/src/utils/query_parsing_helpers.test.ts index e324e3ece274c..03ae190b6167f 100644 --- a/packages/kbn-esql-utils/src/utils/query_parsing_helpers.test.ts +++ b/packages/kbn-esql-utils/src/utils/query_parsing_helpers.test.ts @@ -150,10 +150,12 @@ describe('esql query helpers', () => { }); it('should return the time field if there is at least one time param', () => { - expect(getTimeFieldFromESQLQuery('from a | eval b = 1 | where time >= ?start')).toBe('time'); + expect(getTimeFieldFromESQLQuery('from a | eval b = 1 | where time >= ?t_start')).toBe( + 'time' + ); }); - it('should return undefined if there is one named param but is not ?start or ?end', () => { + it('should return undefined if there is one named param but is not ?t_start or ?t_end', () => { expect( getTimeFieldFromESQLQuery('from a | eval b = 1 | where time >= ?late') ).toBeUndefined(); @@ -161,14 +163,14 @@ describe('esql query helpers', () => { it('should return undefined if there is one named param but is used without a time field', () => { expect( - getTimeFieldFromESQLQuery('from a | eval b = DATE_TRUNC(1 day, ?start)') + getTimeFieldFromESQLQuery('from a | eval b = DATE_TRUNC(1 day, ?t_start)') ).toBeUndefined(); }); it('should return the time field if there is at least one time param in the bucket function', () => { expect( getTimeFieldFromESQLQuery( - 'from a | stats meow = avg(bytes) by bucket(event.timefield, 200, ?start, ?end)' + 'from a | stats meow = avg(bytes) by bucket(event.timefield, 200, ?t_start, ?t_end)' ) ).toBe('event.timefield'); }); diff --git a/packages/kbn-esql-utils/src/utils/query_parsing_helpers.ts b/packages/kbn-esql-utils/src/utils/query_parsing_helpers.ts index 52bd46f2927cf..61a0b4c48c128 100644 --- a/packages/kbn-esql-utils/src/utils/query_parsing_helpers.ts +++ b/packages/kbn-esql-utils/src/utils/query_parsing_helpers.ts @@ -56,7 +56,7 @@ export function removeDropCommandsFromESQLQuery(esql?: string): string { } /** - * When the ?start and ?end params are used, we want to retrieve the timefield from the query. + * When the ?t_start and ?t_end params are used, we want to retrieve the timefield from the query. * @param esql:string * @returns string */ @@ -69,7 +69,9 @@ export const getTimeFieldFromESQLQuery = (esql: string) => { }); const params = Walker.params(ast); - const timeNamedParam = params.find((param) => param.value === 'start' || param.value === 'end'); + const timeNamedParam = params.find( + (param) => param.value === 't_start' || param.value === 't_end' + ); if (!timeNamedParam || !functions.length) { return undefined; } diff --git a/packages/kbn-esql-utils/src/utils/run_query.test.ts b/packages/kbn-esql-utils/src/utils/run_query.test.ts index 4f5c4dfb9e47d..3dda728b605ba 100644 --- a/packages/kbn-esql-utils/src/utils/run_query.test.ts +++ b/packages/kbn-esql-utils/src/utils/run_query.test.ts @@ -17,26 +17,26 @@ describe('getStartEndParams', () => { it('should return an array with the start param if exists at the query', () => { const time = { from: 'Jul 5, 2024 @ 08:03:56.849', to: 'Jul 5, 2024 @ 10:03:56.849' }; - const query = 'FROM foo | where time > ?start'; + const query = 'FROM foo | where time > ?t_start'; const params = getStartEndParams(query, time); expect(params).toHaveLength(1); - expect(params[0]).toHaveProperty('start'); + expect(params[0]).toHaveProperty('t_start'); }); it('should return an array with the end param if exists at the query', () => { const time = { from: 'Jul 5, 2024 @ 08:03:56.849', to: 'Jul 5, 2024 @ 10:03:56.849' }; - const query = 'FROM foo | where time < ?end'; + const query = 'FROM foo | where time < ?t_end'; const params = getStartEndParams(query, time); expect(params).toHaveLength(1); - expect(params[0]).toHaveProperty('end'); + expect(params[0]).toHaveProperty('t_end'); }); it('should return an array with the end and start params if exist at the query', () => { const time = { from: 'Jul 5, 2024 @ 08:03:56.849', to: 'Jul 5, 2024 @ 10:03:56.849' }; - const query = 'FROM foo | where time < ?end amd time > ?start'; + const query = 'FROM foo | where time < ?t_end amd time > ?t_start'; const params = getStartEndParams(query, time); expect(params).toHaveLength(2); - expect(params[0]).toHaveProperty('start'); - expect(params[1]).toHaveProperty('end'); + expect(params[0]).toHaveProperty('t_start'); + expect(params[1]).toHaveProperty('t_end'); }); }); diff --git a/packages/kbn-esql-utils/src/utils/run_query.ts b/packages/kbn-esql-utils/src/utils/run_query.ts index 2041e686cb797..033afea1bf1f7 100644 --- a/packages/kbn-esql-utils/src/utils/run_query.ts +++ b/packages/kbn-esql-utils/src/utils/run_query.ts @@ -14,11 +14,11 @@ import { esFieldTypeToKibanaFieldType } from '@kbn/field-types'; import type { ESQLColumn, ESQLSearchResponse, ESQLSearchParams } from '@kbn/es-types'; import { lastValueFrom } from 'rxjs'; -export const hasStartEndParams = (query: string) => /\?start|\?end/i.test(query); +export const hasStartEndParams = (query: string) => /\?t_start|\?t_end/i.test(query); export const getStartEndParams = (query: string, time?: TimeRange) => { - const startNamedParams = /\?start/i.test(query); - const endNamedParams = /\?end/i.test(query); + const startNamedParams = /\?t_start/i.test(query); + const endNamedParams = /\?t_end/i.test(query); if (time && (startNamedParams || endNamedParams)) { const timeParams = { start: startNamedParams ? dateMath.parse(time.from)?.toISOString() : undefined, @@ -26,10 +26,10 @@ export const getStartEndParams = (query: string, time?: TimeRange) => { }; const namedParams = []; if (timeParams?.start) { - namedParams.push({ start: timeParams.start }); + namedParams.push({ t_start: timeParams.start }); } if (timeParams?.end) { - namedParams.push({ end: timeParams.end }); + namedParams.push({ t_end: timeParams.end }); } return namedParams; } diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/helpers.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/helpers.ts index 4c4ad9902ac8c..a05e8059d1308 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/helpers.ts @@ -286,7 +286,7 @@ export function getPolicyFields(policyName: string) { } export interface SuggestOptions { - ctx?: EditorContext; + triggerCharacter?: string; callbacks?: ESQLCallbacks; } @@ -301,9 +301,10 @@ export const setup = async (caret = '/') => { const pos = query.indexOf(caret); if (pos < 0) throw new Error(`User cursor/caret "${caret}" not found in query: ${query}`); const querySansCaret = query.slice(0, pos) + query.slice(pos + 1); - const ctx = - opts.ctx ?? - (pos > 0 ? { triggerKind: 1, triggerCharacter: query[pos - 1] } : { triggerKind: 0 }); + const ctx: EditorContext = opts.triggerCharacter + ? { triggerKind: 1, triggerCharacter: opts.triggerCharacter } + : { triggerKind: 0 }; + return await autocomplete.suggest( querySansCaret, pos, diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts index 132ff6e572dd7..dfae9d76a73af 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts @@ -37,6 +37,7 @@ import { getPolicyFields, PartialSuggestionWithText, TIME_PICKER_SUGGESTION, + setup, } from './__tests__/helpers'; import { METADATA_FIELDS } from '../shared/constants'; import { ESQL_COMMON_NUMERIC_TYPES, ESQL_STRING_TYPES } from '../shared/esql_types'; @@ -51,7 +52,6 @@ describe('autocomplete', () => { string, Array, string?, - number?, Parameters? ]; @@ -60,45 +60,17 @@ describe('autocomplete', () => { statement: string, expected: Array, triggerCharacter?: string, - _offset?: number, customCallbacksArgs: Parameters = [ undefined, undefined, undefined, ] ) => { - const context = createCompletionContext(triggerCharacter); const testFn = only ? test.only : skip ? test.skip : test; - const offset = _offset - ? _offset - : triggerCharacter - ? statement.lastIndexOf(triggerCharacter) + 1 - : statement.length; - testFn(statement, async () => { const callbackMocks = createCustomCallbackMocks(...customCallbacksArgs); - const suggestions = await suggest( - statement, - offset, - context, - async (text) => (text ? getAstAndSyntaxErrors(text) : { ast: [], errors: [] }), - callbackMocks - ); - - const sortedSuggestionTexts = suggestions.map((suggestion) => suggestion.text).sort(); - const sortedExpectedTexts = expected - .map((suggestion) => (typeof suggestion === 'string' ? suggestion : suggestion.text ?? '')) - .sort(); - - expect(sortedSuggestionTexts).toEqual(sortedExpectedTexts); - const expectedNonStringSuggestions = expected.filter( - (suggestion) => typeof suggestion !== 'string' - ) as PartialSuggestionWithText[]; - - for (const expectedSuggestion of expectedNonStringSuggestions) { - const suggestion = suggestions.find((s) => s.text === expectedSuggestion.text); - expect(suggestion).toEqual(expect.objectContaining(expectedSuggestion)); - } + const { assertSuggestions } = await setup(); + await assertSuggestions(statement, expected, { callbacks: callbackMocks, triggerCharacter }); }); }; @@ -116,33 +88,34 @@ describe('autocomplete', () => { }, }); + // const sourceCommands = ['row', 'from', 'show', 'metrics']; Uncomment when metrics is being released const sourceCommands = ['row', 'from', 'show']; describe('New command', () => { testSuggestions( - ' ', + '/', sourceCommands.map((name) => name.toUpperCase() + ' $0') ); testSuggestions( - 'from a | ', + 'from a | /', commandDefinitions .filter(({ name }) => !sourceCommands.includes(name)) .map(({ name }) => name.toUpperCase() + ' $0') ); testSuggestions( - 'from a [metadata _id] | ', + 'from a [metadata _id] | /', commandDefinitions .filter(({ name }) => !sourceCommands.includes(name)) .map(({ name }) => name.toUpperCase() + ' $0') ); testSuggestions( - 'from a | eval var0 = a | ', + 'from a | eval var0 = a | /', commandDefinitions .filter(({ name }) => !sourceCommands.includes(name)) .map(({ name }) => name.toUpperCase() + ' $0') ); testSuggestions( - 'from a [metadata _id] | eval var0 = a | ', + 'from a [metadata _id] | eval var0 = a | /', commandDefinitions .filter(({ name }) => !sourceCommands.includes(name)) .map(({ name }) => name.toUpperCase() + ' $0') @@ -150,9 +123,9 @@ describe('autocomplete', () => { }); describe('show', () => { - testSuggestions('show ', ['INFO']); + testSuggestions('show /', ['INFO']); for (const fn of ['info']) { - testSuggestions(`show ${fn} `, ['| ']); + testSuggestions(`show ${fn} /`, ['| ']); } }); @@ -160,16 +133,16 @@ describe('autocomplete', () => { const allEvalFns = getFunctionSignaturesByReturnType('where', 'any', { scalar: true, }); - testSuggestions('from a | where ', [ + testSuggestions('from a | where /', [ ...getFieldNamesByType('any').map((field) => `${field} `), ...allEvalFns, ]); - testSuggestions('from a | eval var0 = 1 | where ', [ + testSuggestions('from a | eval var0 = 1 | where /', [ ...getFieldNamesByType('any').map((name) => `${name} `), 'var0', ...allEvalFns, ]); - testSuggestions('from a | where keywordField ', [ + testSuggestions('from a | where keywordField /', [ // all functions compatible with a keywordField type ...getFunctionSignaturesByReturnType( 'where', @@ -187,27 +160,27 @@ describe('autocomplete', () => { scalar: true, }), ]; - testSuggestions('from a | where textField >= ', expectedComparisonWithTextFieldSuggestions); + testSuggestions('from a | where textField >= /', expectedComparisonWithTextFieldSuggestions); testSuggestions( - 'from a | where textField >= textField', + 'from a | where textField >= textField/', expectedComparisonWithTextFieldSuggestions ); for (const op of ['and', 'or']) { - testSuggestions(`from a | where keywordField >= keywordField ${op} `, [ + testSuggestions(`from a | where keywordField >= keywordField ${op} /`, [ ...getFieldNamesByType('any'), ...getFunctionSignaturesByReturnType('where', 'any', { scalar: true }), ]); - testSuggestions(`from a | where keywordField >= keywordField ${op} doubleField `, [ + testSuggestions(`from a | where keywordField >= keywordField ${op} doubleField /`, [ ...getFunctionSignaturesByReturnType('where', 'boolean', { builtin: true }, ['double']), ]); - testSuggestions(`from a | where keywordField >= keywordField ${op} doubleField == `, [ + testSuggestions(`from a | where keywordField >= keywordField ${op} doubleField == /`, [ ...getFieldNamesByType(ESQL_COMMON_NUMERIC_TYPES), ...getFunctionSignaturesByReturnType('where', ESQL_COMMON_NUMERIC_TYPES, { scalar: true, }), ]); } - testSuggestions('from a | stats a=avg(doubleField) | where a ', [ + testSuggestions('from a | stats a=avg(doubleField) | where a /', [ ...getFunctionSignaturesByReturnType('where', 'any', { builtin: true, skipAssign: true }, [ 'double', ]), @@ -216,16 +189,15 @@ describe('autocomplete', () => { // in this case the doubleField has been wiped by the STATS command and suggest cannot find it's type // @TODO: verify this is the correct behaviour in this case or if we want a "generic" suggestion anyway testSuggestions( - 'from a | stats a=avg(doubleField) | where doubleField ', + 'from a | stats a=avg(doubleField) | where doubleField /', [], undefined, - undefined, // make the fields suggest aware of the previous STATS, leave the other callbacks untouched [[{ name: 'a', type: 'double' }], undefined, undefined] ); // The editor automatically inject the final bracket, so it is not useful to test with just open bracket testSuggestions( - 'from a | where log10()', + 'from a | where log10(/)', [ ...getFieldNamesByType(log10ParameterTypes), ...getFunctionSignaturesByReturnType( @@ -238,12 +210,12 @@ describe('autocomplete', () => { ], '(' ); - testSuggestions('from a | where log10(doubleField) ', [ + testSuggestions('from a | where log10(doubleField) /', [ ...getFunctionSignaturesByReturnType('where', 'double', { builtin: true }, ['double']), ...getFunctionSignaturesByReturnType('where', 'boolean', { builtin: true }, ['double']), ]); testSuggestions( - 'from a | WHERE pow(doubleField, )', + 'from a | WHERE pow(doubleField, /)', [ ...getFieldNamesByType(powParameterTypes), ...getFunctionSignaturesByReturnType( @@ -257,44 +229,34 @@ describe('autocomplete', () => { ',' ); - testSuggestions('from index | WHERE keywordField not ', ['LIKE $0', 'RLIKE $0', 'IN $0']); - testSuggestions('from index | WHERE keywordField NOT ', ['LIKE $0', 'RLIKE $0', 'IN $0']); - testSuggestions('from index | WHERE not ', [ + testSuggestions('from index | WHERE keywordField not /', ['LIKE $0', 'RLIKE $0', 'IN $0']); + testSuggestions('from index | WHERE keywordField NOT /', ['LIKE $0', 'RLIKE $0', 'IN $0']); + testSuggestions('from index | WHERE not /', [ ...getFieldNamesByType('boolean'), ...getFunctionSignaturesByReturnType('eval', 'boolean', { scalar: true }), ]); - testSuggestions('from index | WHERE doubleField in ', ['( $0 )']); - testSuggestions('from index | WHERE doubleField not in ', ['( $0 )']); + testSuggestions('from index | WHERE doubleField in /', ['( $0 )']); + testSuggestions('from index | WHERE doubleField not in /', ['( $0 )']); testSuggestions( - 'from index | WHERE doubleField not in ( )', + 'from index | WHERE doubleField not in (/)', [ ...getFieldNamesByType('double').filter((name) => name !== 'doubleField'), ...getFunctionSignaturesByReturnType('where', 'double', { scalar: true }), ], '(' ); - testSuggestions( - 'from index | WHERE doubleField in ( `any#Char$Field`, )', - [ - ...getFieldNamesByType('double').filter( - (name) => name !== '`any#Char$Field`' && name !== 'doubleField' - ), - ...getFunctionSignaturesByReturnType('where', 'double', { scalar: true }), - ], - undefined, - 54 // after the first suggestions - ); - testSuggestions( - 'from index | WHERE doubleField not in ( `any#Char$Field`, )', - [ - ...getFieldNamesByType('double').filter( - (name) => name !== '`any#Char$Field`' && name !== 'doubleField' - ), - ...getFunctionSignaturesByReturnType('where', 'double', { scalar: true }), - ], - undefined, - 58 // after the first suggestions - ); + testSuggestions('from index | WHERE doubleField in ( `any#Char$Field`, /)', [ + ...getFieldNamesByType('double').filter( + (name) => name !== '`any#Char$Field`' && name !== 'doubleField' + ), + ...getFunctionSignaturesByReturnType('where', 'double', { scalar: true }), + ]); + testSuggestions('from index | WHERE doubleField not in ( `any#Char$Field`, /)', [ + ...getFieldNamesByType('double').filter( + (name) => name !== '`any#Char$Field`' && name !== 'doubleField' + ), + ...getFunctionSignaturesByReturnType('where', 'double', { scalar: true }), + ]); }); describe('grok', () => { @@ -309,11 +271,11 @@ describe('autocomplete', () => { for (const subExpression of subExpressions) { // Unskip once https://github.com/elastic/kibana/issues/190070 is fixed testSuggestions.skip( - `from a | ${subExpression} grok `, + `from a | ${subExpression} grok /`, getFieldNamesByType(ESQL_STRING_TYPES) ); - testSuggestions(`from a | ${subExpression} grok keywordField `, [constantPattern], ' '); - testSuggestions(`from a | ${subExpression} grok keywordField ${constantPattern} `, ['| ']); + testSuggestions(`from a | ${subExpression} grok keywordField /`, [constantPattern], ' '); + testSuggestions(`from a | ${subExpression} grok keywordField ${constantPattern} /`, ['| ']); } }); @@ -328,69 +290,74 @@ describe('autocomplete', () => { for (const subExpression of subExpressions) { // Unskip once https://github.com/elastic/kibana/issues/190070 is fixed testSuggestions.skip( - `from a | ${subExpression} dissect `, + `from a | ${subExpression} dissect /`, getFieldNamesByType(ESQL_STRING_TYPES) ); - testSuggestions(`from a | ${subExpression} dissect keywordField `, [constantPattern], ' '); + testSuggestions(`from a | ${subExpression} dissect keywordField /`, [constantPattern], ' '); testSuggestions( - `from a | ${subExpression} dissect keywordField ${constantPattern} `, + `from a | ${subExpression} dissect keywordField ${constantPattern} /`, ['APPEND_SEPARATOR = $0', '| '], ' ' ); testSuggestions( - `from a | ${subExpression} dissect keywordField ${constantPattern} append_separator = `, + `from a | ${subExpression} dissect keywordField ${constantPattern} append_separator = /`, ['":"', '";"'] ); testSuggestions( - `from a | ${subExpression} dissect keywordField ${constantPattern} append_separator = ":" `, + `from a | ${subExpression} dissect keywordField ${constantPattern} append_separator = ":" /`, ['| '] ); } }); describe('sort', () => { - testSuggestions('from a | sort ', [ + testSuggestions('from a | sort /', [ ...getFieldNamesByType('any').map((name) => `${name} `), ...getFunctionSignaturesByReturnType('sort', 'any', { scalar: true }), ]); - testSuggestions('from a | sort keywordField ', ['ASC ', 'DESC ', ',', '| ']); - testSuggestions('from a | sort keywordField desc ', ['NULLS FIRST ', 'NULLS LAST ', ',', '| ']); + testSuggestions('from a | sort keywordField /', ['ASC ', 'DESC ', ',', '| ']); + testSuggestions('from a | sort keywordField desc /', [ + 'NULLS FIRST ', + 'NULLS LAST ', + ',', + '| ', + ]); // @TODO: improve here // testSuggestions('from a | sort keywordField desc ', ['first', 'last']); }); describe('limit', () => { - testSuggestions('from a | limit ', ['10 ', '100 ', '1000 ']); - testSuggestions('from a | limit 4 ', ['| ']); + testSuggestions('from a | limit /', ['10 ', '100 ', '1000 ']); + testSuggestions('from a | limit 4 /', ['| ']); }); describe('mv_expand', () => { - testSuggestions('from a | mv_expand ', getFieldNamesByType('any')); - testSuggestions('from a | mv_expand a ', ['| ']); + testSuggestions('from a | mv_expand /', getFieldNamesByType('any')); + testSuggestions('from a | mv_expand a /', ['| ']); }); describe('rename', () => { - testSuggestions('from a | rename ', getFieldNamesByType('any')); - testSuggestions('from a | rename keywordField ', ['AS $0'], ' '); - testSuggestions('from a | rename keywordField as ', ['var0']); + testSuggestions('from a | rename /', getFieldNamesByType('any')); + testSuggestions('from a | rename keywordField /', ['AS $0'], ' '); + testSuggestions('from a | rename keywordField as /', ['var0']); }); for (const command of ['keep', 'drop']) { describe(command, () => { - testSuggestions(`from a | ${command} `, getFieldNamesByType('any')); + testSuggestions(`from a | ${command} /`, getFieldNamesByType('any')); testSuggestions( - `from a | ${command} keywordField, `, + `from a | ${command} keywordField, /`, getFieldNamesByType('any').filter((name) => name !== 'keywordField') ); testSuggestions( - `from a | ${command} keywordField,`, + `from a | ${command} keywordField,/`, getFieldNamesByType('any').filter((name) => name !== 'keywordField'), ',' ); testSuggestions( - `from a_index | eval round(doubleField) + 1 | eval \`round(doubleField) + 1\` + 1 | eval \`\`\`round(doubleField) + 1\`\` + 1\` + 1 | eval \`\`\`\`\`\`\`round(doubleField) + 1\`\`\`\` + 1\`\` + 1\` + 1 | eval \`\`\`\`\`\`\`\`\`\`\`\`\`\`\`round(doubleField) + 1\`\`\`\`\`\`\`\` + 1\`\`\`\` + 1\`\` + 1\` + 1 | ${command} `, + `from a_index | eval round(doubleField) + 1 | eval \`round(doubleField) + 1\` + 1 | eval \`\`\`round(doubleField) + 1\`\` + 1\` + 1 | eval \`\`\`\`\`\`\`round(doubleField) + 1\`\`\`\` + 1\`\` + 1\` + 1 | eval \`\`\`\`\`\`\`\`\`\`\`\`\`\`\`round(doubleField) + 1\`\`\`\`\`\`\`\` + 1\`\`\`\` + 1\`\` + 1\` + 1 | ${command} /`, [ ...getFieldNamesByType('any'), '`round(doubleField) + 1`', @@ -412,52 +379,51 @@ describe('autocomplete', () => { // '| enrich other-policy on b ', // '| enrich other-policy with c ', ]) { - testSuggestions(`from a ${prevCommand}| enrich `, policyNames); + testSuggestions(`from a ${prevCommand}| enrich /`, policyNames); testSuggestions( - `from a ${prevCommand}| enrich _`, + `from a ${prevCommand}| enrich _/`, modes.map((mode) => `_${mode}:$0`), '_' ); for (const mode of modes) { - testSuggestions(`from a ${prevCommand}| enrich _${mode}:`, policyNames, ':'); - testSuggestions(`from a ${prevCommand}| enrich _${mode.toUpperCase()}:`, policyNames, ':'); - testSuggestions(`from a ${prevCommand}| enrich _${camelCase(mode)}:`, policyNames, ':'); + testSuggestions(`from a ${prevCommand}| enrich _${mode}:/`, policyNames, ':'); + testSuggestions(`from a ${prevCommand}| enrich _${mode.toUpperCase()}:/`, policyNames, ':'); + testSuggestions(`from a ${prevCommand}| enrich _${camelCase(mode)}:/`, policyNames, ':'); } - testSuggestions(`from a ${prevCommand}| enrich policy `, ['ON $0', 'WITH $0', '| ']); - testSuggestions(`from a ${prevCommand}| enrich policy on `, getFieldNamesByType('any')); - testSuggestions(`from a ${prevCommand}| enrich policy on b `, ['WITH $0', ',', '| ']); + testSuggestions(`from a ${prevCommand}| enrich policy /`, ['ON $0', 'WITH $0', '| ']); + testSuggestions(`from a ${prevCommand}| enrich policy on /`, getFieldNamesByType('any')); + testSuggestions(`from a ${prevCommand}| enrich policy on b /`, ['WITH $0', ',', '| ']); testSuggestions( - `from a ${prevCommand}| enrich policy on b with `, + `from a ${prevCommand}| enrich policy on b with /`, ['var0 = ', ...getPolicyFields('policy')], ' ' ); - testSuggestions(`from a ${prevCommand}| enrich policy on b with var0 `, ['= $0', ',', '| ']); - testSuggestions(`from a ${prevCommand}| enrich policy on b with var0 = `, [ + testSuggestions(`from a ${prevCommand}| enrich policy on b with var0 /`, ['= $0', ',', '| ']); + testSuggestions(`from a ${prevCommand}| enrich policy on b with var0 = /`, [ ...getPolicyFields('policy'), ]); - testSuggestions(`from a ${prevCommand}| enrich policy on b with var0 = keywordField `, [ + testSuggestions(`from a ${prevCommand}| enrich policy on b with var0 = keywordField /`, [ ',', '| ', ]); - testSuggestions(`from a ${prevCommand}| enrich policy on b with var0 = keywordField, `, [ + testSuggestions(`from a ${prevCommand}| enrich policy on b with var0 = keywordField, /`, [ 'var1 = ', ...getPolicyFields('policy'), ]); - testSuggestions(`from a ${prevCommand}| enrich policy on b with var0 = keywordField, var1 `, [ - '= $0', - ',', - '| ', - ]); testSuggestions( - `from a ${prevCommand}| enrich policy on b with var0 = keywordField, var1 = `, + `from a ${prevCommand}| enrich policy on b with var0 = keywordField, var1 /`, + ['= $0', ',', '| '] + ); + testSuggestions( + `from a ${prevCommand}| enrich policy on b with var0 = keywordField, var1 = /`, [...getPolicyFields('policy')] ); testSuggestions( - `from a ${prevCommand}| enrich policy with `, + `from a ${prevCommand}| enrich policy with /`, ['var0 = ', ...getPolicyFields('policy')], ' ' ); - testSuggestions(`from a ${prevCommand}| enrich policy with keywordField `, [ + testSuggestions(`from a ${prevCommand}| enrich policy with keywordField /`, [ '= $0', ',', '| ', @@ -466,53 +432,52 @@ describe('autocomplete', () => { }); describe('eval', () => { - testSuggestions('from a | eval ', [ + testSuggestions('from a | eval /', [ 'var0 = ', ...getFieldNamesByType('any'), ...getFunctionSignaturesByReturnType('eval', 'any', { scalar: true }), ]); - testSuggestions('from a | eval doubleField ', [ + testSuggestions('from a | eval doubleField /', [ ...getFunctionSignaturesByReturnType('eval', 'any', { builtin: true, skipAssign: true }, [ 'double', ]), ',', '| ', ]); - testSuggestions('from index | EVAL keywordField not ', ['LIKE $0', 'RLIKE $0', 'IN $0']); - testSuggestions('from index | EVAL keywordField NOT ', ['LIKE $0', 'RLIKE $0', 'IN $0']); - testSuggestions('from index | EVAL doubleField in ', ['( $0 )']); + testSuggestions('from index | EVAL keywordField not /', ['LIKE $0', 'RLIKE $0', 'IN $0']); + testSuggestions('from index | EVAL keywordField NOT /', ['LIKE $0', 'RLIKE $0', 'IN $0']); + testSuggestions('from index | EVAL doubleField in /', ['( $0 )']); testSuggestions( - 'from index | EVAL doubleField in ( )', + 'from index | EVAL doubleField in (/)', [ ...getFieldNamesByType('double').filter((name) => name !== 'doubleField'), ...getFunctionSignaturesByReturnType('eval', 'double', { scalar: true }), ], '(' ); - testSuggestions('from index | EVAL doubleField not in ', ['( $0 )']); - testSuggestions('from index | EVAL not ', [ + testSuggestions('from index | EVAL doubleField not in /', ['( $0 )']); + testSuggestions('from index | EVAL not /', [ ...getFieldNamesByType('boolean'), ...getFunctionSignaturesByReturnType('eval', 'boolean', { scalar: true }), ]); - testSuggestions('from a | eval a=', [ - ...getFunctionSignaturesByReturnType('eval', 'any', { scalar: true }), - ]); - testSuggestions('from a | eval a=abs(doubleField), b= ', [ - ...getFunctionSignaturesByReturnType('eval', 'any', { scalar: true }), - ]); - testSuggestions('from a | eval a=doubleField, ', [ + testSuggestions( + 'from a | eval a=/', + [...getFunctionSignaturesByReturnType('eval', 'any', { scalar: true })], + '=' + ); + testSuggestions( + 'from a | eval a=abs(doubleField), b= /', + [...getFunctionSignaturesByReturnType('eval', 'any', { scalar: true })], + '=' + ); + testSuggestions('from a | eval a=doubleField, /', [ 'var0 = ', ...getFieldNamesByType('any'), 'a', ...getFunctionSignaturesByReturnType('eval', 'any', { scalar: true }), ]); - // Skip this test until the insensitive case equality gets restored back - testSuggestions.skip('from a | eval a=keywordField =~ ', [ - ...getFieldNamesByType(ESQL_STRING_TYPES), - ...getFunctionSignaturesByReturnType('eval', ESQL_STRING_TYPES, { scalar: true }), - ]); testSuggestions( - 'from a | eval a=round()', + 'from a | eval a=round(/)', [ ...getFieldNamesByType(roundParameterTypes), ...getFunctionSignaturesByReturnType( @@ -526,29 +491,29 @@ describe('autocomplete', () => { '(' ); testSuggestions( - 'from a | eval a=raund()', // note the typo in round + 'from a | eval a=raund(/)', // note the typo in round [], '(' ); testSuggestions( - 'from a | eval a=raund(', // note the typo in round + 'from a | eval a=raund(/', // note the typo in round [] ); testSuggestions( - 'from a | eval raund(', // note the typo in round + 'from a | eval raund(/', // note the typo in round [] ); testSuggestions( - 'from a | eval raund(5, ', // note the typo in round + 'from a | eval raund(5, /', // note the typo in round [], ' ' ); testSuggestions( - 'from a | eval var0 = raund(5, ', // note the typo in round + 'from a | eval var0 = raund(5, /', // note the typo in round [], ' ' ); - testSuggestions('from a | eval a=round(doubleField) ', [ + testSuggestions('from a | eval a=round(doubleField) /', [ ',', '| ', ...getFunctionSignaturesByReturnType('eval', 'any', { builtin: true, skipAssign: true }, [ @@ -556,7 +521,7 @@ describe('autocomplete', () => { ]), ]); testSuggestions( - 'from a | eval a=round(doubleField, ', + 'from a | eval a=round(doubleField, /', [ ...getFieldNamesByType('integer'), ...getFunctionSignaturesByReturnType('eval', 'integer', { scalar: true }, undefined, [ @@ -566,7 +531,7 @@ describe('autocomplete', () => { ' ' ); testSuggestions( - 'from a | eval round(doubleField, ', + 'from a | eval round(doubleField, /', [ ...getFieldNamesByType('integer'), ...getFunctionSignaturesByReturnType('eval', 'integer', { scalar: true }, undefined, [ @@ -575,50 +540,49 @@ describe('autocomplete', () => { ], ' ' ); - testSuggestions('from a | eval a=round(doubleField),', [ + testSuggestions('from a | eval a=round(doubleField),/', [ 'var0 = ', ...getFieldNamesByType('any'), 'a', ...getFunctionSignaturesByReturnType('eval', 'any', { scalar: true }), ]); - testSuggestions('from a | eval a=round(doubleField) + ', [ + testSuggestions('from a | eval a=round(doubleField) + /', [ ...getFieldNamesByType(ESQL_COMMON_NUMERIC_TYPES), ...getFunctionSignaturesByReturnType('eval', ESQL_COMMON_NUMERIC_TYPES, { scalar: true, }), ]); - testSuggestions('from a | eval a=round(doubleField)+ ', [ + testSuggestions('from a | eval a=round(doubleField)+ /', [ ...getFieldNamesByType(ESQL_COMMON_NUMERIC_TYPES), ...getFunctionSignaturesByReturnType('eval', ESQL_COMMON_NUMERIC_TYPES, { scalar: true, }), ]); - testSuggestions('from a | eval a=doubleField+ ', [ + testSuggestions('from a | eval a=doubleField+ /', [ ...getFieldNamesByType(ESQL_COMMON_NUMERIC_TYPES), ...getFunctionSignaturesByReturnType('eval', ESQL_COMMON_NUMERIC_TYPES, { scalar: true, }), ]); - testSuggestions('from a | eval a=`any#Char$Field`+ ', [ + testSuggestions('from a | eval a=`any#Char$Field`+ /', [ ...getFieldNamesByType(ESQL_COMMON_NUMERIC_TYPES), ...getFunctionSignaturesByReturnType('eval', ESQL_COMMON_NUMERIC_TYPES, { scalar: true, }), ]); testSuggestions( - 'from a | stats avg(doubleField) by keywordField | eval ', + 'from a | stats avg(doubleField) by keywordField | eval /', [ 'var0 = ', '`avg(doubleField)`', ...getFunctionSignaturesByReturnType('eval', 'any', { scalar: true }), ], ' ', - undefined, // make aware EVAL of the previous STATS command [[], undefined, undefined] ); testSuggestions( - 'from a | eval abs(doubleField) + 1 | eval ', + 'from a | eval abs(doubleField) + 1 | eval /', [ 'var0 = ', ...getFieldNamesByType('any'), @@ -628,19 +592,18 @@ describe('autocomplete', () => { ' ' ); testSuggestions( - 'from a | stats avg(doubleField) by keywordField | eval ', + 'from a | stats avg(doubleField) by keywordField | eval /', [ 'var0 = ', '`avg(doubleField)`', ...getFunctionSignaturesByReturnType('eval', 'any', { scalar: true }), ], ' ', - undefined, // make aware EVAL of the previous STATS command with the buggy field name from expression [[{ name: 'avg_doubleField_', type: 'double' }], undefined, undefined] ); testSuggestions( - 'from a | stats avg(doubleField), avg(kubernetes.something.something) by keywordField | eval ', + 'from a | stats avg(doubleField), avg(kubernetes.something.something) by keywordField | eval /', [ 'var0 = ', '`avg(doubleField)`', @@ -648,7 +611,6 @@ describe('autocomplete', () => { ...getFunctionSignaturesByReturnType('eval', 'any', { scalar: true }), ], ' ', - undefined, // make aware EVAL of the previous STATS command with the buggy field name from expression [ [ @@ -661,7 +623,7 @@ describe('autocomplete', () => { ); testSuggestions( - 'from a | eval a=round(doubleField), b=round()', + 'from a | eval a=round(doubleField), b=round(/)', [ ...getFieldNamesByType(roundParameterTypes), ...getFunctionSignaturesByReturnType( @@ -675,7 +637,7 @@ describe('autocomplete', () => { '(' ); // test that comma is correctly added to the suggestions if minParams is not reached yet - testSuggestions('from a | eval a=concat( ', [ + testSuggestions('from a | eval a=concat( /', [ ...getFieldNamesByType(['text', 'keyword']).map((v) => `${v}, `), ...getFunctionSignaturesByReturnType( 'eval', @@ -686,7 +648,7 @@ describe('autocomplete', () => { ).map((v) => ({ ...v, text: `${v.text},` })), ]); testSuggestions( - 'from a | eval a=concat(textField, ', + 'from a | eval a=concat(textField, /', [ ...getFieldNamesByType(['text', 'keyword']), ...getFunctionSignaturesByReturnType( @@ -701,7 +663,7 @@ describe('autocomplete', () => { ); // test that the arg type is correct after minParams testSuggestions( - 'from a | eval a=cidr_match(ipField, textField, ', + 'from a | eval a=cidr_match(ipField, textField, /', [ ...getFieldNamesByType('text'), ...getFunctionSignaturesByReturnType('eval', 'text', { scalar: true }, undefined, [ @@ -711,14 +673,14 @@ describe('autocomplete', () => { ' ' ); // test that comma is correctly added to the suggestions if minParams is not reached yet - testSuggestions('from a | eval a=cidr_match( ', [ + testSuggestions('from a | eval a=cidr_match(/', [ ...getFieldNamesByType('ip').map((v) => `${v}, `), ...getFunctionSignaturesByReturnType('eval', 'ip', { scalar: true }, undefined, [ 'cidr_match', ]).map((v) => ({ ...v, text: `${v.text},` })), ]); testSuggestions( - 'from a | eval a=cidr_match(ipField, ', + 'from a | eval a=cidr_match(ipField, /', [ ...getFieldNamesByType(['text', 'keyword']), ...getFunctionSignaturesByReturnType( @@ -738,7 +700,7 @@ describe('autocomplete', () => { for (const nesting of [1, 2, 3, 4]) { testSuggestions( - `from a | eval a=${Array(nesting).fill('round(').join('')}`, + `from a | eval a=${Array(nesting).fill('round(/').join('')}`, [ ...getFieldNamesByType(roundParameterTypes), ...getFunctionSignaturesByReturnType( @@ -756,33 +718,19 @@ describe('autocomplete', () => { const absParameterTypes = ['double', 'integer', 'long', 'unsigned_long'] as const; // Smoke testing for suggestions in previous position than the end of the statement - testSuggestions( - 'from a | eval var0 = abs(doubleField) | eval abs(var0)', - [ - ',', - '| ', - ...getFunctionSignaturesByReturnType('eval', 'any', { builtin: true, skipAssign: true }, [ - 'double', - ]), - ], - undefined, - 38 /* " " after abs(b) */ - ); - testSuggestions( - 'from a | eval var0 = abs(b) | eval abs(var0)', - [ - ...getFieldNamesByType(absParameterTypes), - ...getFunctionSignaturesByReturnType( - 'eval', - absParameterTypes, - { scalar: true }, - undefined, - ['abs'] - ), - ], - undefined, - 26 /* b column in abs */ - ); + testSuggestions('from a | eval var0 = abs(doubleField) / | eval abs(var0)', [ + ',', + '| ', + ...getFunctionSignaturesByReturnType('eval', 'any', { builtin: true, skipAssign: true }, [ + 'double', + ]), + ]); + testSuggestions('from a | eval var0 = abs(b/) | eval abs(var0)', [ + ...getFieldNamesByType(absParameterTypes), + ...getFunctionSignaturesByReturnType('eval', absParameterTypes, { scalar: true }, undefined, [ + 'abs', + ]), + ]); // Test suggestions for each possible param, within each signature variation, for each function for (const fn of evalFunctionDefinitions) { @@ -822,7 +770,7 @@ describe('autocomplete', () => { }; testSuggestions( - `from a | eval ${fn.name}(${Array(i).fill('field').join(', ')}${i ? ',' : ''} )`, + `from a | eval ${fn.name}(${Array(i).fill('field').join(', ')}${i ? ',' : ''} /)`, suggestedConstants?.length ? suggestedConstants.map((option) => `"${option}"${requiresMoreArgs ? ', ' : ''}`) : [ @@ -846,7 +794,7 @@ describe('autocomplete', () => { testSuggestions( `from a | eval var0 = ${fn.name}(${Array(i).fill('field').join(', ')}${ i ? ',' : '' - } )`, + } /)`, suggestedConstants?.length ? suggestedConstants.map((option) => `"${option}"${requiresMoreArgs ? ', ' : ''}`) : [ @@ -882,7 +830,7 @@ describe('autocomplete', () => { const requiresMoreArgs = true; testSuggestions( - `from a | eval ${fn.name}(`, + `from a | eval ${fn.name}(/`, suggestedConstants?.length ? [...suggestedConstants.map((option) => `"${option}"${requiresMoreArgs ? ', ' : ''}`)] : [] @@ -890,13 +838,13 @@ describe('autocomplete', () => { } } - testSuggestions('from a | eval var0 = bucket(@timestamp, ', getUnitDuration(1), ' '); + testSuggestions('from a | eval var0 = bucket(@timestamp, /', getUnitDuration(1), ' '); describe('date math', () => { const dateSuggestions = timeUnitsToSuggest.map(({ name }) => name); // If a literal number is detected then suggest also date period keywords testSuggestions( - 'from a | eval a = 1 ', + 'from a | eval a = 1 /', [ ...dateSuggestions, ',', @@ -907,16 +855,16 @@ describe('autocomplete', () => { ], ' ' ); - testSuggestions('from a | eval a = 1 year ', [ + testSuggestions('from a | eval a = 1 year /', [ ',', '| ', ...getFunctionSignaturesByReturnType('eval', 'any', { builtin: true, skipAssign: true }, [ 'time_interval', ]), ]); - testSuggestions('from a | eval a = 1 day + 2 ', [',', '| ']); + testSuggestions('from a | eval a = 1 day + 2 /', [',', '| ']); testSuggestions( - 'from a | eval 1 day + 2 ', + 'from a | eval 1 day + 2 /', [ ...dateSuggestions, ...getFunctionSignaturesByReturnType('eval', 'any', { builtin: true, skipAssign: true }, [ @@ -926,12 +874,12 @@ describe('autocomplete', () => { ' ' ); testSuggestions( - 'from a | eval var0=date_trunc()', + 'from a | eval var0=date_trunc(/)', getLiteralsByType('time_literal').map((t) => `${t}, `), '(' ); testSuggestions( - 'from a | eval var0=date_trunc(2 )', + 'from a | eval var0=date_trunc(2 /)', [...dateSuggestions.map((t) => `${t}, `), ','], ' ' ); @@ -939,26 +887,26 @@ describe('autocomplete', () => { }); describe('values suggestions', () => { - testSuggestions('FROM "a"', ['a ', 'b '], undefined, 7, [ + testSuggestions('FROM "a/"', ['a ', 'b '], undefined, [ , [ { name: 'a', hidden: false }, { name: 'b', hidden: false }, ], ]); - testSuggestions('FROM " "', [], ' '); + testSuggestions('FROM " /"', [], ' '); // TODO — re-enable these tests when we can support this case - testSuggestions.skip('FROM " a"', [], undefined, 9); - testSuggestions.skip('FROM "foo b"', [], undefined, 11); - testSuggestions('FROM a | WHERE tags == " "', [], ' '); - testSuggestions('FROM a | WHERE tags == """ """', [], ' '); - testSuggestions('FROM a | WHERE tags == "a"', [], undefined, 25); - testSuggestions('FROM a | EVAL tags == " "', [], ' '); - testSuggestions('FROM a | EVAL tags == "a"', [], undefined, 24); - testSuggestions('FROM a | STATS tags == " "', [], ' '); - testSuggestions('FROM a | STATS tags == "a"', [], undefined, 25); - testSuggestions('FROM a | GROK "a" "%{WORD:firstWord}"', [], undefined, 16); - testSuggestions('FROM a | DISSECT "a" "%{WORD:firstWord}"', [], undefined, 19); + testSuggestions.skip('FROM " a/"', []); + testSuggestions.skip('FROM "foo b/"', []); + testSuggestions('FROM a | WHERE tags == " /"', [], ' '); + testSuggestions('FROM a | WHERE tags == """ /"""', [], ' '); + testSuggestions('FROM a | WHERE tags == "a/"', []); + testSuggestions('FROM a | EVAL tags == " /"', [], ' '); + testSuggestions('FROM a | EVAL tags == "a"/', []); + testSuggestions('FROM a | STATS tags == " /"', [], ' '); + testSuggestions('FROM a | STATS tags == "a/"', []); + testSuggestions('FROM a | GROK "a/" "%{WORD:firstWord}"', []); + testSuggestions('FROM a | DISSECT "a/" "%{WORD:firstWord}"', []); }); describe('callbacks', () => { @@ -1008,39 +956,30 @@ describe('autocomplete', () => { describe('Invoke trigger kind (all commands)', () => { // source command testSuggestions( - 'f', - sourceCommands.map((cmd) => `${cmd.toUpperCase()} $0`), - undefined, - 1 + 'f/', + sourceCommands.map((cmd) => `${cmd.toUpperCase()} $0`) ); // pipe command testSuggestions( - 'FROM k | E', + 'FROM k | E/', commandDefinitions .filter(({ name }) => !sourceCommands.includes(name)) - .map(({ name }) => name.toUpperCase() + ' $0'), - undefined, - 10 + .map(({ name }) => name.toUpperCase() + ' $0') ); describe('function arguments', () => { // function argument - testSuggestions( - 'FROM kibana_sample_data_logs | EVAL TRIM(e)', - [ - ...getFieldNamesByType(['text', 'keyword']), - ...getFunctionSignaturesByReturnType( - 'eval', - ['text', 'keyword'], - { scalar: true }, - undefined, - ['trim'] - ), - ], - undefined, - 42 - ); + testSuggestions('FROM kibana_sample_data_logs | EVAL TRIM(e/)', [ + ...getFieldNamesByType(['text', 'keyword']), + ...getFunctionSignaturesByReturnType( + 'eval', + ['text', 'keyword'], + { scalar: true }, + undefined, + ['trim'] + ), + ]); // subsequent function argument const expectedDateDiff2ndArgSuggestions = [ @@ -1052,19 +991,14 @@ describe('autocomplete', () => { text: `${s.text},`, })), ]; - testSuggestions( - 'FROM a | EVAL DATE_DIFF("day", )', - expectedDateDiff2ndArgSuggestions, - undefined, - 31 - ); + testSuggestions('FROM a | EVAL DATE_DIFF("day", /)', expectedDateDiff2ndArgSuggestions); // trigger character case for comparison - testSuggestions('FROM a | EVAL DATE_DIFF("day", )', expectedDateDiff2ndArgSuggestions, ' '); + testSuggestions('FROM a | EVAL DATE_DIFF("day", /)', expectedDateDiff2ndArgSuggestions, ' '); }); // FROM source - testSuggestions('FROM k', ['index1 ', 'index2 '], undefined, 6, [ + testSuggestions('FROM k/', ['index1 ', 'index2 '], undefined, [ , [ { name: 'index1', hidden: false }, @@ -1073,178 +1007,128 @@ describe('autocomplete', () => { ]); // FROM source METADATA - testSuggestions('FROM index1 M', [',', 'METADATA $0', '| '], undefined, 13); + testSuggestions('FROM index1 M/', [',', 'METADATA $0', '| ']); // FROM source METADATA field - testSuggestions('FROM index1 METADATA _', METADATA_FIELDS, undefined, 22); + testSuggestions('FROM index1 METADATA _/', METADATA_FIELDS); // EVAL argument - testSuggestions( - 'FROM index1 | EVAL b', - [ - 'var0 = ', - ...getFieldNamesByType('any'), - ...getFunctionSignaturesByReturnType('eval', 'any', { scalar: true }), - ], - undefined, - 20 - ); + testSuggestions('FROM index1 | EVAL b/', [ + 'var0 = ', + ...getFieldNamesByType('any'), + ...getFunctionSignaturesByReturnType('eval', 'any', { scalar: true }), + ]); - testSuggestions( - 'FROM index1 | EVAL var0 = f', - [...getFunctionSignaturesByReturnType('eval', 'any', { scalar: true })], - undefined, - 27 - ); + testSuggestions('FROM index1 | EVAL var0 = f/', [ + ...getFunctionSignaturesByReturnType('eval', 'any', { scalar: true }), + ]); // DISSECT field // enable once https://github.com/elastic/kibana/issues/190070 is fixed - testSuggestions.skip( - 'FROM index1 | DISSECT b', - getFieldNamesByType(ESQL_STRING_TYPES), - undefined, - 23 - ); + testSuggestions.skip('FROM index1 | DISSECT b/', getFieldNamesByType(ESQL_STRING_TYPES)); // DROP (first field) - testSuggestions('FROM index1 | DROP f', getFieldNamesByType('any'), undefined, 20); + testSuggestions('FROM index1 | DROP f/', getFieldNamesByType('any')); // DROP (subsequent field) - testSuggestions('FROM index1 | DROP field1, f', getFieldNamesByType('any'), undefined, 28); + testSuggestions('FROM index1 | DROP field1, f/', getFieldNamesByType('any')); // ENRICH policy testSuggestions( - 'FROM index1 | ENRICH p', - policies.map(({ name }) => getSafeInsertText(name)), - undefined, - 22 + 'FROM index1 | ENRICH p/', + policies.map(({ name }) => getSafeInsertText(name)) ); // ENRICH policy ON - testSuggestions('FROM index1 | ENRICH policy O', ['ON $0', 'WITH $0', '| '], undefined, 29); + testSuggestions('FROM index1 | ENRICH policy O/', ['ON $0', 'WITH $0', '| ']); // ENRICH policy ON field - testSuggestions('FROM index1 | ENRICH policy ON f', getFieldNamesByType('any'), undefined, 32); + testSuggestions('FROM index1 | ENRICH policy ON f/', getFieldNamesByType('any')); // ENRICH policy WITH policyfield - testSuggestions( - 'FROM index1 | ENRICH policy WITH v', - ['var0 = ', ...getPolicyFields('policy')], - undefined, - 34 - ); + testSuggestions('FROM index1 | ENRICH policy WITH v/', [ + 'var0 = ', + ...getPolicyFields('policy'), + ]); - testSuggestions( - 'FROM index1 | ENRICH policy WITH \tv', - ['var0 = ', ...getPolicyFields('policy')], - undefined, - 34 - ); + testSuggestions('FROM index1 | ENRICH policy WITH \tv/', [ + 'var0 = ', + ...getPolicyFields('policy'), + ]); // GROK field // enable once https://github.com/elastic/kibana/issues/190070 - testSuggestions.skip( - 'FROM index1 | GROK f', - getFieldNamesByType(ESQL_STRING_TYPES), - undefined, - 20 - ); + testSuggestions.skip('FROM index1 | GROK f/', getFieldNamesByType(ESQL_STRING_TYPES)); // KEEP (first field) - testSuggestions('FROM index1 | KEEP f', getFieldNamesByType('any'), undefined, 20); + testSuggestions('FROM index1 | KEEP f/', getFieldNamesByType('any')); // KEEP (subsequent fields) testSuggestions( - 'FROM index1 | KEEP booleanField, f', - getFieldNamesByType('any').filter((name) => name !== 'booleanField'), - undefined, - 34 + 'FROM index1 | KEEP booleanField, f/', + getFieldNamesByType('any').filter((name) => name !== 'booleanField') ); // LIMIT argument - // Here we actually test that the invoke trigger kind does not work - // because it isn't very useful to see literal suggestions when typing a number - testSuggestions('FROM a | LIMIT 1', ['| '], undefined, 16); + // Here we actually test that the invoke trigger kind does NOT work + // the assumption is that it isn't very useful to see literal suggestions when already typing a number + // I'm not sure if this is true or not, but it's the current behavior + testSuggestions('FROM a | LIMIT 1/', ['| ']); // MV_EXPAND field - testSuggestions('FROM index1 | MV_EXPAND f', getFieldNamesByType('any'), undefined, 25); + testSuggestions('FROM index1 | MV_EXPAND f/', getFieldNamesByType('any')); // RENAME field - testSuggestions('FROM index1 | RENAME f', getFieldNamesByType('any'), undefined, 22); + testSuggestions('FROM index1 | RENAME f/', getFieldNamesByType('any')); // RENAME field AS - testSuggestions('FROM index1 | RENAME field A', ['AS $0'], undefined, 28); + testSuggestions('FROM index1 | RENAME field A/', ['AS $0']); // RENAME field AS var0 - testSuggestions('FROM index1 | RENAME field AS v', ['var0'], undefined, 31); + testSuggestions('FROM index1 | RENAME field AS v/', ['var0']); // SORT field - testSuggestions( - 'FROM index1 | SORT f', - [ - ...getFunctionSignaturesByReturnType('sort', 'any', { scalar: true }), - ...getFieldNamesByType('any').map((field) => `${field} `), - ], - undefined, - 20 - ); + testSuggestions('FROM index1 | SORT f/', [ + ...getFunctionSignaturesByReturnType('sort', 'any', { scalar: true }), + ...getFieldNamesByType('any').map((field) => `${field} `), + ]); // SORT field order - testSuggestions( - 'FROM index1 | SORT keywordField a', - ['ASC ', 'DESC ', ',', '| '], - undefined, - 33 - ); + testSuggestions('FROM index1 | SORT keywordField a/', ['ASC ', 'DESC ', ',', '| ']); // SORT field order nulls - testSuggestions( - 'FROM index1 | SORT keywordField ASC n', - ['NULLS FIRST ', 'NULLS LAST ', ',', '| '], - undefined, - 37 - ); + testSuggestions('FROM index1 | SORT keywordField ASC n/', [ + 'NULLS FIRST ', + 'NULLS LAST ', + ',', + '| ', + ]); // STATS argument - testSuggestions( - 'FROM index1 | STATS f', - [ - 'var0 = ', - ...getFunctionSignaturesByReturnType('stats', 'any', { scalar: true, agg: true }), - ], - undefined, - 21 - ); + testSuggestions('FROM index1 | STATS f/', [ + 'var0 = ', + ...getFunctionSignaturesByReturnType('stats', 'any', { scalar: true, agg: true }), + ]); // STATS argument BY - testSuggestions('FROM index1 | STATS AVG(booleanField) B', ['BY $0', ',', '| '], undefined, 39); + testSuggestions('FROM index1 | STATS AVG(booleanField) B/', ['BY $0', ',', '| ']); // STATS argument BY expression - testSuggestions( - 'FROM index1 | STATS field BY f', - [ - 'var0 = ', - ...getFunctionSignaturesByReturnType('stats', 'any', { grouping: true, scalar: true }), - ...getFieldNamesByType('any').map((field) => `${field} `), - ], - undefined, - 30 - ); + testSuggestions('FROM index1 | STATS field BY f/', [ + 'var0 = ', + ...getFunctionSignaturesByReturnType('stats', 'any', { grouping: true, scalar: true }), + ...getFieldNamesByType('any').map((field) => `${field} `), + ]); // WHERE argument - testSuggestions( - 'FROM index1 | WHERE f', - [ - ...getFieldNamesByType('any').map((field) => `${field} `), - ...getFunctionSignaturesByReturnType('where', 'any', { scalar: true }), - ], - undefined, - 22 - ); + testSuggestions('FROM index1 | WHERE f/', [ + ...getFieldNamesByType('any').map((field) => `${field} `), + ...getFunctionSignaturesByReturnType('where', 'any', { scalar: true }), + ]); // WHERE argument comparison testSuggestions( - 'FROM index1 | WHERE keywordField i', + 'FROM index1 | WHERE keywordField i/', getFunctionSignaturesByReturnType( 'where', 'boolean', @@ -1253,9 +1137,7 @@ describe('autocomplete', () => { }, undefined, ['and', 'or', 'not'] - ), - undefined, - 34 + ) ); }); @@ -1277,21 +1159,17 @@ describe('autocomplete', () => { // Source command testSuggestions( - 'F', - ['FROM $0', 'ROW $0', 'SHOW $0'].map(attachTriggerCommand).map(attachAsSnippet), - undefined, - 1 + 'F/', + ['FROM $0', 'ROW $0', 'SHOW $0'].map(attachTriggerCommand).map(attachAsSnippet) ); // Pipe command testSuggestions( - 'FROM a | E', + 'FROM a | E/', commandDefinitions .filter(({ name }) => !sourceCommands.includes(name)) .map(({ name }) => attachTriggerCommand(name.toUpperCase() + ' $0')) - .map(attachAsSnippet), // TODO consider making this check more fundamental - undefined, - 10 + .map(attachAsSnippet) // TODO consider making this check more fundamental ); describe('function arguments', () => { @@ -1300,10 +1178,8 @@ describe('autocomplete', () => { evalFunctionDefinitions.find(({ name }) => name === 'date_diff')?.signatures[0].params?.[0] .literalSuggestions ?? []; testSuggestions( - 'FROM a | EVAL DATE_DIFF()', - dateDiffFirstParamSuggestions.map((s) => `"${s}", `).map(attachTriggerCommand), - undefined, - 24 + 'FROM a | EVAL DATE_DIFF(/)', + dateDiffFirstParamSuggestions.map((s) => `"${s}", `).map(attachTriggerCommand) ); // field parameter @@ -1324,61 +1200,48 @@ describe('autocomplete', () => { })), ]; - testSuggestions( - 'FROM a | EVAL REPLACE()', - expectedStringSuggestionsWhenMoreArgsAreNeeded, - undefined, - 22 - ); + testSuggestions('FROM a | EVAL REPLACE(/)', expectedStringSuggestionsWhenMoreArgsAreNeeded); // subsequent parameter testSuggestions( - 'FROM a | EVAL REPLACE(keywordField, )', - expectedStringSuggestionsWhenMoreArgsAreNeeded, - undefined, - 36 + 'FROM a | EVAL REPLACE(keywordField, /)', + expectedStringSuggestionsWhenMoreArgsAreNeeded ); // final parameter — should not advance! - testSuggestions( - 'FROM a | EVAL REPLACE(keywordField, keywordField, )', - [ - ...getFieldNamesByType(ESQL_STRING_TYPES).map((field) => ({ - text: field, - command: undefined, - })), - ...getFunctionSignaturesByReturnType( - 'eval', - ESQL_STRING_TYPES, - { scalar: true }, - undefined, - ['replace'] - ), - ], - undefined, - 50 - ); + testSuggestions('FROM a | EVAL REPLACE(keywordField, keywordField, /)', [ + ...getFieldNamesByType(ESQL_STRING_TYPES).map((field) => ({ + text: field, + command: undefined, + })), + ...getFunctionSignaturesByReturnType( + 'eval', + ESQL_STRING_TYPES, + { scalar: true }, + undefined, + ['replace'] + ), + ]); // Trigger character because this is how it will actually be... the user will press // space-bar... this may change if we fix the tokenization of timespan literals // such that "2 days" is a single monaco token testSuggestions( - 'FROM a | EVAL DATE_TRUNC(2 )', + 'FROM a | EVAL DATE_TRUNC(2 /)', [...timeUnitsToSuggest.map((s) => `${s.name}, `).map(attachTriggerCommand), ','], ' ' ); }); // PIPE (|) - testSuggestions( - 'FROM a ', - [attachTriggerCommand('| '), ',', attachAsSnippet(attachTriggerCommand('METADATA $0'))], - undefined, - 7 - ); + testSuggestions('FROM a /', [ + attachTriggerCommand('| '), + ',', + attachAsSnippet(attachTriggerCommand('METADATA $0')), + ]); // Assignment - testSuggestions(`FROM a | ENRICH policy on b with `, [ + testSuggestions(`FROM a | ENRICH policy on b with /`, [ attachTriggerCommand('var0 = '), ...getPolicyFields('policy'), ]); @@ -1388,13 +1251,12 @@ describe('autocomplete', () => { // Using an Invoke trigger kind here because that's what Monaco uses when the show suggestions // action is triggered (e.g. accepting the "FROM" suggestion) testSuggestions( - 'FROM ', + 'FROM /', [ { text: 'index1 ', command: TRIGGER_SUGGESTION_COMMAND }, { text: 'index2 ', command: TRIGGER_SUGGESTION_COMMAND }, ], undefined, - 5, [ , [ @@ -1405,63 +1267,53 @@ describe('autocomplete', () => { ); // FROM source METADATA - testSuggestions( - 'FROM index1 M', - [',', attachAsSnippet(attachTriggerCommand('METADATA $0')), '| '], - undefined, - 13 - ); + testSuggestions('FROM index1 M/', [ + ',', + attachAsSnippet(attachTriggerCommand('METADATA $0')), + '| ', + ]); // LIMIT number - testSuggestions('FROM a | LIMIT ', ['10 ', '100 ', '1000 '].map(attachTriggerCommand)); + testSuggestions('FROM a | LIMIT /', ['10 ', '100 ', '1000 '].map(attachTriggerCommand)); // SORT field testSuggestions( - 'FROM a | SORT ', + 'FROM a | SORT /', [ ...getFieldNamesByType('any').map((field) => `${field} `), ...getFunctionSignaturesByReturnType('sort', 'any', { scalar: true }), - ].map(attachTriggerCommand), - undefined, - 14 + ].map(attachTriggerCommand) ); // SORT field order - testSuggestions( - 'FROM a | SORT field ', - [',', ...['ASC ', 'DESC ', '| '].map(attachTriggerCommand)], - undefined, - 20 - ); + testSuggestions('FROM a | SORT field /', [ + ',', + ...['ASC ', 'DESC ', '| '].map(attachTriggerCommand), + ]); // SORT field order nulls - testSuggestions( - 'FROM a | SORT field ASC ', - [',', ...['NULLS FIRST ', 'NULLS LAST ', '| '].map(attachTriggerCommand)], - undefined, - 24 - ); + testSuggestions('FROM a | SORT field ASC /', [ + ',', + ...['NULLS FIRST ', 'NULLS LAST ', '| '].map(attachTriggerCommand), + ]); // STATS argument testSuggestions( - 'FROM a | STATS ', + 'FROM a | STATS /', [ 'var0 = ', ...getFunctionSignaturesByReturnType('stats', 'any', { scalar: true, agg: true }).map( attachAsSnippet ), - ].map(attachTriggerCommand), - undefined, - 15 + ].map(attachTriggerCommand) ); // STATS argument BY - testSuggestions( - 'FROM a | STATS AVG(numberField) ', - [',', attachAsSnippet(attachTriggerCommand('BY $0')), attachTriggerCommand('| ')], - undefined, - 32 - ); + testSuggestions('FROM a | STATS AVG(numberField) /', [ + ',', + attachAsSnippet(attachTriggerCommand('BY $0')), + attachTriggerCommand('| '), + ]); // STATS argument BY field const allByCompatibleFunctions = getFunctionSignaturesByReturnType( @@ -1475,48 +1327,33 @@ describe('autocomplete', () => { undefined, 'by' ); - testSuggestions( - 'FROM a | STATS AVG(numberField) BY ', - [ - attachTriggerCommand('var0 = '), - ...getFieldNamesByType('any') - .map((field) => `${field} `) - .map(attachTriggerCommand), - ...allByCompatibleFunctions, - ], - undefined, - 35 - ); + testSuggestions('FROM a | STATS AVG(numberField) BY /', [ + attachTriggerCommand('var0 = '), + ...getFieldNamesByType('any') + .map((field) => `${field} `) + .map(attachTriggerCommand), + ...allByCompatibleFunctions, + ]); // STATS argument BY assignment (checking field suggestions) - testSuggestions( - 'FROM a | STATS AVG(numberField) BY var0 = ', - [ - ...getFieldNamesByType('any') - .map((field) => `${field} `) - .map(attachTriggerCommand), - ...allByCompatibleFunctions, - ], - undefined, - 41 - ); + testSuggestions('FROM a | STATS AVG(numberField) BY var0 = /', [ + ...getFieldNamesByType('any') + .map((field) => `${field} `) + .map(attachTriggerCommand), + ...allByCompatibleFunctions, + ]); // WHERE argument (field suggestions) - testSuggestions( - 'FROM a | WHERE ', - [ - ...getFieldNamesByType('any') - .map((field) => `${field} `) - .map(attachTriggerCommand), - ...getFunctionSignaturesByReturnType('where', 'any', { scalar: true }).map(attachAsSnippet), - ], - undefined, - 15 - ); + testSuggestions('FROM a | WHERE /', [ + ...getFieldNamesByType('any') + .map((field) => `${field} `) + .map(attachTriggerCommand), + ...getFunctionSignaturesByReturnType('where', 'any', { scalar: true }).map(attachAsSnippet), + ]); // WHERE argument comparison testSuggestions( - 'FROM a | WHERE keywordField ', + 'FROM a | WHERE keywordField /', getFunctionSignaturesByReturnType( 'where', 'boolean', @@ -1524,9 +1361,7 @@ describe('autocomplete', () => { builtin: true, }, ['keyword'] - ).map((s) => (s.text.toLowerCase().includes('null') ? s : attachTriggerCommand(s))), - undefined, - 28 + ).map((s) => (s.text.toLowerCase().includes('null') ? s : attachTriggerCommand(s))) ); }); }); diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts index c9d0185d5c301..f4c9ad82b80cf 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts @@ -29,7 +29,7 @@ const allFunctions = statsAggregationFunctionDefinitions .concat(evalFunctionDefinitions) .concat(groupingFunctionDefinitions); -export const TIME_SYSTEM_PARAMS = ['?start', '?end']; +export const TIME_SYSTEM_PARAMS = ['?t_start', '?t_end']; export const TRIGGER_SUGGESTION_COMMAND = { title: 'Trigger Suggestion Dialog', diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts index f97910c5c75bd..1718841711602 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts @@ -192,6 +192,7 @@ export const commandDefinitions: CommandDefinition[] = [ }, { name: 'metrics', + hidden: true, description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.metricsDoc', { defaultMessage: 'A metrics-specific source command, use this command to load data from TSDB indices. ' + diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts index 4446b4e32908d..0b9f704a43bcc 100644 --- a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts @@ -127,7 +127,7 @@ export function isComma(char: string) { } export function isSourceCommand({ label }: { label: string }) { - return ['FROM', 'ROW', 'SHOW'].includes(label); + return ['FROM', 'ROW', 'SHOW', 'METRICS'].includes(label); } let fnLookups: Map | undefined; diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.from.ts b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.from.ts index 06d23a30c441d..c24a44dadef40 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.from.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.from.ts @@ -89,7 +89,7 @@ export const validationFromCommandTestSuite = (setup: helpers.Setup) => { ]); }); - test('errors on unknown index', async () => { + test.skip('errors on unknown index', async () => { const { expectErrors } = await setup(); await expectErrors(`FROM index, missingIndex`, ['Unknown index [missingIndex]']); diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/validation.params.test.ts b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/validation.params.test.ts index d732838ed919e..3035fbfd31353 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/validation.params.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/validation.params.test.ts @@ -23,16 +23,16 @@ test('should allow param inside agg function argument', async () => { test('allow params in WHERE command expressions', async () => { const { validate } = await setup(); - const res1 = await validate('FROM index | WHERE textField >= ?start'); + const res1 = await validate('FROM index | WHERE textField >= ?t_start'); const res2 = await validate(` FROM index - | WHERE textField >= ?start + | WHERE textField >= ?t_start | WHERE textField <= ?0 | WHERE textField == ? `); const res3 = await validate(` FROM index - | WHERE textField >= ?start + | WHERE textField >= ?t_start AND textField <= ?0 AND textField == ? `); diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json index 84f16cedf03b9..7b16f753ce2cc 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json +++ b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json @@ -2248,28 +2248,28 @@ { "query": "from index | project ", "error": [ - "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where'}" + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where', MATCH}" ], "warning": [] }, { "query": "from index | project textField, doubleField, dateField", "error": [ - "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where'}" + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where', MATCH}" ], "warning": [] }, { "query": "from index | PROJECT textField, doubleField, dateField", "error": [ - "SyntaxError: mismatched input 'PROJECT' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where'}" + "SyntaxError: mismatched input 'PROJECT' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where', MATCH}" ], "warning": [] }, { "query": "from index | project missingField, doubleField, dateField", "error": [ - "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where'}" + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where', MATCH}" ], "warning": [] }, @@ -37151,48 +37151,6 @@ ], "warning": [] }, - { - "query": "FROM index, missingIndex", - "error": [ - "Unknown index [missingIndex]" - ], - "warning": [] - }, - { - "query": "from average()", - "error": [ - "Unknown index [average()]" - ], - "warning": [] - }, - { - "query": "fRom custom_function()", - "error": [ - "Unknown index [custom_function()]" - ], - "warning": [] - }, - { - "query": "FROM indexes*", - "error": [ - "Unknown index [indexes*]" - ], - "warning": [] - }, - { - "query": "from numberField", - "error": [ - "Unknown index [numberField]" - ], - "warning": [] - }, - { - "query": "FROM policy", - "error": [ - "Unknown index [policy]" - ], - "warning": [] - }, { "query": "from index metadata _id", "error": [], diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts index 5e61c2631d9e1..801f4e5e31b6a 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts @@ -530,16 +530,16 @@ describe('validation logic', () => { ]); testErrorsAndWarnings('from index | keep `any#Char$Field`', []); testErrorsAndWarnings('from index | project ', [ - "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where', MATCH}", ]); testErrorsAndWarnings('from index | project textField, doubleField, dateField', [ - "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where', MATCH}", ]); testErrorsAndWarnings('from index | PROJECT textField, doubleField, dateField', [ - "SyntaxError: mismatched input 'PROJECT' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", + "SyntaxError: mismatched input 'PROJECT' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where', MATCH}", ]); testErrorsAndWarnings('from index | project missingField, doubleField, dateField', [ - "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'lookup', 'mv_expand', 'rename', 'sort', 'stats', 'where', MATCH}", ]); testErrorsAndWarnings('from index | keep k*', []); testErrorsAndWarnings('from index | keep *Field', []); diff --git a/examples/controls_example/common/options_list/options_list_selections.ts b/packages/kbn-monaco/src/console/folding_range_provider/folding_range_provider.ts similarity index 51% rename from examples/controls_example/common/options_list/options_list_selections.ts rename to packages/kbn-monaco/src/console/folding_range_provider/folding_range_provider.ts index 1db66f3749e61..c88a02baa8fbc 100644 --- a/examples/controls_example/common/options_list/options_list_selections.ts +++ b/packages/kbn-monaco/src/console/folding_range_provider/folding_range_provider.ts @@ -6,14 +6,12 @@ * Side Public License, v 1. */ -import { DataViewField } from '@kbn/data-views-plugin/common'; +import { monaco } from '../../..'; +import { getFoldingRanges } from './folding_range_utils'; -export type OptionsListSelection = string | number; - -export const getSelectionAsFieldType = ( - field: DataViewField, - key: string -): OptionsListSelection => { - const storeAsNumber = field.type === 'number' || field.type === 'date'; - return storeAsNumber ? +key : key; +export const foldingRangeProvider: monaco.languages.FoldingRangeProvider = { + provideFoldingRanges: (model) => [ + ...getFoldingRanges(model.getLinesContent(), '{', '}'), + ...getFoldingRanges(model.getLinesContent(), '[', ']'), + ], }; diff --git a/packages/kbn-monaco/src/console/folding_range_provider/folding_range_utils.test.ts b/packages/kbn-monaco/src/console/folding_range_provider/folding_range_utils.test.ts new file mode 100644 index 0000000000000..13a17ca866898 --- /dev/null +++ b/packages/kbn-monaco/src/console/folding_range_provider/folding_range_utils.test.ts @@ -0,0 +1,57 @@ +/* + * 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 { getFoldingRanges } from './folding_range_utils'; + +describe('getFoldingRanges', () => { + // Sample test input visualization: + // 1 PUT /test/_doc/1 + // 2 { + // 3 "some_key": { + // 4 "some_inner_key": """{ + // 5 "multi_line": "json string" + // 6 }""", + // 7 "some_other_key": 123 + // 8 }, + // 9 "outer_key_2": [ + // 10 1, + // 11 2, + // 12 3 + // 13 ] + // 14 } + + const SAMPLE_INPUT = [ + 'PUT /test/_doc/1', + '{ ', + ' "some_key": { ', + ' "some_inner_key": """{', + ' "multi_line": "json string"', + ' }""",', + ' "some_other_key": 123', + ' },', + ' "outer_key_2": [', + ' 1,', + ' 2,', + ' 3', + ' ]', + '}', + ]; + + it('returns correct ranges for parentheses', () => { + const expectedRanges = [ + { start: 3, end: 7 }, + { start: 2, end: 13 }, + ]; + expect(getFoldingRanges(SAMPLE_INPUT, '{', '}')).toEqual(expectedRanges); + }); + + it('returns correct ranges for square brackets', () => { + const expectedRanges = [{ start: 9, end: 12 }]; + expect(getFoldingRanges(SAMPLE_INPUT, '[', ']')).toEqual(expectedRanges); + }); +}); diff --git a/packages/kbn-monaco/src/console/folding_range_provider/folding_range_utils.ts b/packages/kbn-monaco/src/console/folding_range_provider/folding_range_utils.ts new file mode 100644 index 0000000000000..fb4f2d5cec00c --- /dev/null +++ b/packages/kbn-monaco/src/console/folding_range_provider/folding_range_utils.ts @@ -0,0 +1,47 @@ +/* + * 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 { monaco } from '../../..'; + +const getOpeningLineRegex = (openingMarker: string) => { + // Opening parentheses can only be preceded by a colon or nothing + // This ensures that it's not between quotes + const regExStr = `^(.*:\\s*)?\\${openingMarker}$`; + return new RegExp(regExStr); +}; + +const getClosingLineRegex = (closingMarker: string) => { + // Closing marker can only be followed by a comma or nothing + // This ensures that it's not between quotes + const regExStr = `^\\${closingMarker}\\s*(,)?$`; + return new RegExp(regExStr); +}; + +export const getFoldingRanges = (lines: string[], openingMarker: string, closingMarker: string) => { + const ranges: monaco.languages.ProviderResult = []; + const stack: number[] = []; + const openingLineRegex = getOpeningLineRegex(openingMarker); + const closingLineRegex = getClosingLineRegex(closingMarker); + + for (let i = 0; i < lines.length; i++) { + const lineContent = lines[i].trim(); + if (openingLineRegex.test(lineContent)) { + stack.push(i + 1); // Line numbers start from 1 so we need to add 1 to the current index + } else if (closingLineRegex.test(lineContent)) { + const start = stack.pop(); + if (start) { + ranges.push({ + start, + end: i, + }); + } + } + } + + return ranges; +}; diff --git a/packages/kbn-monaco/src/console/folding_range_provider/index.ts b/packages/kbn-monaco/src/console/folding_range_provider/index.ts new file mode 100644 index 0000000000000..4e9429182c000 --- /dev/null +++ b/packages/kbn-monaco/src/console/folding_range_provider/index.ts @@ -0,0 +1,9 @@ +/* + * 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 { foldingRangeProvider } from './folding_range_provider'; diff --git a/packages/kbn-monaco/src/console/index.ts b/packages/kbn-monaco/src/console/index.ts index 5b4127191802d..7f408a6fb8480 100644 --- a/packages/kbn-monaco/src/console/index.ts +++ b/packages/kbn-monaco/src/console/index.ts @@ -19,6 +19,7 @@ import { consoleOutputLexerRules, consoleOutputLanguageConfiguration, } from './lexer_rules'; +import { foldingRangeProvider } from './folding_range_provider'; export { CONSOLE_LANG_ID, CONSOLE_OUTPUT_LANG_ID, CONSOLE_THEME_ID } from './constants'; @@ -28,12 +29,14 @@ export const ConsoleLang: LangModuleType = { ID: CONSOLE_LANG_ID, lexerRules, languageConfiguration, + foldingRangeProvider, }; export const ConsoleOutputLang: LangModuleType = { ID: CONSOLE_OUTPUT_LANG_ID, lexerRules: consoleOutputLexerRules, languageConfiguration: consoleOutputLanguageConfiguration, + foldingRangeProvider, }; export type { ParsedRequest } from './types'; diff --git a/packages/kbn-monaco/src/console/lexer_rules/shared.ts b/packages/kbn-monaco/src/console/lexer_rules/shared.ts index 9a877d8d131b1..04ad2a573af2c 100644 --- a/packages/kbn-monaco/src/console/lexer_rules/shared.ts +++ b/packages/kbn-monaco/src/console/lexer_rules/shared.ts @@ -15,11 +15,13 @@ export const consoleSharedLanguageConfiguration: monaco.languages.LanguageConfig brackets: [ ['{', '}'], ['[', ']'], + ['"""', '"""\n'], ], autoClosingPairs: [ { open: '{', close: '}' }, { open: '[', close: ']' }, { open: '"', close: '"' }, + { open: '"""', close: '"""' }, ], }; diff --git a/packages/kbn-monaco/src/esql/lib/esql_theme.test.ts b/packages/kbn-monaco/src/esql/lib/esql_theme.test.ts new file mode 100644 index 0000000000000..98320b3791fc2 --- /dev/null +++ b/packages/kbn-monaco/src/esql/lib/esql_theme.test.ts @@ -0,0 +1,134 @@ +/* + * 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 { ESQLErrorListener, getLexer as _getLexer } from '@kbn/esql-ast'; +import { ESQL_TOKEN_POSTFIX } from './constants'; +import { buildESQlTheme } from './esql_theme'; +import { CharStreams } from 'antlr4'; + +describe('ESQL Theme', () => { + it('should not have multiple rules for a single token', () => { + const theme = buildESQlTheme(); + + const seen = new Set(); + const duplicates: string[] = []; + for (const rule of theme.rules) { + if (seen.has(rule.token)) { + duplicates.push(rule.token); + } + seen.add(rule.token); + } + + expect(duplicates).toEqual([]); + }); + + const getLexer = () => { + const errorListener = new ESQLErrorListener(); + const inputStream = CharStreams.fromString('FROM foo'); + return _getLexer(inputStream, errorListener); + }; + + const lexer = getLexer(); + const lexicalNames = lexer.symbolicNames + .filter((name) => typeof name === 'string') + .map((name) => name!.toLowerCase()); + + it('every rule should apply to a valid lexical name', () => { + const theme = buildESQlTheme(); + + // These names aren't from the lexer... they are added on our side + // see packages/kbn-monaco/src/esql/lib/esql_token_helpers.ts + const syntheticNames = ['functions', 'nulls_order', 'timespan_literal']; + + for (const rule of theme.rules) { + expect([...lexicalNames, ...syntheticNames]).toContain( + rule.token.replace(ESQL_TOKEN_POSTFIX, '').toLowerCase() + ); + } + }); + + it('every valid lexical name should have a corresponding rule', () => { + const theme = buildESQlTheme(); + const tokenIDs = theme.rules.map((rule) => rule.token.replace(ESQL_TOKEN_POSTFIX, '')); + + const validExceptions = [ + 'unquoted_source', + 'false', // @TODO consider if this should get styling + 'true', // @TODO consider if this should get styling + 'info', // @TODO consider if this should get styling + 'colon', // @TODO consider if this should get styling + + 'nulls', // nulls is a part of nulls_order so it doesn't need its own rule + 'first', // first is a part of nulls_order so it doesn't need its own rule + 'last', // last is a part of nulls_order so it doesn't need its own rule + + 'id_pattern', // "KEEP , "... no styling needed + 'enrich_policy_name', // "ENRICH " + 'expr_ws', // whitespace, so no reason to style it + 'unknown_cmd', // unknown command, so no reason to style it + + // Lexer-mode-specific stuff + 'explain_line_comment', + 'explain_multiline_comment', + 'explain_ws', + 'project_line_comment', + 'project_multiline_comment', + 'project_ws', + 'rename_line_comment', + 'rename_multiline_comment', + 'rename_ws', + 'from_line_comment', + 'from_multiline_comment', + 'from_ws', + 'enrich_line_comment', + 'enrich_multiline_comment', + 'enrich_ws', + 'mvexpand_line_comment', + 'mvexpand_multiline_comment', + 'mvexpand_ws', + 'enrich_field_line_comment', + 'enrich_field_multiline_comment', + 'enrich_field_ws', + 'lookup_line_comment', + 'lookup_multiline_comment', + 'lookup_ws', + 'lookup_field_line_comment', + 'lookup_field_multiline_comment', + 'lookup_field_ws', + 'show_line_comment', + 'show_multiline_comment', + 'show_ws', + 'meta_line_comment', + 'meta_multiline_comment', + 'meta_ws', + 'setting', + 'setting_line_comment', + 'settting_multiline_comment', + 'setting_ws', + 'metrics_line_comment', + 'metrics_multiline_comment', + 'metrics_ws', + 'closing_metrics_line_comment', + 'closing_metrics_multiline_comment', + 'closing_metrics_ws', + 'match_operator', + ]; + + // First, check that every valid exception is actually valid + for (const name of validExceptions) { + expect(lexicalNames).toContain(name); + } + + const namesToCheck = lexicalNames.filter((name) => !validExceptions.includes(name)); + + // Now, check that every lexical name has a corresponding rule + for (const name of namesToCheck) { + expect(tokenIDs).toContain(name); + } + }); +}); diff --git a/packages/kbn-monaco/src/esql/lib/esql_theme.ts b/packages/kbn-monaco/src/esql/lib/esql_theme.ts index 12e39b4e6e7ef..89e61ca0d7b62 100644 --- a/packages/kbn-monaco/src/esql/lib/esql_theme.ts +++ b/packages/kbn-monaco/src/esql/lib/esql_theme.ts @@ -21,27 +21,15 @@ export const buildESQlTheme = (): monaco.editor.IStandaloneThemeData => ({ ...buildRuleGroup( [ 'explain', - 'row', - 'limit', 'ws', 'assign', 'comma', 'dot', - 'first', - 'last', 'opening_bracket', 'closing_bracket', 'quoted_identifier', - 'src_ws', 'unquoted_identifier', 'pipe', - 'not', - 'percent', - 'integer_literal', - 'decimal_literal', - 'src_unquoted_identifier', - 'src_quoted_identifier', - 'string', ], euiThemeVars.euiTextColor ), @@ -57,13 +45,14 @@ export const buildESQlTheme = (): monaco.editor.IStandaloneThemeData => ({ ...buildRuleGroup( [ 'metrics', + 'meta', 'metadata', + 'match', 'mv_expand', 'stats', 'inlinestats', 'dissect', 'grok', - 'project', 'keep', 'rename', 'drop', @@ -77,8 +66,8 @@ export const buildESQlTheme = (): monaco.editor.IStandaloneThemeData => ({ 'rlike', 'in', 'as', - 'expr_ws', 'limit', + 'lookup', 'null', 'enrich', 'on', @@ -113,26 +102,27 @@ export const buildESQlTheme = (): monaco.editor.IStandaloneThemeData => ({ 'asterisk', // '*' 'slash', // '/' 'percent', // '%' + 'cast_op', // '::' ], euiThemeVars.euiColorPrimaryText ), // comments ...buildRuleGroup( - [ - 'line_comment', - 'multiline_comment', - 'expr_line_comment', - 'expr_multiline_comment', - 'src_line_comment', - 'src_multiline_comment', - ], + ['line_comment', 'multiline_comment', 'expr_line_comment', 'expr_multiline_comment'], euiThemeVars.euiColorDisabledText ), // values ...buildRuleGroup( - ['quoted_string', 'integer_literal', 'decimal_literal', 'named_or_positional_param'], + [ + 'quoted_string', + 'integer_literal', + 'decimal_literal', + 'named_or_positional_param', + 'param', + 'timespan_literal', + ], euiThemeVars.euiColorSuccessText ), ], diff --git a/packages/kbn-monaco/src/esql/lib/esql_token_helpers.ts b/packages/kbn-monaco/src/esql/lib/esql_token_helpers.ts index a43360f48e9c9..e672805767535 100644 --- a/packages/kbn-monaco/src/esql/lib/esql_token_helpers.ts +++ b/packages/kbn-monaco/src/esql/lib/esql_token_helpers.ts @@ -8,6 +8,7 @@ import { monaco } from '../../monaco_imports'; import { ESQL_TOKEN_POSTFIX } from './constants'; +import { ESQLToken } from './esql_token'; function nonNullable(value: T | undefined): value is T { return value != null; @@ -33,17 +34,46 @@ export function addFunctionTokens(tokens: monaco.languages.IToken[]): monaco.lan return [...tokens]; } -export function addNullsOrder(tokens: monaco.languages.IToken[]): void { - const nullsIndex = tokens.findIndex((token) => token.scopes === 'nulls' + ESQL_TOKEN_POSTFIX); - if ( - // did we find a "nulls"? - nullsIndex > -1 && - // is the next non-whitespace token an order? - ['first' + ESQL_TOKEN_POSTFIX, 'last' + ESQL_TOKEN_POSTFIX].includes( - tokens[nullsIndex + 2]?.scopes - ) - ) { - tokens[nullsIndex].scopes = 'nulls_order' + ESQL_TOKEN_POSTFIX; - tokens.splice(nullsIndex + 1, 2); +const mergeRules = [ + [['nulls', 'expr_ws', 'first'], 'nulls_order'], + [['nulls', 'expr_ws', 'last'], 'nulls_order'], + [['integer', 'unquoted_identifier'], 'timespan_literal'], + [['integer_literal', 'expr_ws', 'unquoted_identifier'], 'timespan_literal'], +] as const; + +export function mergeTokens(tokens: ESQLToken[]): monaco.languages.IToken[] { + for (const [scopes, newScope] of mergeRules) { + let foundAnyMatches = false; + do { + foundAnyMatches = false; + for (let i = 0; i < tokens.length; i++) { + if (tokens[i].scopes === scopes[0] + ESQL_TOKEN_POSTFIX) { + // first matched so look ahead if there's room + if (i + scopes.length > tokens.length) { + continue; + } + + let match = true; + for (let j = 1; j < scopes.length; j++) { + if (tokens[i + j].scopes !== scopes[j] + ESQL_TOKEN_POSTFIX) { + match = false; + break; + } + } + + if (match) { + foundAnyMatches = true; + const mergedToken = new ESQLToken( + newScope, + tokens[i].startIndex, + tokens[i + scopes.length - 1].stopIndex + ); + tokens.splice(i, scopes.length, mergedToken); + } + } + } + } while (foundAnyMatches); } + + return tokens; } diff --git a/packages/kbn-monaco/src/esql/lib/esql_tokens_provider.test.ts b/packages/kbn-monaco/src/esql/lib/esql_tokens_provider.test.ts new file mode 100644 index 0000000000000..ba0d690aafeee --- /dev/null +++ b/packages/kbn-monaco/src/esql/lib/esql_tokens_provider.test.ts @@ -0,0 +1,70 @@ +/* + * 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 { ESQLState } from './esql_state'; +import { ESQLToken } from './esql_token'; +import { ESQLTokensProvider } from './esql_tokens_provider'; + +describe('ES|QL Tokens Provider', () => { + it('should tokenize a line', () => { + const line = 'SELECT * FROM my_index'; + const prevState = new ESQLState(); + const provider = new ESQLTokensProvider(); + const { tokens } = provider.tokenize(line, prevState); + expect(tokens.map((t) => t.scopes)).toEqual([ + 'unknown_cmd.esql', + 'expr_ws.esql', + 'asterisk.esql', + 'expr_ws.esql', + 'unquoted_identifier.esql', + 'expr_ws.esql', + 'unquoted_identifier.esql', + ]); + }); + + it('should properly tokenize functions', () => { + const line = 'FROM my_index | EVAL date_diff("day", NOW()) | STATS abs(field1), avg(field1)'; + const provider = new ESQLTokensProvider(); + const { tokens } = provider.tokenize(line, new ESQLState()); + const functionTokens = tokens.filter((t) => t.scopes === 'functions.esql'); + expect(functionTokens).toHaveLength(4); + }); + + it('should properly tokenize SORT... NULLS clauses', () => { + const line = 'SELECT * FROM my_index | SORT BY field1 ASC NULLS FIRST, field2 DESC NULLS LAST'; + const provider = new ESQLTokensProvider(); + const { tokens } = provider.tokenize(line, new ESQLState()); + // Make sure the tokens got merged properly + const nullsOrderTokens = tokens.filter((t) => t.scopes === 'nulls_order.esql'); + expect(nullsOrderTokens).toHaveLength(2); + expect(nullsOrderTokens).toEqual([ + { + scopes: 'nulls_order.esql', + startIndex: 44, + stopIndex: 54, + }, + { + scopes: 'nulls_order.esql', + startIndex: 69, + stopIndex: 78, + }, + ]); + // Ensure that the NULLS FIRST and NULLS LAST tokens are not present + expect(tokens.map((t) => t.scopes)).not.toContain('nulls.esql'); + expect(tokens.map((t) => t.scopes)).not.toContain('first.esql'); + expect(tokens.map((t) => t.scopes)).not.toContain('last.esql'); + }); + + it('should properly tokenize timespan literals', () => { + const line = 'SELECT * FROM my_index | WHERE date_field > 1 day AND other_field < 2 hours'; + const provider = new ESQLTokensProvider(); + const { tokens } = provider.tokenize(line, new ESQLState()); + const timespanTokens = tokens.filter((t) => t.scopes === 'timespan_literal.esql'); + expect(timespanTokens).toHaveLength(2); + }); +}); diff --git a/packages/kbn-monaco/src/esql/lib/esql_tokens_provider.ts b/packages/kbn-monaco/src/esql/lib/esql_tokens_provider.ts index d5cbdf4349b4c..ae4877f410eb1 100644 --- a/packages/kbn-monaco/src/esql/lib/esql_tokens_provider.ts +++ b/packages/kbn-monaco/src/esql/lib/esql_tokens_provider.ts @@ -15,7 +15,7 @@ import { ESQLLineTokens } from './esql_line_tokens'; import { ESQLState } from './esql_state'; import { ESQL_TOKEN_POSTFIX } from './constants'; -import { addFunctionTokens, addNullsOrder } from './esql_token_helpers'; +import { addFunctionTokens, mergeTokens } from './esql_token_helpers'; const EOF = -1; @@ -37,7 +37,7 @@ export class ESQLTokensProvider implements monaco.languages.TokensProvider { const lexer = getLexer(inputStream, errorListener); let done = false; - const myTokens: monaco.languages.IToken[] = []; + const myTokens: ESQLToken[] = []; do { let token: Token | null; @@ -78,7 +78,7 @@ export class ESQLTokensProvider implements monaco.languages.TokensProvider { // the previous custom Kibana grammar baked functions directly as tokens, so highlight was easier // The ES grammar doesn't have the token concept of "function" const tokensWithFunctions = addFunctionTokens(myTokens); - addNullsOrder(tokensWithFunctions); + mergeTokens(tokensWithFunctions); return new ESQLLineTokens(tokensWithFunctions, prevState.getLineNumber() + 1); } diff --git a/packages/kbn-monaco/src/helpers.ts b/packages/kbn-monaco/src/helpers.ts index 81d30b680762a..7a7f0c888aebf 100644 --- a/packages/kbn-monaco/src/helpers.ts +++ b/packages/kbn-monaco/src/helpers.ts @@ -9,7 +9,7 @@ import { monaco } from './monaco_imports'; import type { LangModuleType, CustomLangModuleType } from './types'; export function registerLanguage(language: LangModuleType | CustomLangModuleType) { - const { ID, lexerRules, languageConfiguration } = language; + const { ID, lexerRules, languageConfiguration, foldingRangeProvider } = language; monaco.languages.register({ id: ID }); @@ -22,6 +22,10 @@ export function registerLanguage(language: LangModuleType | CustomLangModuleType monaco.languages.setLanguageConfiguration(ID, languageConfiguration); } + if (foldingRangeProvider) { + monaco.languages.registerFoldingRangeProvider(ID, foldingRangeProvider); + } + if ('onLanguage' in language) { await language.onLanguage(); } diff --git a/packages/kbn-monaco/src/types.ts b/packages/kbn-monaco/src/types.ts index 5a4d3c1793031..7fb852c1ae683 100644 --- a/packages/kbn-monaco/src/types.ts +++ b/packages/kbn-monaco/src/types.ts @@ -13,6 +13,7 @@ export interface LangModuleType { ID: string; lexerRules?: monaco.languages.IMonarchLanguage; languageConfiguration?: monaco.languages.LanguageConfiguration; + foldingRangeProvider?: monaco.languages.FoldingRangeProvider; getSuggestionProvider?: Function; } diff --git a/packages/kbn-openapi-generator/docs/USAGE_GUIDE.md b/packages/kbn-openapi-generator/docs/USAGE_GUIDE.md new file mode 100644 index 0000000000000..d50b3d1395864 --- /dev/null +++ b/packages/kbn-openapi-generator/docs/USAGE_GUIDE.md @@ -0,0 +1,435 @@ +## OpenAPI Generator (`kbn-openapi-generator`) Usage Guide + +OpenAPI code generator (`kbn-openapi-generator`) could be used to generate different artifacts like runtime types, documentation, server stub implementations, clients, and much more given OpenAPI specification. Usually the first priority is to generate Zod schemas and related TypeScript types and integrate them into routes implementation and related code. The current guide focuses mainly on that topic. + +Any OpenAPI spec files should conform to [OpenAPI Specification 3.0](https://swagger.io/specification/v3/). OpenAPI Generator supports a subset of the specification. + +_For general information and getting started guide check `README` in the root of this package._ + +### How to organize files with OpenAPI specs? + +We recommend to follow rules described below. These rules were derived from hands-on experience while using OpenAPI specs and code generation in Rule Management team. + +- Prefer placing OpenAPI specs in a package (see `kbn-securitysolution-lists-common` or `kbn-securitysolution-exceptions-common` for examples). Generated artifacts can be easily imported into the other packages or plugins. Having specs in a package simplify reusing (you don't need long relative paths `../../../../my.schema.yaml`) of common OpenAPI primitives like `NonEmptyString` or `UUID` defined in `kbn-openapi-common` package. +- Split API endpoint declarations into separate files. The rule of thumb here is having one HTTP Method declaration per file. For example you want to declare two endpoints `GET /api/my/data` and `POST /api/my/data` so you need to create two OpenAPI spec files for them. +- Make sure you define `operationId` for each path item. `operationId` is a unique string used to identify the operation (a single API operation on a path like `GET` and `POST`). The id MUST be unique among all operations described in Kibana. The `operationId` value is case-sensitive. Tools and libraries use the `operationId` to uniquely identify an operation. +- Make sure OpenAPI spec file name matches defined `operationId` so it can be easily found in IDE. +- Feel free to group OpenAPI specs inside domain folder in smaller groups according to the business logic. +- Prefer reducing tight coupling by using index files to reexport artifacts from `*.gen.ts` files (see `kbn-securitysolution-lists-common` or `kbn-securitysolution-exceptions-common` for examples). + +> **Info:** By default OpenAPI code generator expects OpenAPI spec files named `.schema.yaml`. If it's absolutely necessary to use another suffix make sure OpenAPI code generator picks file up by modifying generating script where `generate()` function is invoked. + +You have quite a lot of freedom on organizing your OpenAPI specs and code generator supports any valid OpenAPI. + +#### Example + +You can find an example package's folder structure + +- kbn-solutionname-domain-name-common + - api + - business feature A + - create_entity.schema.yaml + - delete_entity.schema.yaml + ... + - business feature B + - read_configuration.schema.yaml + - update_featureB_entity.schema.yaml + ... + - scripts - openapi_generate.js + ... + +### How to enable code generation? + +By default OpenAPI code generator generation produces artifacts for `components` defined in OpenAPI specs but disabled for `paths`. `x-codegen-enabled` custom property allows to enable/disable code generation for particular path item or components. `x-codegen-enabled: true` should be always added to path items you want to enable code generation for. + +> **Warning:** When code generation for path items is enabled OpenAPI code generator produces Zod schemas and TS types for request body, request parameters and successful response. **You AREN'T required to define schemas for request body, request parameters and successful response manually.** If you don't see such artifacts most probably path items code generation is disabled. + +#### Examples + +The following example demonstrates an API endpoint declaration with enabled code generation. Notice `x-codegen-enabled: true` added to the path item to enable code generation. When it's omitted code generator will only produce artifacts for `components.schemas.ReadDeleted` schema. `common.schema.yaml` doesn't have property `x-codegen-enabled` since code generation is enabled by default for schema components. + +**read_entity.schema.yaml** + +```yaml +openapi: 3.0.0 +info: + title: Read entity + version: '2023-10-31' +paths: + /api/my/data/{id}: + get: + x-labels: [serverless, ess] + x-codegen-enabled: true + operationId: ReadEntity + summary: Reads entity + description: This a more detailed description why you should read an entity + parameters: + - name: id + in: path + required: true + description: The entity's `id` value + schema: + $ref: '../common.schema.yaml#/components/schemas/EntityId' + - name: read_deleted + in: query + required: false + description: Whether request should return deleted entity + schema: + $ref: '#/components/schemas/ReadDeleted' + responses: + 200: + description: Indicates a successful call + content: + application/json: + schema: + $ref: '../common.schema.yaml#/components/schemas/Entity' + +components: + schemas: + ReadDeleted: + type: boolean +``` + +**common.schema.yaml** + +```yaml +openapi: 3.0.0 +info: + title: Common schemas + version: 'not applicable' + +components: + schemas: + EntityId: + type: string + + Entity: + type: object + properties: + id: + $ref: '#/components/schemas/EntityId' + value: + type: string + required: [id, value] +``` + +In a case when you want to disable code generation for components add `x-codegen-enabled: false` under `components` object as in the example below + +```yaml +openapi: 3.0.0 +info: + title: Common schemas + version: 'not applicable' + +components: + x-codegen-enabled: false + schemas: + EntityId: + type: string + + Entity: + type: object + properties: + id: + $ref: '#/components/schemas/EntityId' + value: + type: string + required: [id, value] +``` + +### How to integrate generated artifacts into route's implementation? + +Having OpenAPI specs and code generation by itself doesn't guarantee OpenAPI describes API endpoints precisely. To make sure OpenAPI description and implementation match you should use generated artifacts in route's implementation for input and optionally output data validation and type checking. Let's consider the following OpenAPI spec describing `/api/my/path/{id}` API endpoint + +```yaml +openapi: 3.0.0 +info: + title: Create entity endpoint + version: '2023-10-31' + +paths: + /api/my/data/{id}: + post: + x-labels: [serverless, ess] + x-codegen-enabled: true + operationId: CreateEntity + summary: Creates entity + description: This a more detailed description why you should create an entity + parameters: + - name: id + in: path + required: false + description: This is an example optional request path parameter + schema: + $ref: '#/components/schemas/EntityId' + - name: keep_hidden + in: query + required: false + description: This is an example request query parameter + schema: + $ref: '#/components/schemas/ReadDeleted' + requestBody: + description: This is an example request query parameter + required: true + content: + application/json: + schema: + type: object + properties: + fieldA: + type: string + fieldB: + type: boolean + required: [fieldA, fieldB] + responses: + 200: + description: Indicates a successful call + content: + application/json: + schema: + $ref: '#/components/schemas/Entity' + +components: + schemas: + EntityId: + type: string + + ReadDeleted: + type: boolean + + Entity: + type: object + properties: + id: + type: string + value: + type: string + required: [id, value] +``` + +Running OpenAPI Generator on that file will produce the following `.gen.ts` file + +```ts +import { z } from 'zod'; + +export type EntityId = z.infer; +export const EntityId = z.string(); + +export type ReadDeleted = z.infer; +export const ReadDeleted = z.boolean(); + +export type Entity = z.infer; +export const Entity = z.object({ + id: z.string(), + value: z.string(), +}); + +export type CreateEntityRequestQuery = z.infer; +export const CreateEntityRequestQuery = z.object({ + /** + * This is an example request query parameter + */ + keep_hidden: ReadDeleted.optional(), +}); +export type CreateEntityRequestQueryInput = z.input; + +export type CreateEntityRequestParams = z.infer; +export const CreateEntityRequestParams = z.object({ + /** + * This is an example optional request path parameter + */ + id: EntityId.optional(), +}); +export type CreateEntityRequestParamsInput = z.input; + +export type CreateEntityRequestBody = z.infer; +export const CreateEntityRequestBody = z.object({ + fieldA: z.string(), + fieldB: z.boolean(), +}); +export type CreateEntityRequestBodyInput = z.input; + +export type CreateEntityResponse = z.infer; +export const CreateEntityResponse = Entity; +``` + +Generated artifacts above could be integrated into route's implementation in the following way + +```ts +import { + CreateEntityRequestParams, + CreateEntityRequestQuery, + CreateEntityRequestBody, + CreateEntityResponse, +} from './my/api_domain'; + +export const createEntityRoute = (router: Router): void => { + router.versioned + .post({ + access: 'public', + path: '/api/my/data/{id}', + options: { + tags: ['access:securitySolution'], + }, + }) + .addVersion( + { + version: '2023-10-31', + validate: { + request: { + params: buildRouteValidationWithZod(CreateEntityRequestParams), + query: buildRouteValidationWithZod(CreateEntityRequestQuery), + body: buildRouteValidationWithZod(CreateEntityRequestBody), + }, + }, + }, + async (context, request, response): Promise> => { + try { + // implementation goes here + const options = { + id: request.params.id, + keepHidden: request.query.keep_hidden, + }; + const result = await createEntity(request.body, options); + + // Optional output validation. + // Could just return `result` but it makes sense to validate the `result` when we can't + // control it's construction or the return type is too way complex. + return response.ok({ + body: CreateEntityResponse.parse(result), + }); + + // Another option is to construct response explicitly + // return response.ok({ + // body: { + // id: result.id, + // value: result.value, + // } + // }); + } catch (err) { + const error = transformError(err as Error); + + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); + } + } + ); +}; +``` + +### Can I use references in OpenAPI specs? + +OpenAPI Generator supports only `schema` references currently. Using references for `responses`, `parameters`, `requestBodies` and `pathItems` will lead either to errors during code generation or invalid `.gen.ts` files. + +If you strongly believe any of the unsupported references should be supported by OpenAPI Generator feel free to create an enhancement ticket in GitHub and assign it to Rule Management team. + +### Can I use circular/self-circular (recursive/self-recursive) schemas? + +Yes you can define local circular and/or self-circular schemas. Support for that functionality was added in [#186221](https://github.com/elastic/kibana/pull/186221). + +It works with exceptions + +- Only local references are supported (starting with `#/components/`) +- Discriminated unions aren't supported (a discriminated union should be assembled from object types which makes it more challenging to support them) + +If you strongly believe any of the unsupported features should be supported by OpenAPI Generator feel free to create an enhancement ticket in GitHub and assign it to Rule Management team. + +### Is there a way to specify `default` value for a referenced schema? + +Sometimes you might have an array schema defined in a spec with shared schemas like + +**common.schema.yaml** + +```yaml +openapi: 3.0.0 +info: + title: Common schemas + version: 'not applicable' +paths: {} + +components: + schemas: + ParametersArray: + type: array + items: + $ref: '#/components/schemas/Parameter' + + Parameter: + type: object + properties: + fieldA: + type: string + fieldB: + type: string +``` + +and you want to reference `ParametersArray` in for example a request body + +**spec.schema.yaml** + +```yaml +openapi: 3.0.0 +info: + title: Update parameters + version: '2023-10-31' +paths: + /api/my/data: + post: + x-labels: [serverless, ess] + x-codegen-enabled: true + operationId: UpdateParameters + summary: Updates parameters + description: This a more detailed description why you should update the parameters + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + someField: + type: string + parameters: + $ref: './common.schema.yaml#/components/schemas/ParametersArray' + required: [someField] + responses: ... +``` + +But you also want to have default value for example an empty array. In this case you can't provide any additional properties (including `default`) to the reference since OpenAPI 3.0 doesn't allow any properties next to `$ref`. + +The solution is to decompose the `ParametersArray` like below + +**spec.schema.yaml** + +```yaml +openapi: 3.0.0 +info: + title: Update parameters + version: '2023-10-31' +paths: + /api/my/data: + post: + x-labels: [serverless, ess] + x-codegen-enabled: true + operationId: UpdateParameters + summary: Updates parameters + description: This a more detailed description why you should update the parameters + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + someField: + type: string + parameters: + type: array + items: + $ref: './common.schema.yaml#/components/schemas/Parameter' + default: [] + required: [someField] + responses: ... +``` diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index 8407645aae133..84055d662a65b 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -20,7 +20,7 @@ pageLoadAssetSize: cloudSecurityPosture: 19109 console: 46091 contentManagement: 16254 - controls: 55082 + controls: 60000 core: 435325 crossClusterReplication: 65408 customIntegrations: 22034 diff --git a/packages/kbn-server-route-repository-client/README.md b/packages/kbn-server-route-repository-client/README.md new file mode 100644 index 0000000000000..59257f7c9a652 --- /dev/null +++ b/packages/kbn-server-route-repository-client/README.md @@ -0,0 +1,3 @@ +# @kbn/server-route-repository-client + +Extension of `@kbn/server-route-repository` with the browser side parts of the `@kbn/server-route-repository` package. diff --git a/packages/kbn-server-route-repository-client/index.ts b/packages/kbn-server-route-repository-client/index.ts new file mode 100644 index 0000000000000..d2572e009bd66 --- /dev/null +++ b/packages/kbn-server-route-repository-client/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 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 { createRepositoryClient } from './src/create_repository_client'; +export type { DefaultClientOptions } from '@kbn/server-route-repository-utils'; diff --git a/packages/kbn-server-route-repository-client/jest.config.js b/packages/kbn-server-route-repository-client/jest.config.js new file mode 100644 index 0000000000000..b913a23f9441a --- /dev/null +++ b/packages/kbn-server-route-repository-client/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/jest_node', + rootDir: '../..', + roots: ['/packages/kbn-server-route-repository-client'], +}; diff --git a/packages/kbn-server-route-repository-client/kibana.jsonc b/packages/kbn-server-route-repository-client/kibana.jsonc new file mode 100644 index 0000000000000..5a3974d7ab3ca --- /dev/null +++ b/packages/kbn-server-route-repository-client/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-browser", + "id": "@kbn/server-route-repository-client", + "owner": "@elastic/obs-knowledge-team" +} diff --git a/packages/kbn-server-route-repository-client/package.json b/packages/kbn-server-route-repository-client/package.json new file mode 100644 index 0000000000000..0f4289c3c86fd --- /dev/null +++ b/packages/kbn-server-route-repository-client/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/server-route-repository-client", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/kbn-server-route-repository-client/src/create_repository_client.test.ts b/packages/kbn-server-route-repository-client/src/create_repository_client.test.ts new file mode 100644 index 0000000000000..c7e12e2440fed --- /dev/null +++ b/packages/kbn-server-route-repository-client/src/create_repository_client.test.ts @@ -0,0 +1,182 @@ +/* + * 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 * as t from 'io-ts'; +import { CoreSetup } from '@kbn/core-lifecycle-browser'; +import { createRepositoryClient } from './create_repository_client'; + +describe('createRepositoryClient', () => { + const getMock = jest.fn(); + const coreSetupMock = { + http: { + get: getMock, + }, + } as unknown as CoreSetup; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('provides a default value for options when they are not required', () => { + const repository = { + 'GET /internal/handler': { + endpoint: 'GET /internal/handler', + handler: jest.fn().mockResolvedValue('OK'), + }, + }; + const { fetch } = createRepositoryClient(coreSetupMock); + + fetch('GET /internal/handler'); + + expect(getMock).toHaveBeenCalledTimes(1); + expect(getMock).toHaveBeenNthCalledWith(1, '/internal/handler', { + body: undefined, + query: undefined, + version: undefined, + }); + }); + + it('extract the version from the endpoint', () => { + const repository = { + 'GET /api/handler 2024-08-05': { + endpoint: 'GET /api/handler 2024-08-05', + handler: jest.fn().mockResolvedValue('OK'), + }, + }; + const { fetch } = createRepositoryClient(coreSetupMock); + + fetch('GET /api/handler 2024-08-05'); + + expect(getMock).toHaveBeenCalledTimes(1); + expect(getMock).toHaveBeenNthCalledWith(1, '/api/handler', { + body: undefined, + query: undefined, + version: '2024-08-05', + }); + }); + + it('passes on the provided client parameters', () => { + const repository = { + 'GET /internal/handler': { + endpoint: 'GET /internal/handler', + handler: jest.fn().mockResolvedValue('OK'), + }, + }; + const { fetch } = createRepositoryClient(coreSetupMock); + + fetch('GET /internal/handler', { + headers: { + some_header: 'header_value', + }, + }); + + expect(getMock).toHaveBeenCalledTimes(1); + expect(getMock).toHaveBeenNthCalledWith(1, '/internal/handler', { + headers: { + some_header: 'header_value', + }, + body: undefined, + query: undefined, + version: undefined, + }); + }); + + it('replaces path params before making the call', () => { + const repository = { + 'GET /internal/handler/{param}': { + endpoint: 'GET /internal/handler/{param}', + params: t.type({ + path: t.type({ + param: t.string, + }), + }), + handler: jest.fn().mockResolvedValue('OK'), + }, + }; + const { fetch } = createRepositoryClient(coreSetupMock); + + fetch('GET /internal/handler/{param}', { + params: { + path: { + param: 'param_value', + }, + }, + }); + + expect(getMock).toHaveBeenCalledTimes(1); + expect(getMock).toHaveBeenNthCalledWith(1, '/internal/handler/param_value', { + body: undefined, + query: undefined, + version: undefined, + }); + }); + + it('passes on the stringified body content when provided', () => { + const repository = { + 'GET /internal/handler': { + endpoint: 'GET /internal/handler', + params: t.type({ + body: t.type({ + payload: t.string, + }), + }), + handler: jest.fn().mockResolvedValue('OK'), + }, + }; + const { fetch } = createRepositoryClient(coreSetupMock); + + fetch('GET /internal/handler', { + params: { + body: { + payload: 'body_value', + }, + }, + }); + + expect(getMock).toHaveBeenCalledTimes(1); + expect(getMock).toHaveBeenNthCalledWith(1, '/internal/handler', { + body: JSON.stringify({ + payload: 'body_value', + }), + query: undefined, + version: undefined, + }); + }); + + it('passes on the query parameters when provided', () => { + const repository = { + 'GET /internal/handler': { + endpoint: 'GET /internal/handler', + params: t.type({ + query: t.type({ + parameter: t.string, + }), + }), + handler: jest.fn().mockResolvedValue('OK'), + }, + }; + const { fetch } = createRepositoryClient(coreSetupMock); + + fetch('GET /internal/handler', { + params: { + query: { + parameter: 'query_value', + }, + }, + }); + + expect(getMock).toHaveBeenCalledTimes(1); + expect(getMock).toHaveBeenNthCalledWith(1, '/internal/handler', { + body: undefined, + query: { + parameter: 'query_value', + }, + version: undefined, + }); + }); +}); diff --git a/packages/kbn-server-route-repository-client/src/create_repository_client.ts b/packages/kbn-server-route-repository-client/src/create_repository_client.ts new file mode 100644 index 0000000000000..ff7bc13234dba --- /dev/null +++ b/packages/kbn-server-route-repository-client/src/create_repository_client.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 type { CoreSetup, CoreStart } from '@kbn/core-lifecycle-browser'; +import { + RouteRepositoryClient, + ServerRouteRepository, + DefaultClientOptions, + formatRequest, +} from '@kbn/server-route-repository-utils'; + +export function createRepositoryClient< + TRepository extends ServerRouteRepository, + TClientOptions extends Record = DefaultClientOptions +>(core: CoreStart | CoreSetup) { + return { + fetch: (endpoint, optionsWithParams) => { + const { params, ...options } = (optionsWithParams ?? { params: {} }) as unknown as { + params?: Partial>; + }; + + const { method, pathname, version } = formatRequest(endpoint, params?.path); + + return core.http[method](pathname, { + ...options, + body: params && params.body ? JSON.stringify(params.body) : undefined, + query: params?.query, + version, + }); + }, + } as { fetch: RouteRepositoryClient }; +} diff --git a/packages/kbn-server-route-repository-client/tsconfig.json b/packages/kbn-server-route-repository-client/tsconfig.json new file mode 100644 index 0000000000000..8ef10ede60a1a --- /dev/null +++ b/packages/kbn-server-route-repository-client/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/server-route-repository-utils", + "@kbn/core-lifecycle-browser", + ] +} diff --git a/packages/kbn-server-route-repository-utils/index.ts b/packages/kbn-server-route-repository-utils/index.ts index 02ff5f70211fa..bfcc03c0e64c5 100644 --- a/packages/kbn-server-route-repository-utils/index.ts +++ b/packages/kbn-server-route-repository-utils/index.ts @@ -8,3 +8,20 @@ export { formatRequest } from './src/format_request'; export { parseEndpoint } from './src/parse_endpoint'; + +export type { + ServerRouteCreateOptions, + ServerRouteHandlerResources, + RouteParamsRT, + ServerRoute, + EndpointOf, + ReturnOf, + RouteRepositoryClient, + RouteState, + ClientRequestParamsOf, + DecodedRequestParamsOf, + ServerRouteRepository, + DefaultClientOptions, + DefaultRouteCreateOptions, + DefaultRouteHandlerResources, +} from './src/typings'; diff --git a/packages/kbn-server-route-repository/src/typings.ts b/packages/kbn-server-route-repository-utils/src/typings.ts similarity index 85% rename from packages/kbn-server-route-repository/src/typings.ts rename to packages/kbn-server-route-repository-utils/src/typings.ts index 28212f80ca5da..0539d9ea1d38e 100644 --- a/packages/kbn-server-route-repository/src/typings.ts +++ b/packages/kbn-server-route-repository-utils/src/typings.ts @@ -6,7 +6,16 @@ * Side Public License, v 1. */ -import { IKibanaResponse } from '@kbn/core-http-server'; +import type { HttpFetchOptions } from '@kbn/core-http-browser'; +import type { IKibanaResponse } from '@kbn/core-http-server'; +import type { + RequestHandlerContext, + Logger, + RouteConfigOptions, + RouteMethod, + KibanaRequest, + KibanaResponseFactory, +} from '@kbn/core/server'; import * as t from 'io-ts'; import { RequiredKeys } from 'utility-types'; @@ -137,9 +146,25 @@ type MaybeOptionalArgs> = RequiredKeys extends export type RouteRepositoryClient< TServerRouteRepository extends ServerRouteRepository, TAdditionalClientOptions extends Record -> = ( +> = >( endpoint: TEndpoint, ...args: MaybeOptionalArgs< ClientRequestParamsOf & TAdditionalClientOptions > ) => Promise>; + +export type DefaultClientOptions = HttpFetchOptions; + +interface CoreRouteHandlerResources { + request: KibanaRequest; + response: KibanaResponseFactory; + context: RequestHandlerContext; +} + +export interface DefaultRouteHandlerResources extends CoreRouteHandlerResources { + logger: Logger; +} + +export interface DefaultRouteCreateOptions { + options?: RouteConfigOptions; +} diff --git a/packages/kbn-server-route-repository-utils/tsconfig.json b/packages/kbn-server-route-repository-utils/tsconfig.json index 87f865132f4b4..0f3dd221ec6b7 100644 --- a/packages/kbn-server-route-repository-utils/tsconfig.json +++ b/packages/kbn-server-route-repository-utils/tsconfig.json @@ -15,5 +15,9 @@ "exclude": [ "target/**/*" ], - "kbn_references": [] + "kbn_references": [ + "@kbn/core-http-browser", + "@kbn/core-http-server", + "@kbn/core", + ] } diff --git a/packages/kbn-server-route-repository/README.md b/packages/kbn-server-route-repository/README.md index 6810b092403bc..f46a8f3ee3677 100644 --- a/packages/kbn-server-route-repository/README.md +++ b/packages/kbn-server-route-repository/README.md @@ -2,12 +2,346 @@ Utility functions for creating a typed server route repository, and a typed client, generating runtime validation and type validation from the same route definition. -## Usage +## Overview -TBD +There are three main functions that make up this package: +1. `createServerRouteFactory` +2. `registerRoutes` +3. `createRepositoryClient` -## Server vs. Browser entry points +`createServerRouteFactory` and `registerRoutes` are used in the server and `createRepositoryClient` in the browser (thus it is imported from `@kbn/server-route-repository-client`). -This package can only be used on the server. The browser utilities can be found in `@kbn/server-route-repository-utils`. +`createServerRouteFactory` returns a function that can be used to create routes for the repository, when calling it you can specify the resources that will be available to your route handler as well as which other options should be specified on your routes. -When adding utilities to this package, please make sure to update the entry points accordingly and the [BUILD.bazel](./BUILD.bazel)'s `target_web` target build to include all the necessary files. +Once the routes have been created and put into a plain object (the "repository"), this repository can then be passed to `registerRoutes` which also accepts the dependencies to be injected into each route handler. `registerRoutes` handles the creation of the Core HTTP router, as well as the final registration of the routes with versioning and request validation. + +By exporting the type of the repository from the server to the browser (make sure you use a `type` import), we can pass that as a generic argument to `createRepositoryClient` and get back a thin but strongly typed wrapper around the Core HTTP service, with auto completion for the available routes, type checking for the request parameters required by each specific route and response type inference. You can also add a generic type for which additional options the client should pass with each request. + +## Basic example + +In the server side, we'll start by creating the route factory, to make things easier it is recommended to keep this in its own file and export it. + +> server/create_my_plugin_server_route.ts +```javascript +import { createServerRouteFactory } from '@kbn/server-route-repository'; +import { + DefaultRouteHandlerResources, + DefaultRouteCreateOptions, +} from '@kbn/server-route-repository-utils'; + +export const createMyPluginServerRoute = createServerRouteFactory< + DefaultRouteHandlerResources, + DefaultRouteCreateOptions +>(); +``` + +The two generic arguments are optional, this example shows a "default" setup which exposes what Core HTTP would normally provide (`request`, `context`, `response`) plus a logger. + +Next, let's create a minimal route. + +> server/my_route.ts +```javascript +import { createMyPluginServerRoute } from './create_my_plugin_server_route'; + +export const myRoute = createMyPluginServerRoute({ + endpoint: 'GET /internal/my_plugin/route', + handler: async (resources) => { + const { request, context, response, logger } = resources; + return response.ok({ + body: 'Hello, my route!', + }); + }, +}); +``` + +After this we can add the route to a "repository", which is just a plain object, and call `registerRoutes`. + +> server/plugin.ts + +```javascript +import { registerRoutes } from '@kbn/server-route-repository'; + +import { myRoute } from './my_route'; + +const repository = { + ...myRoute, +}; + +export type MyPluginRouteRepository = typeof repository; + +class MyPlugin implements Plugin { + public setup(core: CoreSetup) { + registerRoutes({ + core, + logger, + repository, + dependencies: {}, + }); + } +} +``` + +Since this example doesn't use any dependencies, the generic argument for `registerRoutes` is optional and we pass an empty object. +We also export the type of the repository, we'll need this for the client which is next! + +The client can be created either in `setup` or `start`. + +> browser/plugin.ts +```javascript +import { isHttpFetchError } from '@kbn/core-http-browser'; +import { DefaultClientOptions } from '@kbn/server-route-repository-utils'; +import { createRepositoryClient } from '@kbn/server-route-repository-client'; +import type { MyPluginRouteRepository } from '../server/plugin'; + +export type MyPluginRepositoryClient = + ReturnType>; + +class MyPlugin implements Plugin { + public setup(core: CoreSetup) { + const myPluginRepositoryClient = + createRepositoryClient(core); + + myPluginRepositoryClient + .fetch('GET /internal/my_plugin/route') + .then((response) => console.log(response)) + .catch((error) => { + if (isHttpFetchError(error)) { + console.log(error.message); + } + + throw error; + }); + } +} +``` + +This example prints 'Hello, my route!' and the type of the response is **inferred** to this. + +We pass in the type of the repository that we (_type_) imported from the server. The second generic parameter for `createRepositoryClient` is optional. +We also export the type of the client itself so we can use it to type the client as we pass it around. + +When using the client's `fetch` function, the first argument is the route to call and this is auto completed to only the available routes. +The second argument is optional in this case but allows you to send in any extra options. + +The client translates the endpoint and the options (including request parameters) to the right Core HTTP request. + +## Request parameter validation + +When creating your routes, you can also provide an `io-ts` codec to be used when validating incoming requests. + +```javascript +import * as t from 'io-ts'; + +const myRoute = createMyPluginServerRoute({ + endpoint: 'GET /internal/my_plugin/route/{my_path_param}', + params: t.type({ + path: t.type({ + my_path_param: t.string, + }), + query: t.type({ + my_query_param: t.string, + }), + body: t.type({ + my_body_param: t.string, + }), + }), + handler: async (resources) => { + const { request, context, response, logger, params } = resources; + + const { path, query, body } = params; + + return response.ok({ + body: 'Hello, my route!', + }); + }, +}); +``` + +The `params` object is added to the route resources. +`path`, `query` and `body` are validated before your handler is called and the types are **inferred** inside of the handler. + +When calling this endpoint, it will look like this: +```javascript +client('GET /internal/my_plugin/route/{my_path_param}', { + params: { + path: { + my_path_param: 'some_path_value', + }, + query: { + my_query_param: 'some_query_value', + }, + body: { + my_body_param: 'some_body_value', + }, + }, +}).then(console.log); +``` + +Where the shape of `params` is typed to match the expected shape, meaning you don't need to manually use the codec when calling the route. + +## Public routes + +To define a public route, you need to change the endpoint path and add a version. + +```javascript +const myRoute = createMyPluginServerRoute({ + endpoint: 'GET /api/my_plugin/route 2024-08-02', + handler: async (resources) => { + const { request, context, response, logger } = resources; + return response.ok({ + body: 'Hello, my route!', + }); + }, +}); +``` + +`registerRoutes` takes care of setting the `access` option correctly for you and using the right versioned router. + +## Convenient return and throw + +`registerRoutes` translate any returned or thrown non-Kibana response into a Kibana response (including `Boom`). +It also handles common concerns like abort signals. + +```javascript +import { teapot } from '@hapi/boom'; + +const myRoute = createMyPluginServerRoute({ + endpoint: 'GET /internal/my_plugin/route', + handler: async (resources) => { + const { request, context, response, logger } = resources; + + const result = coinFlip(); + if (result === 'heads') { + throw teapot(); + } else { + return 'Hello, my route!'; + } + }, +}); +``` + +Both the teapot error and the plain string will be translated into a Kibana response. + +## Route dependencies + +If you want to provide additional dependencies to your route, you need to change the generic argument to `createServerRouteFactory` and `registerRoutes`. + +```javascript +import { createServerRouteFactory } from '@kbn/server-route-repository'; +import { DefaultRouteHandlerResources } from '@kbn/server-route-repository-utils'; + +export interface MyPluginRouteDependencies { + myDependency: MyDependency; +} + +export const createMyPluginServerRoute = + createServerRouteFactory(); +``` + +If you don't want your route to have access to the default resources, you could pass in only `MyPluginRouteDependencies`. + +Then we use the same type when calling `registerRoutes` + +```javascript +registerRoutes({ + core, + logger, + repository, + dependencies: { + myDependency: new MyDependency(), + }, +}); +``` + +This way, when creating a route, you will have `myDependency` available in the route resources. + +```javascript +import { createMyPluginServerRoute } from './create_my_plugin_server_route'; + +export const myRoute = createMyPluginServerRoute({ + endpoint: 'GET /internal/my_plugin/route', + handler: async (resources) => { + const { request, context, response, logger, myDependency } = resources; + return response.ok({ + body: myDependency.sayHello(), + }); + }, +}); +``` + +## Route creation options + +Core HTTP allows certain options to be passed to the route when it's being created, and you may want to include your own options as well. +To do this, override the second generic argument when calling `createServerRouteFactory`. + +```javascript +import { createServerRouteFactory } from '@kbn/server-route-repository'; +import { + DefaultRouteHandlerResources, + DefaultRouteCreateOptions, +} from '@kbn/server-route-repository-utils'; + +interface MyPluginRouteCreateOptions { + isDangerous: boolean; +} + +export const createMyPluginServerRoute = createServerRouteFactory< + DefaultRouteHandlerResources, + DefaultRouteCreateOptions & MyPluginRouteCreateOptions +>(); +``` + +If you don't want your route to have access to the options provided by Core HTTP, you could pass in only `MyPluginRouteCreateOptions`. + +You can then specify this option when creating the route. +```javascript +import { createMyPluginServerRoute } from './create_my_plugin_server_route'; + +export const myRoute = createMyPluginServerRoute({ + options: { + access: 'internal', + }, + isDangerous: true, + endpoint: 'GET /internal/my_plugin/route', + handler: async (resources) => { + const { request, context, response, logger } = resources; + return response.ok({ + body: 'Hello, my route!', + }); + }, +}); +``` + +## Client calling options + +Core HTTP allows certain options to be passed with the request, and you may want to include your own options as well. +To do this, override the second generic argument when calling `createRepositoryClient`. + +```javascript +import { DefaultClientOptions } from '@kbn/server-route-repository-utils'; +import { createRepositoryClient } from '@kbn/server-route-repository-client'; +import type { MyPluginRouteRepository } from '../server/plugin'; + +interface MyPluginClientOptions { + makeSafe: boolean; +} + +export type MyPluginRepositoryClient = + ReturnType>; + +class MyPlugin implements Plugin { + public setup(core: CoreSetup) { + const myPluginRepositoryClient = + createRepositoryClient(core); + + myPluginRepositoryClient.fetch('GET /internal/my_plugin/route', { + makeSafe: true, + headers: { + my_plugin_header: 'I am a header', + }, + }).then(console.log); + } +} +``` + +If you don't want your route to have access to the options provided by Core HTTP, you could pass in only `MyPluginClientOptions`. diff --git a/packages/kbn-server-route-repository/index.ts b/packages/kbn-server-route-repository/index.ts index ef942919f1480..e4e43523d25c3 100644 --- a/packages/kbn-server-route-repository/index.ts +++ b/packages/kbn-server-route-repository/index.ts @@ -22,4 +22,6 @@ export type { ServerRoute, RouteParamsRT, RouteState, -} from './src/typings'; + DefaultRouteCreateOptions, + DefaultRouteHandlerResources, +} from '@kbn/server-route-repository-utils'; diff --git a/packages/kbn-server-route-repository/src/create_server_route_factory.ts b/packages/kbn-server-route-repository/src/create_server_route_factory.ts index b506b5263e857..9361e1c12dbd0 100644 --- a/packages/kbn-server-route-repository/src/create_server_route_factory.ts +++ b/packages/kbn-server-route-repository/src/create_server_route_factory.ts @@ -5,16 +5,19 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ + import { - ServerRouteCreateOptions, - ServerRouteHandlerResources, RouteParamsRT, ServerRoute, -} from './typings'; + ServerRouteCreateOptions, + ServerRouteHandlerResources, + DefaultRouteHandlerResources, + DefaultRouteCreateOptions, +} from '@kbn/server-route-repository-utils'; export function createServerRouteFactory< - TRouteHandlerResources extends ServerRouteHandlerResources, - TRouteCreateOptions extends ServerRouteCreateOptions + TRouteHandlerResources extends ServerRouteHandlerResources = DefaultRouteHandlerResources, + TRouteCreateOptions extends ServerRouteCreateOptions = DefaultRouteCreateOptions >(): < TEndpoint extends string, TReturnType, diff --git a/packages/kbn-server-route-repository/src/decode_request_params.ts b/packages/kbn-server-route-repository/src/decode_request_params.ts index 0893524a3f9e9..bae6e4d4a0e12 100644 --- a/packages/kbn-server-route-repository/src/decode_request_params.ts +++ b/packages/kbn-server-route-repository/src/decode_request_params.ts @@ -7,10 +7,10 @@ */ import Boom from '@hapi/boom'; import { formatErrors, strictKeysRt } from '@kbn/io-ts-utils'; +import { RouteParamsRT } from '@kbn/server-route-repository-utils'; import { isLeft } from 'fp-ts/lib/Either'; import * as t from 'io-ts'; import { isEmpty, isPlainObject, omitBy } from 'lodash'; -import { RouteParamsRT } from './typings'; interface KibanaRequestParams { body: unknown; diff --git a/packages/kbn-server-route-repository/src/register_routes.test.ts b/packages/kbn-server-route-repository/src/register_routes.test.ts index d6599241f5f72..39180a093835a 100644 --- a/packages/kbn-server-route-repository/src/register_routes.test.ts +++ b/packages/kbn-server-route-repository/src/register_routes.test.ts @@ -88,19 +88,19 @@ describe('registerRoutes', () => { registerRoutes({ core: coreSetup, repository: { - internal: { + 'GET /internal/app/feature': { endpoint: 'GET /internal/app/feature', handler: internalHandler, params: paramsRt, options: internalOptions, }, - public: { + 'GET /api/app/feature version': { endpoint: 'GET /api/app/feature version', handler: publicHandler, params: paramsRt, options: publicOptions, }, - error: { + 'GET /internal/app/feature/error': { endpoint: 'GET /internal/app/feature/error', handler: errorHandler, params: paramsRt, @@ -124,11 +124,6 @@ describe('registerRoutes', () => { expect(internalRoute.options).toEqual(internalOptions); expect(internalRoute.validate).toEqual(routeValidationObject); - const [errorRoute] = get.mock.calls[1]; - expect(errorRoute.path).toEqual('/internal/app/feature/error'); - expect(errorRoute.options).toEqual(internalOptions); - expect(errorRoute.validate).toEqual(routeValidationObject); - expect(getWithVersion).toHaveBeenCalledTimes(1); const [publicRoute] = getWithVersion.mock.calls[0]; expect(publicRoute.path).toEqual('/api/app/feature'); diff --git a/packages/kbn-server-route-repository/src/register_routes.ts b/packages/kbn-server-route-repository/src/register_routes.ts index 4f409adda9577..fcf3c5c3281ee 100644 --- a/packages/kbn-server-route-repository/src/register_routes.ts +++ b/packages/kbn-server-route-repository/src/register_routes.ts @@ -14,10 +14,13 @@ import type { CoreSetup } from '@kbn/core-lifecycle-server'; import type { Logger } from '@kbn/logging'; import * as t from 'io-ts'; import { merge, pick } from 'lodash'; -import { parseEndpoint } from '@kbn/server-route-repository-utils'; +import { + ServerRoute, + ServerRouteCreateOptions, + parseEndpoint, +} from '@kbn/server-route-repository-utils'; import { decodeRequestParams } from './decode_request_params'; import { routeValidationObject } from './route_validation_object'; -import type { ServerRoute, ServerRouteCreateOptions } from './typings'; const CLIENT_CLOSED_REQUEST = { statusCode: 499, @@ -26,7 +29,7 @@ const CLIENT_CLOSED_REQUEST = { }, }; -export function registerRoutes({ +export function registerRoutes>({ core, repository, logger, @@ -35,7 +38,7 @@ export function registerRoutes({ core: CoreSetup; repository: Record>; logger: Logger; - dependencies: Record; + dependencies: TDependencies; }) { const routes = Object.values(repository); diff --git a/packages/kbn-server-route-repository/src/test_types.ts b/packages/kbn-server-route-repository/src/test_types.ts index a55c1014317ac..16447a6ef000f 100644 --- a/packages/kbn-server-route-repository/src/test_types.ts +++ b/packages/kbn-server-route-repository/src/test_types.ts @@ -7,9 +7,9 @@ */ import * as t from 'io-ts'; import { kibanaResponseFactory } from '@kbn/core/server'; +import { EndpointOf, ReturnOf, RouteRepositoryClient } from '@kbn/server-route-repository-utils'; import { createServerRouteFactory } from './create_server_route_factory'; import { decodeRequestParams } from './decode_request_params'; -import { EndpointOf, ReturnOf, RouteRepositoryClient } from './typings'; function assertType(value: TShape) { return value; diff --git a/packages/kbn-unified-data-table/__mocks__/table_context.ts b/packages/kbn-unified-data-table/__mocks__/table_context.ts index 9cf28f89eb810..b1364e4ce8933 100644 --- a/packages/kbn-unified-data-table/__mocks__/table_context.ts +++ b/packages/kbn-unified-data-table/__mocks__/table_context.ts @@ -14,7 +14,7 @@ import { servicesMock } from './services'; import { DataTableContext } from '../src/table_context'; import { convertValueToString } from '../src/utils/convert_value_to_string'; import { buildDataTableRecord } from '@kbn/discover-utils'; -import type { EsHitRecord } from '@kbn/discover-utils/types'; +import type { DataTableRecord, EsHitRecord } from '@kbn/discover-utils/types'; import type { UseSelectedDocsState } from '../src/hooks/use_selected_docs'; const buildTableContext = (dataView: DataView, rows: EsHitRecord[]): DataTableContext => { @@ -53,10 +53,13 @@ export function buildSelectedDocsState(selectedDocIds: string[]): UseSelectedDoc return { isDocSelected: (docId: string) => selectedDocsSet.has(docId), - getCountOfSelectedDocs: (docIds: string[]) => + getCountOfFilteredSelectedDocs: (docIds: string[]) => docIds.reduce((acc, docId) => (selectedDocsSet.has(docId) ? acc + 1 : acc), 0), + getSelectedDocsOrderedByRows: (rows: DataTableRecord[]) => + rows.filter((row) => selectedDocsSet.has(row.id)), hasSelectedDocs: selectedDocsSet.size > 0, - selectedDocIds, + selectedDocsCount: selectedDocsSet.size, + docIdsInSelectionOrder: selectedDocIds, toggleDocSelection: jest.fn(), selectAllDocs: jest.fn(), selectMoreDocs: jest.fn(), diff --git a/packages/kbn-unified-data-table/src/components/custom_toolbar/render_custom_toolbar.scss b/packages/kbn-unified-data-table/src/components/custom_toolbar/render_custom_toolbar.scss index c76df72d67a4d..fc6424e06ab62 100644 --- a/packages/kbn-unified-data-table/src/components/custom_toolbar/render_custom_toolbar.scss +++ b/packages/kbn-unified-data-table/src/components/custom_toolbar/render_custom_toolbar.scss @@ -55,11 +55,11 @@ animation: none !important; transform: none !important; } + } - .unifiedDataTableToolbarControlIconButton + & { - border-inline-start: $euiBorderThin; - border-radius: 0; - } + .unifiedDataTableToolbarControlIconButton + .unifiedDataTableToolbarControlIconButton { + border-inline-start: $euiBorderThin; + border-radius: 0; } .unifiedDataTableToolbarBottom { diff --git a/packages/kbn-unified-data-table/src/components/data_table.test.tsx b/packages/kbn-unified-data-table/src/components/data_table.test.tsx index 6366aa4445630..f5749eaee4bf0 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.test.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.test.tsx @@ -9,7 +9,6 @@ import React from 'react'; import { ReactWrapper } from 'enzyme'; import { EuiButton, - EuiCopy, EuiDataGrid, EuiDataGridCellValueElementProps, EuiDataGridCustomBodyProps, @@ -130,6 +129,23 @@ async function toggleDocSelection( } describe('UnifiedDataTable', () => { + const originalClipboard = global.window.navigator.clipboard; + + beforeAll(() => { + Object.defineProperty(navigator, 'clipboard', { + value: { + writeText: jest.fn(), + }, + writable: true, + }); + }); + + afterAll(() => { + Object.defineProperty(navigator, 'clipboard', { + value: originalClipboard, + }); + }); + afterEach(async () => { jest.clearAllMocks(); }); @@ -213,11 +229,36 @@ describe('UnifiedDataTable', () => { expect(getDisplayedDocNr(component)).toBe(5); }); - test('copying selected documents to clipboard', async () => { + test('copying selected documents to clipboard as JSON', async () => { await toggleDocSelection(component, esHitsMock[0]); findTestSubject(component, 'unifiedDataTableSelectionBtn').simulate('click'); - expect(component.find(EuiCopy).prop('textToCopy')).toMatchInlineSnapshot( - `"[{\\"_index\\":\\"i\\",\\"_id\\":\\"1\\",\\"_score\\":1,\\"_type\\":\\"_doc\\",\\"_source\\":{\\"date\\":\\"2020-20-01T12:12:12.123\\",\\"message\\":\\"test1\\",\\"bytes\\":20}}]"` + findTestSubject(component, 'dscGridCopySelectedDocumentsJSON').simulate('click'); + expect(navigator.clipboard.writeText).toHaveBeenCalledWith( + '[{"_index":"i","_id":"1","_score":1,"_type":"_doc","_source":{"date":"2020-20-01T12:12:12.123","message":"test1","bytes":20}}]' + ); + }); + + test('copying selected documents to clipboard as text', async () => { + await toggleDocSelection(component, esHitsMock[2]); + await toggleDocSelection(component, esHitsMock[1]); + findTestSubject(component, 'unifiedDataTableSelectionBtn').simulate('click'); + findTestSubject(component, 'unifiedDataTableCopyRowsAsText').simulate('click'); + expect(navigator.clipboard.writeText).toHaveBeenCalledWith( + '"\'@timestamp"\t"_index"\t"_score"\tbytes\tdate\textension\tmessage\tname\n-\ti\t1\t-\t"2020-20-01T12:12:12.124"\tjpg\t-\ttest2\n-\ti\t1\t50\t"2020-20-01T12:12:12.124"\tgif\t-\ttest3' + ); + }); + + test('copying selected columns to clipboard as text', async () => { + component = await getComponent({ + ...getProps(), + columns: ['date', 'extension', 'name'], + }); + await toggleDocSelection(component, esHitsMock[2]); + await toggleDocSelection(component, esHitsMock[1]); + findTestSubject(component, 'unifiedDataTableSelectionBtn').simulate('click'); + findTestSubject(component, 'unifiedDataTableCopyRowsAsText').simulate('click'); + expect(navigator.clipboard.writeText).toHaveBeenCalledWith( + '"\'@timestamp"\tdate\textension\tname\n-\t"2020-20-01T12:12:12.124"\tjpg\ttest2\n-\t"2020-20-01T12:12:12.124"\tgif\ttest3' ); }); }); diff --git a/packages/kbn-unified-data-table/src/components/data_table.tsx b/packages/kbn-unified-data-table/src/components/data_table.tsx index 243b86b540865..5068115fed76d 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.tsx @@ -480,7 +480,13 @@ export const UnifiedDataTable = ({ const docMap = useMemo(() => new Map(rows?.map((row) => [row.id, row]) ?? []), [rows]); const getDocById = useCallback((id: string) => docMap.get(id), [docMap]); const selectedDocsState = useSelectedDocs(docMap); - const { isDocSelected, hasSelectedDocs, selectedDocIds, replaceSelectedDocs } = selectedDocsState; + const { + isDocSelected, + hasSelectedDocs, + selectedDocsCount, + replaceSelectedDocs, + docIdsInSelectionOrder, + } = selectedDocsState; useEffect(() => { if (!hasSelectedDocs && isFilterActive) { @@ -889,13 +895,13 @@ export const UnifiedDataTable = ({ ]); const additionalControls = useMemo(() => { - if (!externalAdditionalControls && !selectedDocIds.length) { + if (!externalAdditionalControls && !selectedDocsCount) { return null; } return ( <> - {Boolean(selectedDocIds.length) && ( + {Boolean(selectedDocsCount) && ( )} {externalAdditionalControls} ); }, [ - selectedDocIds, + selectedDocsCount, selectedDocsState, externalAdditionalControls, isPlainRecord, @@ -924,6 +932,8 @@ export const UnifiedDataTable = ({ fieldFormats, unifiedDataTableContextValue.pageIndex, unifiedDataTableContextValue.pageSize, + toastNotifications, + visibleColumns, ]); const renderCustomToolbarFn: EuiDataGridProps['renderCustomToolbar'] | undefined = useMemo( @@ -1080,7 +1090,7 @@ export const UnifiedDataTable = ({ isPlainRecord={isPlainRecord} selectedFieldNames={visibleColumns} additionalFieldGroups={additionalFieldGroups} - selectedDocIds={selectedDocIds} + selectedDocIds={docIdsInSelectionOrder} schemaDetectors={schemaDetectors} forceShowAllFields={defaultColumns} showFullScreenButton={showFullScreenButton} diff --git a/packages/kbn-unified-data-table/src/components/data_table_columns.tsx b/packages/kbn-unified-data-table/src/components/data_table_columns.tsx index 4528e323c2047..f345c1093d9d1 100644 --- a/packages/kbn-unified-data-table/src/components/data_table_columns.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table_columns.tsx @@ -31,7 +31,7 @@ import { buildCopyColumnNameButton, buildCopyColumnValuesButton } from './build_ import { buildEditFieldButton } from './build_edit_field_button'; import { DataTableColumnHeader, DataTableTimeColumnHeader } from './data_table_column_header'; -const getColumnDisplayName = ( +export const getColumnDisplayName = ( columnName: string, dataViewFieldDisplayName: string | undefined, columnDisplay: string | undefined diff --git a/packages/kbn-unified-data-table/src/components/data_table_copy_rows_as_json.tsx b/packages/kbn-unified-data-table/src/components/data_table_copy_rows_as_json.tsx new file mode 100644 index 0000000000000..5e81a8e0a42ed --- /dev/null +++ b/packages/kbn-unified-data-table/src/components/data_table_copy_rows_as_json.tsx @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useContext, useState } from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { EuiContextMenuItem } from '@elastic/eui'; +import type { ToastsStart } from '@kbn/core/public'; +import { copyRowsAsJsonToClipboard } from '../utils/copy_value_to_clipboard'; +import { UnifiedDataTableContext } from '../table_context'; + +interface DataTableCopyRowsAsJsonProps { + toastNotifications: ToastsStart; + onCompleted: () => void; +} + +export const DataTableCopyRowsAsJson: React.FC = ({ + toastNotifications, + onCompleted, +}) => { + const [isProcessing, setIsProcessing] = useState(false); + const { rows, selectedDocsState, isPlainRecord } = useContext(UnifiedDataTableContext); + const { getSelectedDocsOrderedByRows } = selectedDocsState; + + return ( + { + setIsProcessing(true); + await copyRowsAsJsonToClipboard({ + // preserving the original order of rows rather than the order of selecting rows + selectedRows: getSelectedDocsOrderedByRows(rows), + toastNotifications, + }); + setIsProcessing(false); + onCompleted(); + }} + > + {isPlainRecord ? ( + + ) : ( + + )} + + ); +}; diff --git a/packages/kbn-unified-data-table/src/components/data_table_copy_rows_as_text.tsx b/packages/kbn-unified-data-table/src/components/data_table_copy_rows_as_text.tsx new file mode 100644 index 0000000000000..b0089193de82f --- /dev/null +++ b/packages/kbn-unified-data-table/src/components/data_table_copy_rows_as_text.tsx @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useContext, useState } from 'react'; +import { uniq } from 'lodash'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { EuiContextMenuItem } from '@elastic/eui'; +import type { ToastsStart } from '@kbn/core/public'; +import { calcFieldCounts } from '@kbn/discover-utils'; +import { copyRowsAsTextToClipboard } from '../utils/copy_value_to_clipboard'; +import { UnifiedDataTableContext } from '../table_context'; + +interface DataTableCopyRowsAsTextProps { + toastNotifications: ToastsStart; + columns: string[]; + onCompleted: () => void; +} + +export const DataTableCopyRowsAsText: React.FC = ({ + toastNotifications, + columns, + onCompleted, +}) => { + const [isProcessing, setIsProcessing] = useState(false); + const { valueToStringConverter, dataView, rows, selectedDocsState } = + useContext(UnifiedDataTableContext); + const { isDocSelected } = selectedDocsState; + + return ( + { + setIsProcessing(true); + + const outputColumns = columns.reduce((acc, column) => { + if (column === '_source') { + // split Document column into individual columns + const fieldCounts = calcFieldCounts(rows); + acc.push(...Object.keys(fieldCounts).sort()); + return acc; + } + acc.push(column); + return acc; + }, [] as string[]); + + await copyRowsAsTextToClipboard({ + columns: uniq(outputColumns), + // preserving the original order of rows rather than the order of selecting rows + selectedRowIndices: rows.reduce((acc, row, index) => { + if (isDocSelected(row.id)) { + acc.push(index); + } + return acc; + }, [] as number[]), + valueToStringConverter, + toastNotifications, + dataView, + }); + setIsProcessing(false); + onCompleted(); + }} + > + + + ); +}; diff --git a/packages/kbn-unified-data-table/src/components/data_table_document_selection.test.tsx b/packages/kbn-unified-data-table/src/components/data_table_document_selection.test.tsx index a1c39158f2b8d..fa2ec2f6fcbe2 100644 --- a/packages/kbn-unified-data-table/src/components/data_table_document_selection.test.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table_document_selection.test.tsx @@ -203,8 +203,18 @@ describe('document selection', () => { fieldFormats: servicesMock.fieldFormats, pageIndex: 0, pageSize: 2, + toastNotifications: servicesMock.toastNotifications, + columns: ['test'], }; - const component = mountWithIntl(); + const contextMock = { + ...dataTableContextMock, + selectedDocsState: props.selectedDocsState, + }; + const component = mountWithIntl( + + + + ); const button = findTestSubject(component, 'unifiedDataTableSelectionBtn'); expect(button.length).toBe(1); expect(button.text()).toBe('Selected2'); @@ -238,8 +248,18 @@ describe('document selection', () => { fieldFormats: servicesMock.fieldFormats, pageIndex: 0, pageSize: 2, + toastNotifications: servicesMock.toastNotifications, + columns: ['test'], + }; + const contextMock = { + ...dataTableContextMock, + selectedDocsState: props.selectedDocsState, }; - const component = mountWithIntl(); + const component = mountWithIntl( + + + + ); expect(findTestSubject(component, 'unifiedDataTableSelectionBtn').text()).toBe('Selected1'); expect(findTestSubject(component, 'dscGridSelectAllDocs').exists()).toBe(false); @@ -257,8 +277,18 @@ describe('document selection', () => { fieldFormats: servicesMock.fieldFormats, pageIndex: 0, pageSize: 2, + toastNotifications: servicesMock.toastNotifications, + columns: ['test'], }; - const component = mountWithIntl(); + const contextMock = { + ...dataTableContextMock, + selectedDocsState: props.selectedDocsState, + }; + const component = mountWithIntl( + + + + ); expect(findTestSubject(component, 'unifiedDataTableSelectionBtn').text()).toBe('Selected2'); const button = findTestSubject(component, 'dscGridSelectAllDocs'); @@ -283,8 +313,18 @@ describe('document selection', () => { fieldFormats: servicesMock.fieldFormats, pageIndex: 1, pageSize: 2, + toastNotifications: servicesMock.toastNotifications, + columns: ['test'], }; - const component = mountWithIntl(); + const contextMock = { + ...dataTableContextMock, + selectedDocsState: props.selectedDocsState, + }; + const component = mountWithIntl( + + + + ); expect(findTestSubject(component, 'unifiedDataTableSelectionBtn').text()).toBe('Selected2'); expect(findTestSubject(component, 'dscGridSelectAllDocs').exists()).toBe(true); @@ -302,8 +342,18 @@ describe('document selection', () => { fieldFormats: servicesMock.fieldFormats, pageIndex: 1, pageSize: 2, + toastNotifications: servicesMock.toastNotifications, + columns: ['test'], }; - const component = mountWithIntl(); + const contextMock = { + ...dataTableContextMock, + selectedDocsState: props.selectedDocsState, + }; + const component = mountWithIntl( + + + + ); expect(findTestSubject(component, 'unifiedDataTableSelectionBtn').text()).toBe( `Selected${dataTableContextMock.rows.length}` ); @@ -324,6 +374,8 @@ describe('document selection', () => { fieldFormats: servicesMock.fieldFormats, pageIndex: 0, pageSize: 2, + toastNotifications: servicesMock.toastNotifications, + columns: ['test'], }; const renderCompareBtn = ({ @@ -332,11 +384,18 @@ describe('document selection', () => { }: Partial[0]> = {}) => { render( - + + + ); return { diff --git a/packages/kbn-unified-data-table/src/components/data_table_document_selection.tsx b/packages/kbn-unified-data-table/src/components/data_table_document_selection.tsx index 2a34c4866cb86..7ca3c0f1f681c 100644 --- a/packages/kbn-unified-data-table/src/components/data_table_document_selection.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table_document_selection.tsx @@ -12,7 +12,6 @@ import { EuiCheckbox, EuiContextMenuItem, EuiContextMenuPanel, - EuiCopy, EuiDataGridCellValueElementProps, EuiDataGridToolbarControl, EuiPopover, @@ -25,9 +24,12 @@ import { import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; import { css } from '@emotion/react'; +import type { ToastsStart } from '@kbn/core-notifications-browser'; import type { DataTableRecord } from '@kbn/discover-utils/types'; import type { UseSelectedDocsState } from '../hooks/use_selected_docs'; import { UnifiedDataTableContext } from '../table_context'; +import { DataTableCopyRowsAsText } from './data_table_copy_rows_as_text'; +import { DataTableCopyRowsAsJson } from './data_table_copy_rows_as_json'; import { useControlColumn } from '../hooks/use_control_column'; export const SelectButton = (props: EuiDataGridCellValueElementProps) => { @@ -69,15 +71,17 @@ export const SelectButton = (props: EuiDataGridCellValueElementProps) => { export const SelectAllButton = () => { const { selectedDocsState, pageIndex, pageSize, rows } = useContext(UnifiedDataTableContext); - const { getCountOfSelectedDocs, deselectSomeDocs, selectMoreDocs } = selectedDocsState; + const { getCountOfFilteredSelectedDocs, deselectSomeDocs, selectMoreDocs } = selectedDocsState; const docIdsFromCurrentPage = useMemo(() => { return getDocIdsForCurrentPage(rows, pageIndex, pageSize); }, [rows, pageIndex, pageSize]); const countOfSelectedDocs = useMemo(() => { - return docIdsFromCurrentPage?.length ? getCountOfSelectedDocs(docIdsFromCurrentPage) : 0; - }, [docIdsFromCurrentPage, getCountOfSelectedDocs]); + return docIdsFromCurrentPage?.length + ? getCountOfFilteredSelectedDocs(docIdsFromCurrentPage) + : 0; + }, [docIdsFromCurrentPage, getCountOfFilteredSelectedDocs]); const isIndeterminateForCurrentPage = useMemo(() => { if (docIdsFromCurrentPage?.length) { @@ -147,6 +151,8 @@ export function DataTableDocumentToolbarBtn({ fieldFormats, pageIndex, pageSize, + toastNotifications, + columns, }: { isPlainRecord: boolean; isFilterActive: boolean; @@ -158,56 +164,50 @@ export function DataTableDocumentToolbarBtn({ fieldFormats: FieldFormatsStart; pageIndex: number | undefined; pageSize: number | undefined; + toastNotifications: ToastsStart; + columns: string[]; }) { const [isSelectionPopoverOpen, setIsSelectionPopoverOpen] = useState(false); - const { selectAllDocs, clearAllSelectedDocs, isDocSelected, selectedDocIds } = selectedDocsState; + const { selectAllDocs, clearAllSelectedDocs, selectedDocsCount, docIdsInSelectionOrder } = + selectedDocsState; + + const closePopover = useCallback(() => { + setIsSelectionPopoverOpen(false); + }, [setIsSelectionPopoverOpen]); const shouldSuggestToSelectAll = useMemo(() => { - const canSelectMore = selectedDocIds.length < rows.length && rows.length > 1; + const canSelectMore = selectedDocsCount < rows.length && rows.length > 1; if (typeof pageSize !== 'number' || isFilterActive || !canSelectMore) { return false; } - return selectedDocIds.length >= pageSize; - }, [rows, pageSize, selectedDocIds.length, isFilterActive]); + return selectedDocsCount >= pageSize; + }, [rows, pageSize, selectedDocsCount, isFilterActive]); const getMenuItems = useCallback(() => { return [ // Compare selected documents - ...(enableComparisonMode && selectedDocIds.length > 1 + ...(enableComparisonMode && selectedDocsCount > 1 ? [ , ] : []), - // Copy results to clipboard (JSON) - isDocSelected(row.id)).map((row) => row.raw)) - : '' - } - > - {(copy) => ( - - {isPlainRecord ? ( - - ) : ( - - )} - - )} - , + // Copy results to clipboard as text + , + // Copy results to clipboard as JSON + , isFilterActive ? ( // Show all documents { - setIsSelectionPopoverOpen(false); + closePopover(); setIsFilterActive(false); }} > @@ -238,7 +238,7 @@ export function DataTableDocumentToolbarBtn({ key="showSelectedDocuments" icon="eye" onClick={() => { - setIsSelectionPopoverOpen(false); + closePopover(); setIsFilterActive(true); }} > @@ -261,7 +261,7 @@ export function DataTableDocumentToolbarBtn({ key="clearSelection" icon="cross" onClick={() => { - setIsSelectionPopoverOpen(false); + closePopover(); clearAllSelectedDocs(); setIsFilterActive(false); }} @@ -272,13 +272,15 @@ export function DataTableDocumentToolbarBtn({ }, [ isFilterActive, isPlainRecord, - rows, setIsFilterActive, - isDocSelected, clearAllSelectedDocs, - selectedDocIds, + selectedDocsCount, + docIdsInSelectionOrder, enableComparisonMode, setIsCompareActive, + toastNotifications, + columns, + closePopover, ]); const toggleSelectionToolbar = useCallback( @@ -296,12 +298,12 @@ export function DataTableDocumentToolbarBtn({ iconSide="left" iconType="arrowDown" onClick={toggleSelectionToolbar} - data-selected-documents={selectedDocIds.length} + data-selected-documents={selectedDocsCount} data-test-subj="unifiedDataTableSelectionBtn" isSelected={isFilterActive} badgeContent={fieldFormats .getDefaultInstance(KBN_FIELD_TYPES.NUMBER, [ES_FIELD_TYPES.INTEGER]) - .convert(selectedDocIds.length)} + .convert(selectedDocsCount)} css={css` .euiButtonEmpty__content { flex-direction: row-reverse; diff --git a/packages/kbn-unified-data-table/src/hooks/use_selected_docs.test.ts b/packages/kbn-unified-data-table/src/hooks/use_selected_docs.test.ts index 9dac8b38f42a7..1d6170fea014e 100644 --- a/packages/kbn-unified-data-table/src/hooks/use_selected_docs.test.ts +++ b/packages/kbn-unified-data-table/src/hooks/use_selected_docs.test.ts @@ -20,12 +20,10 @@ describe('useSelectedDocs', () => { test('should have a correct default state', () => { const { result } = renderHook(() => useSelectedDocs(docsMap)); - expect(result.current).toEqual( - expect.objectContaining({ - selectedDocIds: [], - hasSelectedDocs: false, - }) - ); + expect(result.current.hasSelectedDocs).toBe(false); + expect(result.current.selectedDocsCount).toBe(0); + expect(result.current.getSelectedDocsOrderedByRows(docs)).toEqual([]); + expect(result.current.docIdsInSelectionOrder).toEqual([]); }); test('should toggleDocSelection correctly', () => { @@ -35,12 +33,10 @@ describe('useSelectedDocs', () => { result.current.toggleDocSelection(docs[0].id); }); - expect(result.current).toEqual( - expect.objectContaining({ - selectedDocIds: [docs[0].id], - hasSelectedDocs: true, - }) - ); + expect(result.current.hasSelectedDocs).toBe(true); + expect(result.current.selectedDocsCount).toBe(1); + expect(result.current.getSelectedDocsOrderedByRows(docs)).toEqual([docs[0]]); + expect(result.current.docIdsInSelectionOrder).toEqual([docs[0].id]); expect(result.current.isDocSelected(docs[0].id)).toBe(true); expect(result.current.isDocSelected(docs[1].id)).toBe(false); @@ -49,12 +45,10 @@ describe('useSelectedDocs', () => { result.current.toggleDocSelection(docs[1].id); }); - expect(result.current).toEqual( - expect.objectContaining({ - selectedDocIds: [docs[0].id, docs[1].id], - hasSelectedDocs: true, - }) - ); + expect(result.current.hasSelectedDocs).toBe(true); + expect(result.current.selectedDocsCount).toBe(2); + expect(result.current.getSelectedDocsOrderedByRows(docs)).toEqual([docs[0], docs[1]]); + expect(result.current.docIdsInSelectionOrder).toEqual([docs[0].id, docs[1].id]); expect(result.current.isDocSelected(docs[0].id)).toBe(true); expect(result.current.isDocSelected(docs[1].id)).toBe(true); @@ -63,12 +57,10 @@ describe('useSelectedDocs', () => { result.current.toggleDocSelection(docs[0].id); }); - expect(result.current).toEqual( - expect.objectContaining({ - selectedDocIds: [docs[1].id], - hasSelectedDocs: true, - }) - ); + expect(result.current.hasSelectedDocs).toBe(true); + expect(result.current.selectedDocsCount).toBe(1); + expect(result.current.getSelectedDocsOrderedByRows(docs)).toEqual([docs[1]]); + expect(result.current.docIdsInSelectionOrder).toEqual([docs[1].id]); expect(result.current.isDocSelected(docs[0].id)).toBe(false); expect(result.current.isDocSelected(docs[1].id)).toBe(true); @@ -77,12 +69,10 @@ describe('useSelectedDocs', () => { result.current.toggleDocSelection(docs[1].id); }); - expect(result.current).toEqual( - expect.objectContaining({ - selectedDocIds: [], - hasSelectedDocs: false, - }) - ); + expect(result.current.hasSelectedDocs).toBe(false); + expect(result.current.selectedDocsCount).toBe(0); + expect(result.current.getSelectedDocsOrderedByRows(docs)).toEqual([]); + expect(result.current.docIdsInSelectionOrder).toEqual([]); expect(result.current.isDocSelected(docs[0].id)).toBe(false); expect(result.current.isDocSelected(docs[1].id)).toBe(false); @@ -96,23 +86,19 @@ describe('useSelectedDocs', () => { result.current.toggleDocSelection(docs[1].id); }); - expect(result.current).toEqual( - expect.objectContaining({ - selectedDocIds: [docs[0].id, docs[1].id], - hasSelectedDocs: true, - }) - ); + expect(result.current.hasSelectedDocs).toBe(true); + expect(result.current.selectedDocsCount).toBe(2); + expect(result.current.getSelectedDocsOrderedByRows(docs)).toEqual([docs[0], docs[1]]); + expect(result.current.docIdsInSelectionOrder).toEqual([docs[0].id, docs[1].id]); act(() => { - result.current.replaceSelectedDocs([docs[1].id, docs[2].id]); + result.current.replaceSelectedDocs([docs[2].id, docs[1].id]); }); - expect(result.current).toEqual( - expect.objectContaining({ - selectedDocIds: [docs[1].id, docs[2].id], - hasSelectedDocs: true, - }) - ); + expect(result.current.hasSelectedDocs).toBe(true); + expect(result.current.selectedDocsCount).toBe(2); + expect(result.current.getSelectedDocsOrderedByRows(docs)).toEqual([docs[1], docs[2]]); + expect(result.current.docIdsInSelectionOrder).toEqual([docs[2].id, docs[1].id]); expect(result.current.isDocSelected(docs[0].id)).toBe(false); expect(result.current.isDocSelected(docs[1].id)).toBe(true); @@ -126,12 +112,10 @@ describe('useSelectedDocs', () => { result.current.selectAllDocs(); }); - expect(result.current).toEqual( - expect.objectContaining({ - selectedDocIds: docs.map((doc) => doc.id), - hasSelectedDocs: true, - }) - ); + expect(result.current.hasSelectedDocs).toBe(true); + expect(result.current.selectedDocsCount).toBe(docs.length); + expect(result.current.getSelectedDocsOrderedByRows(docs)).toEqual(docs); + expect(result.current.docIdsInSelectionOrder).toEqual(docs.map((doc) => doc.id)); expect(result.current.isDocSelected(docs[0].id)).toBe(true); expect(result.current.isDocSelected(docs[docs.length - 1].id)).toBe(true); @@ -145,23 +129,19 @@ describe('useSelectedDocs', () => { result.current.toggleDocSelection(docs[1].id); }); - expect(result.current).toEqual( - expect.objectContaining({ - selectedDocIds: [docs[0].id, docs[1].id], - hasSelectedDocs: true, - }) - ); + expect(result.current.hasSelectedDocs).toBe(true); + expect(result.current.selectedDocsCount).toBe(2); + expect(result.current.getSelectedDocsOrderedByRows(docs)).toEqual([docs[0], docs[1]]); + expect(result.current.docIdsInSelectionOrder).toEqual([docs[0].id, docs[1].id]); act(() => { result.current.selectMoreDocs([docs[1].id, docs[2].id]); }); - expect(result.current).toEqual( - expect.objectContaining({ - selectedDocIds: [docs[0].id, docs[1].id, docs[2].id], - hasSelectedDocs: true, - }) - ); + expect(result.current.hasSelectedDocs).toBe(true); + expect(result.current.selectedDocsCount).toBe(3); + expect(result.current.getSelectedDocsOrderedByRows(docs)).toEqual([docs[0], docs[1], docs[2]]); + expect(result.current.docIdsInSelectionOrder).toEqual([docs[0].id, docs[1].id, docs[2].id]); expect(result.current.isDocSelected(docs[0].id)).toBe(true); expect(result.current.isDocSelected(docs[1].id)).toBe(true); @@ -177,23 +157,19 @@ describe('useSelectedDocs', () => { result.current.toggleDocSelection(docs[2].id); }); - expect(result.current).toEqual( - expect.objectContaining({ - selectedDocIds: [docs[0].id, docs[1].id, docs[2].id], - hasSelectedDocs: true, - }) - ); + expect(result.current.hasSelectedDocs).toBe(true); + expect(result.current.selectedDocsCount).toBe(3); + expect(result.current.getSelectedDocsOrderedByRows(docs)).toEqual([docs[0], docs[1], docs[2]]); + expect(result.current.docIdsInSelectionOrder).toEqual([docs[0].id, docs[1].id, docs[2].id]); act(() => { result.current.deselectSomeDocs([docs[0].id, docs[2].id]); }); - expect(result.current).toEqual( - expect.objectContaining({ - selectedDocIds: [docs[1].id], - hasSelectedDocs: true, - }) - ); + expect(result.current.hasSelectedDocs).toBe(true); + expect(result.current.selectedDocsCount).toBe(1); + expect(result.current.getSelectedDocsOrderedByRows(docs)).toEqual([docs[1]]); + expect(result.current.docIdsInSelectionOrder).toEqual([docs[1].id]); expect(result.current.isDocSelected(docs[0].id)).toBe(false); expect(result.current.isDocSelected(docs[1].id)).toBe(true); @@ -208,29 +184,25 @@ describe('useSelectedDocs', () => { result.current.toggleDocSelection(docs[1].id); }); - expect(result.current).toEqual( - expect.objectContaining({ - selectedDocIds: [docs[0].id, docs[1].id], - hasSelectedDocs: true, - }) - ); + expect(result.current.hasSelectedDocs).toBe(true); + expect(result.current.selectedDocsCount).toBe(2); + expect(result.current.getSelectedDocsOrderedByRows(docs)).toEqual([docs[0], docs[1]]); + expect(result.current.docIdsInSelectionOrder).toEqual([docs[0].id, docs[1].id]); act(() => { result.current.clearAllSelectedDocs(); }); - expect(result.current).toEqual( - expect.objectContaining({ - selectedDocIds: [], - hasSelectedDocs: false, - }) - ); + expect(result.current.hasSelectedDocs).toBe(false); + expect(result.current.selectedDocsCount).toBe(0); + expect(result.current.getSelectedDocsOrderedByRows(docs)).toEqual([]); + expect(result.current.docIdsInSelectionOrder).toEqual([]); expect(result.current.isDocSelected(docs[0].id)).toBe(false); expect(result.current.isDocSelected(docs[1].id)).toBe(false); }); - test('should getCountOfSelectedDocs correctly', () => { + test('should getCountOfFilteredSelectedDocs correctly', () => { const { result } = renderHook(() => useSelectedDocs(docsMap)); act(() => { @@ -238,16 +210,16 @@ describe('useSelectedDocs', () => { result.current.toggleDocSelection(docs[1].id); }); - expect(result.current.getCountOfSelectedDocs([docs[0].id, docs[1].id])).toBe(2); - expect(result.current.getCountOfSelectedDocs([docs[2].id, docs[3].id])).toBe(0); + expect(result.current.getCountOfFilteredSelectedDocs([docs[0].id, docs[1].id])).toBe(2); + expect(result.current.getCountOfFilteredSelectedDocs([docs[2].id, docs[3].id])).toBe(0); act(() => { result.current.toggleDocSelection(docs[0].id); }); - expect(result.current.getCountOfSelectedDocs([docs[0].id, docs[1].id])).toBe(1); - expect(result.current.getCountOfSelectedDocs([docs[1].id])).toBe(1); - expect(result.current.getCountOfSelectedDocs([docs[0].id])).toBe(0); - expect(result.current.getCountOfSelectedDocs([docs[2].id, docs[3].id])).toBe(0); + expect(result.current.getCountOfFilteredSelectedDocs([docs[0].id, docs[1].id])).toBe(1); + expect(result.current.getCountOfFilteredSelectedDocs([docs[1].id])).toBe(1); + expect(result.current.getCountOfFilteredSelectedDocs([docs[0].id])).toBe(0); + expect(result.current.getCountOfFilteredSelectedDocs([docs[2].id, docs[3].id])).toBe(0); }); }); diff --git a/packages/kbn-unified-data-table/src/hooks/use_selected_docs.ts b/packages/kbn-unified-data-table/src/hooks/use_selected_docs.ts index c61238bd3f778..c70e74f1abdaa 100644 --- a/packages/kbn-unified-data-table/src/hooks/use_selected_docs.ts +++ b/packages/kbn-unified-data-table/src/hooks/use_selected_docs.ts @@ -11,15 +11,17 @@ import type { DataTableRecord } from '@kbn/discover-utils'; export interface UseSelectedDocsState { isDocSelected: (docId: string) => boolean; - getCountOfSelectedDocs: (docIds: string[]) => number; + getCountOfFilteredSelectedDocs: (docIds: string[]) => number; hasSelectedDocs: boolean; - selectedDocIds: string[]; + selectedDocsCount: number; + docIdsInSelectionOrder: string[]; toggleDocSelection: (docId: string) => void; selectAllDocs: () => void; selectMoreDocs: (docIds: string[]) => void; deselectSomeDocs: (docIds: string[]) => void; replaceSelectedDocs: (docIds: string[]) => void; clearAllSelectedDocs: () => void; + getSelectedDocsOrderedByRows: (rows: DataTableRecord[]) => DataTableRecord[]; } export const useSelectedDocs = (docMap: Map): UseSelectedDocsState => { @@ -70,43 +72,53 @@ export const useSelectedDocs = (docMap: Map): UseSelect [selectedDocsSet, docMap] ); - const usedSelectedDocsCount = selectedDocIds.length; + const getSelectedDocsOrderedByRows = useCallback( + (rows: DataTableRecord[]) => { + return rows.filter((row) => isDocSelected(row.id)); + }, + [isDocSelected] + ); - const getCountOfSelectedDocs = useCallback( + const selectedDocsCount = selectedDocIds.length; + + const getCountOfFilteredSelectedDocs = useCallback( (docIds) => { - if (!usedSelectedDocsCount) { + if (!selectedDocsCount) { return 0; } return docIds.filter(isDocSelected).length; }, - [usedSelectedDocsCount, isDocSelected] + [selectedDocsCount, isDocSelected] ); return useMemo( () => ({ isDocSelected, - hasSelectedDocs: usedSelectedDocsCount > 0, - getCountOfSelectedDocs, - selectedDocIds, + hasSelectedDocs: selectedDocsCount > 0, + selectedDocsCount, + docIdsInSelectionOrder: selectedDocIds, + getCountOfFilteredSelectedDocs, toggleDocSelection, selectAllDocs, selectMoreDocs, deselectSomeDocs, replaceSelectedDocs, clearAllSelectedDocs, + getSelectedDocsOrderedByRows, }), [ isDocSelected, - getCountOfSelectedDocs, + getCountOfFilteredSelectedDocs, toggleDocSelection, selectAllDocs, selectMoreDocs, deselectSomeDocs, replaceSelectedDocs, clearAllSelectedDocs, - usedSelectedDocsCount, selectedDocIds, + selectedDocsCount, + getSelectedDocsOrderedByRows, ] ); }; diff --git a/packages/kbn-unified-data-table/src/utils/copy_value_to_clipboard.test.tsx b/packages/kbn-unified-data-table/src/utils/copy_value_to_clipboard.test.tsx index f49a7ef95ed6d..fdb68618fab49 100644 --- a/packages/kbn-unified-data-table/src/utils/copy_value_to_clipboard.test.tsx +++ b/packages/kbn-unified-data-table/src/utils/copy_value_to_clipboard.test.tsx @@ -12,6 +12,8 @@ import { copyValueToClipboard, copyColumnNameToClipboard, copyColumnValuesToClipboard, + copyRowsAsTextToClipboard, + copyRowsAsJsonToClipboard, } from './copy_value_to_clipboard'; import { convertValueToString } from './convert_value_to_string'; import type { ValueToStringConverter } from '../types'; @@ -151,4 +153,59 @@ describe('copyValueToClipboard', () => { text: 'Values may contain formulas that are escaped.', }); }); + + it('should copy rows to clipboard as text', async () => { + execCommandMock.mockImplementationOnce(() => true); + + const result = await copyRowsAsTextToClipboard({ + toastNotifications: servicesMock.toastNotifications, + columns: ['bool_enabled', 'keyword_key'], + dataView: dataTableContextComplexMock.dataView, + selectedRowIndices: [0], + valueToStringConverter, + }); + + const output = '"bool_enabled"\t"keyword_key"\nfalse\tabcd1'; + expect(result).toBe(output); + expect(global.window.navigator.clipboard.writeText).toHaveBeenCalledWith(output); + expect(servicesMock.toastNotifications.addInfo).toHaveBeenCalledWith({ + title: 'Copied to clipboard', + }); + }); + + it('should copy rows to clipboard as text with a warning', async () => { + execCommandMock.mockImplementationOnce(() => true); + + const result = await copyRowsAsTextToClipboard({ + toastNotifications: servicesMock.toastNotifications, + columns: ['bool_enabled', 'scripted_string'], + dataView: dataTableContextComplexMock.dataView, + selectedRowIndices: [0, 1], + valueToStringConverter, + }); + + const output = '"bool_enabled"\t"scripted_string"\nfalse\t"hi there"\ntrue\t"\'=1+2"";=1+2"'; + expect(result).toBe(output); + expect(servicesMock.toastNotifications.addWarning).toHaveBeenCalledWith({ + title: 'Copied to clipboard', + text: 'Values may contain formulas that are escaped.', + }); + }); + + it('should copy rows to clipboard as JSON', async () => { + execCommandMock.mockImplementationOnce(() => true); + + const result = await copyRowsAsJsonToClipboard({ + toastNotifications: servicesMock.toastNotifications, + selectedRows: [dataTableContextComplexMock.rows[0]], + }); + + const output = + '[{"_index":"sample","_id":"1","_version":2,"_score":null,"fields":{"date":["2022-05-22T12:10:30.000Z"],"array_objects.description.keyword":["programming list","cool stuff list"],"rank_features":[{"2star":100,"1star":10}],"array_tags":["elasticsearch","wow"],"array_objects.name.keyword":["prog_list","cool_list"],"flattened_labels":[{"release":["v1.2.5","v1.3.0"],"priority":"urgent"}],"geo_point":[{"coordinates":[-71.34,41.12],"type":"Point"}],"binary_blob":["U29tZSBiaW5hcnkgYmxvYg=="],"text_message":["Hi there! I am a sample string."],"object_user.first":["John"],"keyword_key":["abcd1"],"array_objects.name":["prog_list","cool_list"],"vector":[0.5,10,6],"nested_user":[{"last":["Smith"],"last.keyword":["Smith"],"first":["John"],"first.keyword":["John"]},{"last":["White"],"last.keyword":["White"],"first":["Alice"],"first.keyword":["Alice"]}],"number_amount":[50],"array_tags.keyword":["elasticsearch","wow"],"bool_enabled":[false],"version":["1.2.3"],"histogram":[{"counts":[3,7,23,12,6],"values":[0.1,0.2,0.3,0.4,0.5]}],"array_objects.description":["programming list","cool stuff list"],"range_time_frame":[{"gte":"2015-10-31 12:00:00","lte":"2015-11-01 00:00:00"}],"number_price":[10.99],"object_user.last":["Smith"],"geometry":[{"coordinates":[[[1000,-1001],[1001,-1001],[1001,-1000],[1000,-1000],[1000,-1001]]],"type":"Polygon"}],"date_nanos":["2022-01-01T12:10:30.123456789Z"],"ip_addr":["192.168.1.1"],"runtime_number":[5.5],"scripted_string":["hi there"]},"sort":[1653221430000]}]'; + expect(result).toBe(output); + expect(global.window.navigator.clipboard.writeText).toHaveBeenCalledWith(output); + expect(servicesMock.toastNotifications.addInfo).toHaveBeenCalledWith({ + title: 'Copied to clipboard', + }); + }); }); diff --git a/packages/kbn-unified-data-table/src/utils/copy_value_to_clipboard.ts b/packages/kbn-unified-data-table/src/utils/copy_value_to_clipboard.ts index 2fc0606624a0b..6097454d2b01a 100644 --- a/packages/kbn-unified-data-table/src/utils/copy_value_to_clipboard.ts +++ b/packages/kbn-unified-data-table/src/utils/copy_value_to_clipboard.ts @@ -8,9 +8,12 @@ import { copyToClipboard } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { ToastsStart } from '@kbn/core/public'; +import type { ToastsStart } from '@kbn/core/public'; +import type { DataTableRecord } from '@kbn/discover-utils'; +import type { DataView } from '@kbn/data-views-plugin/common'; import type { ValueToStringConverter } from '../types'; import { convertNameToString } from './convert_value_to_string'; +import { getColumnDisplayName } from '../components/data_table_columns'; const WARNING_FOR_FORMULAS = i18n.translate( 'unifiedDataTable.copyEscapedValueWithFormulasToClipboardWarningText', @@ -151,3 +154,118 @@ export const copyColumnNameToClipboard = ({ return columnDisplayName; }; + +export const copyRowsAsTextToClipboard = async ({ + columns, + dataView, + selectedRowIndices, + toastNotifications, + valueToStringConverter, +}: { + columns: string[]; + dataView: DataView; + selectedRowIndices: number[]; + toastNotifications: ToastsStart; + valueToStringConverter: ValueToStringConverter; +}): Promise => { + const columnSeparator = '\t'; + const rowSeparator = '\n'; + let withFormula = false; + let textToCopy = ''; + + textToCopy += + columns + .map((columnId) => { + const columnDisplayName = getColumnDisplayName( + columnId, + dataView.getFieldByName(columnId)?.displayName, + undefined + ); + const nameFormattedResult = convertNameToString(columnDisplayName); + withFormula = withFormula || nameFormattedResult.withFormula; + return nameFormattedResult.formattedString; + }) + .join(columnSeparator) + rowSeparator; + + selectedRowIndices.forEach((rowIndex, index) => { + textToCopy += + columns + .map((columnId) => { + const result = valueToStringConverter(rowIndex, columnId, { compatibleWithCSV: true }); + withFormula = withFormula || result.withFormula; + return result.formattedString || '-'; + }) + .join(columnSeparator) + (index !== selectedRowIndices.length - 1 ? rowSeparator : ''); + }); + + let copied; + try { + // try to copy without browser styles + await window.navigator?.clipboard?.writeText(textToCopy); + copied = true; + } catch (error) { + copied = copyToClipboard(textToCopy); + } + + if (!copied) { + toastNotifications.addWarning({ + title: COPY_FAILED_ERROR_MESSAGE, + }); + + return null; + } + + const toastTitle = i18n.translate('unifiedDataTable.copyRowsAsTextToClipboard.toastTitle', { + defaultMessage: 'Copied to clipboard', + }); + + if (withFormula) { + toastNotifications.addWarning({ + title: toastTitle, + text: WARNING_FOR_FORMULAS, + }); + } else { + toastNotifications.addInfo({ + title: toastTitle, + }); + } + + return textToCopy; +}; + +export const copyRowsAsJsonToClipboard = async ({ + selectedRows, + toastNotifications, +}: { + selectedRows: DataTableRecord[]; + toastNotifications: ToastsStart; +}): Promise => { + const textToCopy = selectedRows ? JSON.stringify(selectedRows.map((row) => row.raw)) : ''; + + let copied; + try { + // try to copy without browser styles + await window.navigator?.clipboard?.writeText(textToCopy); + copied = true; + } catch (error) { + copied = copyToClipboard(textToCopy); + } + + if (!copied) { + toastNotifications.addWarning({ + title: COPY_FAILED_ERROR_MESSAGE, + }); + + return null; + } + + const toastTitle = i18n.translate('unifiedDataTable.copyRowsAsJsonToClipboard.toastTitle', { + defaultMessage: 'Copied to clipboard', + }); + + toastNotifications.addInfo({ + title: toastTitle, + }); + + return textToCopy; +}; diff --git a/packages/kbn-unified-data-table/tsconfig.json b/packages/kbn-unified-data-table/tsconfig.json index d0a844b3d49e7..0f55e72d44e0a 100644 --- a/packages/kbn-unified-data-table/tsconfig.json +++ b/packages/kbn-unified-data-table/tsconfig.json @@ -37,5 +37,6 @@ "@kbn/react-field", "@kbn/shared-ux-utility", "@kbn/unified-field-list", + "@kbn/core-notifications-browser", ] } diff --git a/renovate.json b/renovate.json index bc94410bdea46..ea42bff6cdd2c 100644 --- a/renovate.json +++ b/renovate.json @@ -1,8 +1,8 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:recommended"], + "extends": ["config:recommended", "helpers:pinGitHubActionDigests"], "ignorePaths": ["**/__fixtures__/**", "**/fixtures/**"], - "enabledManagers": ["npm"], + "enabledManagers": ["npm", "github-actions"], "baseBranches": ["main", "7.17"], "prConcurrentLimit": 0, "prHourlyLimit": 0, @@ -20,6 +20,20 @@ "matchDepPatterns": [".*"], "enabled": false }, + { + "matchPackageNames": [ + "docker.elastic.co/wolfi/chainguard-base" + ], + "enabled": true + }, + { + "groupName": "GitHub actions", + "matchManagers": ["github-actions"], + "reviewers": ["team:kibana-operations"], + "matchBaseBranches": ["main"], + "labels": ["Team:Operations", "backport:all-open", "release_note:skip"], + "enabled": true + }, { "groupName": "@elastic/charts", "matchDepNames": ["@elastic/charts"], @@ -117,6 +131,15 @@ "minimumReleaseAge": "7 days", "enabled": true }, + { + "groupName": "eslint-plugin-depend", + "matchDepPatterns": ["eslint-plugin-depend"], + "reviewers": ["team:kibana-operations"], + "matchBaseBranches": ["main"], + "labels": ["Team:Operations", "release_note:skip"], + "minimumReleaseAge": "7 days", + "enabled": true + }, { "groupName": "polyfills", "matchDepNames": ["core-js"], @@ -426,5 +449,18 @@ "labels": ["release_note:skip", "backport:all-open", "Team:Visualizations"], "enabled": true } + ], + "customManagers": [ + { + "description": "Update Wolfi base image", + "customType": "regex", + "fileMatch": [ + "^src/dev/build/tasks/os_packages/docker_generator/run\\.ts$" + ], + "matchStrings": [ + "(?docker\\.elastic\\.co/wolfi/chainguard-base):(?[-a-zA-Z0-9.]+)?(?:@(?sha256:[a-fA-F0-9]+))?" + ], + "datasourceTemplate": "docker" + } ] } diff --git a/src/core/server/integration_tests/elasticsearch/version_compatibility.test.ts b/src/core/server/integration_tests/elasticsearch/version_compatibility.test.ts index bfd7575d58283..eb6cc767d5817 100644 --- a/src/core/server/integration_tests/elasticsearch/version_compatibility.test.ts +++ b/src/core/server/integration_tests/elasticsearch/version_compatibility.test.ts @@ -91,8 +91,7 @@ describe('Version Compatibility', () => { await expect(startServers({ customKibanaVersion: previousMinor() })).resolves.toBeUndefined(); }); - // FLAKY: https://github.com/elastic/kibana/issues/171289 - it.skip('should flag the incompatibility on version mismatch (ES is previous minor)', async () => { + it('should flag the incompatibility on version mismatch (ES is previous minor)', async () => { const found$ = new Subject(); consoleSpy.mockImplementation((str) => { if (str.includes('is incompatible')) { diff --git a/src/dev/build/tasks/os_packages/docker_generator/run.ts b/src/dev/build/tasks/os_packages/docker_generator/run.ts index a772650586c7b..24b5a8c950b61 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/run.ts +++ b/src/dev/build/tasks/os_packages/docker_generator/run.ts @@ -42,9 +42,15 @@ export async function runDockerGenerator( let baseImageName = ''; if (flags.baseImage === 'ubuntu') baseImageName = 'ubuntu:20.04'; if (flags.baseImage === 'ubi') baseImageName = 'docker.elastic.co/ubi9/ubi-minimal:latest'; + /** + * Renovate config contains a regex manager to automatically updates this Chainguard reference + * + * If this logic moves to another file or under another name, then the Renovate regex manager + * for automatic Chainguard updates will break. + */ if (flags.baseImage === 'wolfi') baseImageName = - 'docker.elastic.co/wolfi/chainguard-base:latest@sha256:19764e89441be1f36544f715a738abc1a1898f35ed729486d33172eb54e8d84a'; + 'docker.elastic.co/wolfi/chainguard-base:latest@sha256:082266206be6e559baea1c8b2eeb4fb86ea1318a0cf99cbf0e612dd2c611e80b'; let imageFlavor = ''; if (flags.baseImage === 'ubi') imageFlavor += `-ubi`; diff --git a/src/plugins/controls/public/control_group/actions/edit_control_action.test.tsx b/src/plugins/controls/public/control_group/actions/edit_control_action.test.tsx index a496e8671f6d6..22313f8600b0a 100644 --- a/src/plugins/controls/public/control_group/actions/edit_control_action.test.tsx +++ b/src/plugins/controls/public/control_group/actions/edit_control_action.test.tsx @@ -12,7 +12,7 @@ import { OPTIONS_LIST_CONTROL } from '../../../common'; import { ControlOutput } from '../../types'; import { ControlGroupInput } from '../types'; import { pluginServices } from '../../services'; -import { EditControlAction } from './edit_control_action'; +import { EditLegacyEmbeddableControlAction } from './edit_control_action'; import { DeleteControlAction } from './delete_control_action'; import { TimeSliderEmbeddableFactory } from '../../time_slider'; import { OptionsListEmbeddableFactory, OptionsListEmbeddableInput } from '../../options_list'; @@ -24,7 +24,7 @@ const controlGroupInput = { chainingSystem: 'NONE', panels: {} } as ControlGroup const deleteControlAction = new DeleteControlAction(); test('Action is incompatible with Error Embeddables', async () => { - const editControlAction = new EditControlAction(deleteControlAction); + const editControlAction = new EditLegacyEmbeddableControlAction(deleteControlAction); const errorEmbeddable = new ErrorEmbeddable('Wow what an awful error', { id: ' 404' }); expect(await editControlAction.isCompatible({ embeddable: errorEmbeddable as any })).toBe(false); }); @@ -35,7 +35,7 @@ test('Action is incompatible with embeddables that are not editable', async () = pluginServices.getServices().controls.getControlFactory = mockGetFactory; pluginServices.getServices().embeddable.getEmbeddableFactory = mockGetFactory; - const editControlAction = new EditControlAction(deleteControlAction); + const editControlAction = new EditLegacyEmbeddableControlAction(deleteControlAction); const emptyContainer = new ControlGroupContainer(mockedReduxEmbeddablePackage, controlGroupInput); await emptyContainer.untilInitialized(); await emptyContainer.addTimeSliderControl(); @@ -53,7 +53,7 @@ test('Action is compatible with embeddables that are editable', async () => { pluginServices.getServices().controls.getControlFactory = mockGetFactory; pluginServices.getServices().embeddable.getEmbeddableFactory = mockGetFactory; - const editControlAction = new EditControlAction(deleteControlAction); + const editControlAction = new EditLegacyEmbeddableControlAction(deleteControlAction); const emptyContainer = new ControlGroupContainer(mockedReduxEmbeddablePackage, controlGroupInput); await emptyContainer.untilInitialized(); const control = await emptyContainer.addOptionsListControl({ @@ -73,7 +73,7 @@ test('Action is compatible with embeddables that are editable', async () => { }); test('Execute throws an error when called with an embeddable not in a parent', async () => { - const editControlAction = new EditControlAction(deleteControlAction); + const editControlAction = new EditLegacyEmbeddableControlAction(deleteControlAction); const optionsListEmbeddable = new OptionsListEmbeddable( mockedReduxEmbeddablePackage, {} as OptionsListEmbeddableInput, @@ -99,7 +99,7 @@ test('Execute should open a flyout', async () => { })) as OptionsListEmbeddable; expect(emptyContainer.getInput().panels[control.getInput().id].type).toBe(OPTIONS_LIST_CONTROL); - const editControlAction = new EditControlAction(deleteControlAction); + const editControlAction = new EditLegacyEmbeddableControlAction(deleteControlAction); await editControlAction.execute({ embeddable: control }); expect(spyOn).toHaveBeenCalled(); }); diff --git a/src/plugins/controls/public/control_group/actions/edit_control_action.tsx b/src/plugins/controls/public/control_group/actions/edit_control_action.tsx index 8f457925eb99c..0227f53a7ec97 100644 --- a/src/plugins/controls/public/control_group/actions/edit_control_action.tsx +++ b/src/plugins/controls/public/control_group/actions/edit_control_action.tsx @@ -26,7 +26,7 @@ export interface EditControlActionContext { embeddable: ControlEmbeddable; } -export class EditControlAction implements Action { +export class EditLegacyEmbeddableControlAction implements Action { public readonly type = ACTION_EDIT_CONTROL; public readonly id = ACTION_EDIT_CONTROL; public order = 2; diff --git a/src/plugins/controls/public/control_group/actions/index.ts b/src/plugins/controls/public/control_group/actions/index.ts index 91a3f2a431572..046ddbd2597c1 100644 --- a/src/plugins/controls/public/control_group/actions/index.ts +++ b/src/plugins/controls/public/control_group/actions/index.ts @@ -6,6 +6,6 @@ * Side Public License, v 1. */ -export const ACTION_EDIT_CONTROL = 'editControl'; +export const ACTION_EDIT_CONTROL = 'editLegacyEmbeddableControl'; export const ACTION_CLEAR_CONTROL = 'clearControl'; export const ACTION_DELETE_CONTROL = 'deleteControl'; diff --git a/src/plugins/controls/public/index.ts b/src/plugins/controls/public/index.ts index a9d7e950ee05b..310ded6083cfe 100644 --- a/src/plugins/controls/public/index.ts +++ b/src/plugins/controls/public/index.ts @@ -8,6 +8,22 @@ import { ControlsPlugin } from './plugin'; +export type { + ControlGroupApi, + ControlGroupRuntimeState, + ControlGroupSerializedState, +} from './react_controls/control_group/types'; +export type { + DataControlApi, + DefaultDataControlState, + DataControlFactory, + DataControlServices, +} from './react_controls/controls/data_controls/types'; + +/** + * TODO: remove all exports below this when control group embeddable is removed + */ + export type { ControlOutput, ControlFactory, diff --git a/src/plugins/controls/public/plugin.ts b/src/plugins/controls/public/plugin.ts index 6874926d125c2..6d2690c70935f 100644 --- a/src/plugins/controls/public/plugin.ts +++ b/src/plugins/controls/public/plugin.ts @@ -28,6 +28,11 @@ import { IEditableControlFactory, ControlInput, } from './types'; +import { registerControlGroupEmbeddable } from './react_controls/control_group/register_control_group_embeddable'; +import { registerOptionsListControl } from './react_controls/controls/data_controls/options_list_control/register_options_list_control'; +import { registerRangeSliderControl } from './react_controls/controls/data_controls/range_slider/register_range_slider_control'; +import { registerTimeSliderControl } from './react_controls/controls/timeslider_control/register_timeslider_control'; +import { EditControlAction } from './react_controls/actions/edit_control_action/edit_control_action'; export class ControlsPlugin implements Plugin< @@ -63,6 +68,11 @@ export class ControlsPlugin const { registerControlType } = controlsService; const { embeddable } = _setupPlugins; + registerControlGroupEmbeddable(_coreSetup, embeddable); + registerOptionsListControl(_coreSetup); + registerRangeSliderControl(_coreSetup); + registerTimeSliderControl(_coreSetup); + // register control group embeddable factory _coreSetup.getStartServices().then(([, deps]) => { embeddable.registerEmbeddableFactory( @@ -120,11 +130,22 @@ export class ControlsPlugin uiActions.registerAction(deleteControlAction); uiActions.attachAction(PANEL_HOVER_TRIGGER, deleteControlAction.id); - const { EditControlAction } = await import('./control_group/actions/edit_control_action'); - const editControlAction = new EditControlAction(deleteControlAction); + const editControlAction = new EditControlAction(); uiActions.registerAction(editControlAction); uiActions.attachAction(PANEL_HOVER_TRIGGER, editControlAction.id); + /** + * TODO: Remove edit legacy control embeddable action when embeddable controls are removed + */ + const { EditLegacyEmbeddableControlAction } = await import( + './control_group/actions/edit_control_action' + ); + const editLegacyEmbeddableControlAction = new EditLegacyEmbeddableControlAction( + deleteControlAction + ); + uiActions.registerAction(editLegacyEmbeddableControlAction); + uiActions.attachAction(PANEL_HOVER_TRIGGER, editLegacyEmbeddableControlAction.id); + const { ClearControlAction } = await import('./control_group/actions/clear_control_action'); const clearControlAction = new ClearControlAction(); uiActions.registerAction(clearControlAction); diff --git a/src/plugins/controls/public/react_controls/actions/edit_control_action/compatibility_check.ts b/src/plugins/controls/public/react_controls/actions/edit_control_action/compatibility_check.ts new file mode 100644 index 0000000000000..b67228209044b --- /dev/null +++ b/src/plugins/controls/public/react_controls/actions/edit_control_action/compatibility_check.ts @@ -0,0 +1,41 @@ +/* + * 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 { apiIsPresentationContainer } from '@kbn/presentation-containers'; +import { + apiCanAccessViewMode, + apiHasParentApi, + apiHasType, + apiHasUniqueId, + apiIsOfType, + getInheritedViewMode, + hasEditCapabilities, +} from '@kbn/presentation-publishing'; +import { ViewMode } from '@kbn/embeddable-plugin/public'; +import { CONTROL_GROUP_TYPE } from '../../../../common'; +import { DataControlApi } from '../../controls/data_controls/types'; + +export const compatibilityCheck = (api: unknown): api is DataControlApi => { + return Boolean( + apiHasType(api) && + apiHasUniqueId(api) && + hasEditCapabilities(api) && + apiHasParentApi(api) && + apiCanAccessViewMode(api.parentApi) && + apiIsOfType(api.parentApi, CONTROL_GROUP_TYPE) && + apiIsPresentationContainer(api.parentApi) + ); +}; + +export function isCompatible(api: unknown) { + return ( + compatibilityCheck(api) && + getInheritedViewMode(api.parentApi) === ViewMode.EDIT && + api.isEditingEnabled() + ); +} diff --git a/examples/controls_example/public/react_controls/actions/edit_control_action.tsx b/src/plugins/controls/public/react_controls/actions/edit_control_action/edit_control_action.tsx similarity index 51% rename from examples/controls_example/public/react_controls/actions/edit_control_action.tsx rename to src/plugins/controls/public/react_controls/actions/edit_control_action/edit_control_action.tsx index c8165c2a3642b..4ba4ce2b16cc8 100644 --- a/examples/controls_example/public/react_controls/actions/edit_control_action.tsx +++ b/src/plugins/controls/public/react_controls/actions/edit_control_action/edit_control_action.tsx @@ -9,34 +9,9 @@ import React from 'react'; import { EuiButtonIcon, EuiToolTip } from '@elastic/eui'; -import { CONTROL_GROUP_TYPE } from '@kbn/controls-plugin/common'; -import { ViewMode } from '@kbn/embeddable-plugin/public'; import { i18n } from '@kbn/i18n'; -import { apiIsPresentationContainer } from '@kbn/presentation-containers'; -import { - apiCanAccessViewMode, - apiHasParentApi, - apiHasType, - apiHasUniqueId, - apiIsOfType, - EmbeddableApiContext, - getInheritedViewMode, - hasEditCapabilities, -} from '@kbn/presentation-publishing'; -import { Action, IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; - -import { DataControlApi } from '../data_controls/types'; - -const isApiCompatible = (api: unknown | null): api is DataControlApi => - Boolean( - apiHasType(api) && - apiHasUniqueId(api) && - hasEditCapabilities(api) && - apiHasParentApi(api) && - apiCanAccessViewMode(api.parentApi) && - apiIsOfType(api.parentApi, CONTROL_GROUP_TYPE) && - apiIsPresentationContainer(api.parentApi) - ); +import type { EmbeddableApiContext, HasUniqueId } from '@kbn/presentation-publishing'; +import { type Action, IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; const ACTION_EDIT_CONTROL = 'editDataControl'; @@ -48,11 +23,10 @@ export class EditControlAction implements Action { constructor() {} public readonly MenuItem = ({ context }: { context: EmbeddableApiContext }) => { - if (!isApiCompatible(context.embeddable)) throw new IncompatibleActionError(); return ( this.execute(context)} @@ -63,27 +37,23 @@ export class EditControlAction implements Action { }; public getDisplayName({ embeddable }: EmbeddableApiContext) { - if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); return i18n.translate('controls.controlGroup.floatingActions.editTitle', { defaultMessage: 'Edit', }); } public getIconType({ embeddable }: EmbeddableApiContext) { - if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); return 'pencil'; } public async isCompatible({ embeddable }: EmbeddableApiContext) { - return ( - isApiCompatible(embeddable) && - getInheritedViewMode(embeddable.parentApi) === ViewMode.EDIT && - embeddable.isEditingEnabled() - ); + const { isCompatible } = await import('./compatibility_check'); + return isCompatible(embeddable); } public async execute({ embeddable }: EmbeddableApiContext) { - if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); + const { compatibilityCheck } = await import('./compatibility_check'); + if (!compatibilityCheck(embeddable)) throw new IncompatibleActionError(); await embeddable.onEdit(); } } diff --git a/examples/controls_example/public/react_controls/control_factory_registry.ts b/src/plugins/controls/public/react_controls/control_factory_registry.ts similarity index 85% rename from examples/controls_example/public/react_controls/control_factory_registry.ts rename to src/plugins/controls/public/react_controls/control_factory_registry.ts index b4dcde2d2253d..594dad179176c 100644 --- a/examples/controls_example/public/react_controls/control_factory_registry.ts +++ b/src/plugins/controls/public/react_controls/control_factory_registry.ts @@ -7,7 +7,7 @@ */ import { i18n } from '@kbn/i18n'; -import { ControlFactory, DefaultControlApi } from './types'; +import { ControlFactory, DefaultControlApi } from './controls/types'; const registry: { [key: string]: ControlFactory } = {}; @@ -20,7 +20,7 @@ export const registerControlFactory = async < ) => { if (registry[type] !== undefined) throw new Error( - i18n.translate('controlFactoryRegistry.factoryAlreadyExistsError', { + i18n.translate('controls.controlFactoryRegistry.factoryAlreadyExistsError', { defaultMessage: 'A control factory for type: {key} is already registered.', values: { key: type }, }) @@ -36,7 +36,7 @@ export const getControlFactory = < ): ControlFactory => { if (registry[key] === undefined) throw new Error( - i18n.translate('controlFactoryRegistry.factoryNotFoundError', { + i18n.translate('controls.controlFactoryRegistry.factoryNotFoundError', { defaultMessage: 'No control factory found for type: {key}', values: { key }, }) diff --git a/examples/controls_example/public/react_controls/components/control_clone.tsx b/src/plugins/controls/public/react_controls/control_group/components/control_clone.tsx similarity index 95% rename from examples/controls_example/public/react_controls/components/control_clone.tsx rename to src/plugins/controls/public/react_controls/control_group/components/control_clone.tsx index b44b5a33310a9..cc4ed2ea97687 100644 --- a/examples/controls_example/public/react_controls/components/control_clone.tsx +++ b/src/plugins/controls/public/react_controls/control_group/components/control_clone.tsx @@ -11,10 +11,10 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiFormLabel, EuiIcon } from '@elastic/eui'; import { useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; -import { DEFAULT_CONTROL_GROW } from '@kbn/controls-plugin/common'; - import { BehaviorSubject } from 'rxjs'; -import { DefaultControlApi } from '../types'; +import { DEFAULT_CONTROL_GROW } from '../../../../common'; + +import { DefaultControlApi } from '../../controls/types'; /** * A simplified clone version of the control which is dragged. This version only shows diff --git a/examples/controls_example/public/react_controls/components/control_error.tsx b/src/plugins/controls/public/react_controls/control_group/components/control_error.tsx similarity index 100% rename from examples/controls_example/public/react_controls/components/control_error.tsx rename to src/plugins/controls/public/react_controls/control_group/components/control_error.tsx diff --git a/examples/controls_example/public/react_controls/control_group/components/control_group.tsx b/src/plugins/controls/public/react_controls/control_group/components/control_group.tsx similarity index 96% rename from examples/controls_example/public/react_controls/control_group/components/control_group.tsx rename to src/plugins/controls/public/react_controls/control_group/components/control_group.tsx index 9608d8b082f40..72c891444081a 100644 --- a/examples/controls_example/public/react_controls/control_group/components/control_group.tsx +++ b/src/plugins/controls/public/react_controls/control_group/components/control_group.tsx @@ -32,13 +32,13 @@ import { EuiPanel, EuiToolTip, } from '@elastic/eui'; -import { ControlStyle } from '@kbn/controls-plugin/public'; import { useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; +import { ControlStyle } from '../../..'; import { ControlsInOrder } from '../init_controls_manager'; import { ControlGroupApi } from '../types'; -import { ControlRenderer } from '../../control_renderer'; -import { ControlClone } from '../../components/control_clone'; -import { DefaultControlApi } from '../../types'; +import { ControlRenderer } from './control_renderer'; +import { ControlClone } from './control_clone'; +import { DefaultControlApi } from '../../controls/types'; import { ControlGroupStrings } from '../control_group_strings'; interface Props { diff --git a/examples/controls_example/public/react_controls/components/control_panel.scss b/src/plugins/controls/public/react_controls/control_group/components/control_panel.scss similarity index 100% rename from examples/controls_example/public/react_controls/components/control_panel.scss rename to src/plugins/controls/public/react_controls/control_group/components/control_panel.scss diff --git a/examples/controls_example/public/react_controls/components/control_panel.tsx b/src/plugins/controls/public/react_controls/control_group/components/control_panel.tsx similarity index 97% rename from examples/controls_example/public/react_controls/components/control_panel.tsx rename to src/plugins/controls/public/react_controls/control_group/components/control_panel.tsx index 4d858d25aa45b..b83b0b464b5c5 100644 --- a/examples/controls_example/public/react_controls/components/control_panel.tsx +++ b/src/plugins/controls/public/react_controls/control_group/components/control_panel.tsx @@ -19,7 +19,6 @@ import { EuiIcon, EuiToolTip, } from '@elastic/eui'; -import { DEFAULT_CONTROL_WIDTH } from '@kbn/controls-plugin/common'; import { ViewMode } from '@kbn/embeddable-plugin/public'; import { i18n } from '@kbn/i18n'; import { @@ -28,8 +27,9 @@ import { useBatchedOptionalPublishingSubjects, } from '@kbn/presentation-publishing'; import { FloatingActions } from '@kbn/presentation-util-plugin/public'; +import { DEFAULT_CONTROL_WIDTH } from '../../../../common'; -import { ControlPanelProps, DefaultControlApi } from '../types'; +import { ControlPanelProps, DefaultControlApi } from '../../controls/types'; import { ControlError } from './control_error'; import './control_panel.scss'; diff --git a/examples/controls_example/public/react_controls/control_renderer.tsx b/src/plugins/controls/public/react_controls/control_group/components/control_renderer.tsx similarity index 93% rename from examples/controls_example/public/react_controls/control_renderer.tsx rename to src/plugins/controls/public/react_controls/control_group/components/control_renderer.tsx index 2c248d7c05f79..a10c274c4091f 100644 --- a/examples/controls_example/public/react_controls/control_renderer.tsx +++ b/src/plugins/controls/public/react_controls/control_group/components/control_renderer.tsx @@ -12,10 +12,14 @@ import { BehaviorSubject } from 'rxjs'; import { initializeUnsavedChanges } from '@kbn/presentation-containers'; import { StateComparators } from '@kbn/presentation-publishing'; -import { getControlFactory } from './control_factory_registry'; -import { ControlGroupApi } from './control_group/types'; -import { ControlPanel } from './components/control_panel'; -import { ControlApiRegistration, DefaultControlApi, DefaultControlState } from './types'; +import { getControlFactory } from '../../control_factory_registry'; +import { ControlGroupApi } from '../types'; +import { ControlPanel } from './control_panel'; +import { + ControlApiRegistration, + DefaultControlApi, + DefaultControlState, +} from '../../controls/types'; /** * Renders a component from the control registry into a Control Panel diff --git a/examples/controls_example/public/react_controls/components/control_setting_tooltip_label.tsx b/src/plugins/controls/public/react_controls/control_group/components/control_setting_tooltip_label.tsx similarity index 100% rename from examples/controls_example/public/react_controls/components/control_setting_tooltip_label.tsx rename to src/plugins/controls/public/react_controls/control_group/components/control_setting_tooltip_label.tsx diff --git a/examples/controls_example/public/react_controls/control_group/control_fetch/chaining.test.ts b/src/plugins/controls/public/react_controls/control_group/control_fetch/chaining.test.ts similarity index 99% rename from examples/controls_example/public/react_controls/control_group/control_fetch/chaining.test.ts rename to src/plugins/controls/public/react_controls/control_group/control_fetch/chaining.test.ts index 981cff523b406..d3e369d7c2b64 100644 --- a/examples/controls_example/public/react_controls/control_group/control_fetch/chaining.test.ts +++ b/src/plugins/controls/public/react_controls/control_group/control_fetch/chaining.test.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { ControlGroupChainingSystem } from '@kbn/controls-plugin/common'; +import { ControlGroupChainingSystem } from '../../../../common'; import { Filter } from '@kbn/es-query'; import { BehaviorSubject, skip } from 'rxjs'; import { chaining$ } from './chaining'; diff --git a/examples/controls_example/public/react_controls/control_group/control_fetch/chaining.ts b/src/plugins/controls/public/react_controls/control_group/control_fetch/chaining.ts similarity index 97% rename from examples/controls_example/public/react_controls/control_group/control_fetch/chaining.ts rename to src/plugins/controls/public/react_controls/control_group/control_fetch/chaining.ts index 21ce2f0d55148..7cbe188ad5be2 100644 --- a/examples/controls_example/public/react_controls/control_group/control_fetch/chaining.ts +++ b/src/plugins/controls/public/react_controls/control_group/control_fetch/chaining.ts @@ -6,7 +6,6 @@ * Side Public License, v 1. */ -import { ControlGroupChainingSystem } from '@kbn/controls-plugin/common'; import { Filter, TimeRange } from '@kbn/es-query'; import { apiPublishesFilters, @@ -22,6 +21,7 @@ import { skipWhile, switchMap, } from 'rxjs'; +import { ControlGroupChainingSystem } from '../../../../common'; export interface ChainingContext { chainingFilters?: Filter[] | undefined; diff --git a/examples/controls_example/public/react_controls/control_group/control_fetch/control_fetch.ts b/src/plugins/controls/public/react_controls/control_group/control_fetch/control_fetch.ts similarity index 100% rename from examples/controls_example/public/react_controls/control_group/control_fetch/control_fetch.ts rename to src/plugins/controls/public/react_controls/control_group/control_fetch/control_fetch.ts diff --git a/examples/controls_example/public/react_controls/control_group/control_fetch/control_group_fetch.ts b/src/plugins/controls/public/react_controls/control_group/control_fetch/control_group_fetch.ts similarity index 97% rename from examples/controls_example/public/react_controls/control_group/control_fetch/control_group_fetch.ts rename to src/plugins/controls/public/react_controls/control_group/control_fetch/control_group_fetch.ts index fdca7576ae8a1..599f4610d1b33 100644 --- a/examples/controls_example/public/react_controls/control_group/control_fetch/control_group_fetch.ts +++ b/src/plugins/controls/public/react_controls/control_group/control_fetch/control_group_fetch.ts @@ -6,11 +6,11 @@ * Side Public License, v 1. */ -import { ParentIgnoreSettings } from '@kbn/controls-plugin/public'; import { AggregateQuery, Filter, Query, TimeRange } from '@kbn/es-query'; import { PublishesUnifiedSearch, PublishingSubject } from '@kbn/presentation-publishing'; import { apiPublishesReload } from '@kbn/presentation-publishing/interfaces/fetch/publishes_reload'; import { BehaviorSubject, debounceTime, map, merge, Observable, switchMap } from 'rxjs'; +import { ParentIgnoreSettings } from '../../..'; export interface ControlGroupFetchContext { unifiedSearchFilters?: Filter[] | undefined; diff --git a/examples/controls_example/public/react_controls/control_group/control_fetch/index.ts b/src/plugins/controls/public/react_controls/control_group/control_fetch/index.ts similarity index 100% rename from examples/controls_example/public/react_controls/control_group/control_fetch/index.ts rename to src/plugins/controls/public/react_controls/control_group/control_fetch/index.ts diff --git a/examples/controls_example/public/react_controls/control_group/control_group_editor.tsx b/src/plugins/controls/public/react_controls/control_group/control_group_editor.tsx similarity index 98% rename from examples/controls_example/public/react_controls/control_group/control_group_editor.tsx rename to src/plugins/controls/public/react_controls/control_group/control_group_editor.tsx index cb08aad929efd..9c8ca5b52b0ae 100644 --- a/examples/controls_example/public/react_controls/control_group/control_group_editor.tsx +++ b/src/plugins/controls/public/react_controls/control_group/control_group_editor.tsx @@ -26,10 +26,10 @@ import { EuiTitle, } from '@elastic/eui'; import { css } from '@emotion/react'; -import { ControlStyle, ParentIgnoreSettings } from '@kbn/controls-plugin/public'; import { useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; +import { ControlStyle, ParentIgnoreSettings } from '../..'; -import { ControlStateManager } from '../types'; +import { ControlStateManager } from '../controls/types'; import { ControlGroupStrings } from './control_group_strings'; import { ControlGroupApi, ControlGroupEditorState } from './types'; diff --git a/examples/controls_example/public/react_controls/control_group/control_group_strings.tsx b/src/plugins/controls/public/react_controls/control_group/control_group_strings.tsx similarity index 100% rename from examples/controls_example/public/react_controls/control_group/control_group_strings.tsx rename to src/plugins/controls/public/react_controls/control_group/control_group_strings.tsx diff --git a/examples/controls_example/public/react_controls/control_group/control_group_unsaved_changes_api.ts b/src/plugins/controls/public/react_controls/control_group/control_group_unsaved_changes_api.ts similarity index 97% rename from examples/controls_example/public/react_controls/control_group/control_group_unsaved_changes_api.ts rename to src/plugins/controls/public/react_controls/control_group/control_group_unsaved_changes_api.ts index a0c5927872f10..ecdc0826115a7 100644 --- a/examples/controls_example/public/react_controls/control_group/control_group_unsaved_changes_api.ts +++ b/src/plugins/controls/public/react_controls/control_group/control_group_unsaved_changes_api.ts @@ -20,7 +20,7 @@ import { import { combineLatest, map } from 'rxjs'; import { ControlsInOrder, getControlsInOrder } from './init_controls_manager'; import { ControlGroupRuntimeState, ControlPanelsState } from './types'; -import { apiPublishesAsyncFilters } from '../data_controls/publishes_async_filters'; +import { apiPublishesAsyncFilters } from '../controls/data_controls/publishes_async_filters'; export type ControlGroupComparatorState = Pick< ControlGroupRuntimeState, diff --git a/examples/controls_example/public/react_controls/control_group/get_control_group_factory.tsx b/src/plugins/controls/public/react_controls/control_group/get_control_group_factory.tsx similarity index 90% rename from examples/controls_example/public/react_controls/control_group/get_control_group_factory.tsx rename to src/plugins/controls/public/react_controls/control_group/get_control_group_factory.tsx index 896c9cebc641e..06676a6c9d4be 100644 --- a/examples/controls_example/public/react_controls/control_group/get_control_group_factory.tsx +++ b/src/plugins/controls/public/react_controls/control_group/get_control_group_factory.tsx @@ -9,15 +9,6 @@ import React, { useEffect } from 'react'; import { BehaviorSubject } from 'rxjs'; import fastIsEqual from 'fast-deep-equal'; -import { - ControlGroupChainingSystem, - ControlWidth, - CONTROL_GROUP_TYPE, - DEFAULT_CONTROL_GROW, - DEFAULT_CONTROL_STYLE, - DEFAULT_CONTROL_WIDTH, -} from '@kbn/controls-plugin/common'; -import { ControlStyle, ParentIgnoreSettings } from '@kbn/controls-plugin/public'; import { CoreStart } from '@kbn/core/public'; import { DataView } from '@kbn/data-views-plugin/common'; import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; @@ -32,6 +23,15 @@ import { PublishesDataViews, useBatchedPublishingSubjects, } from '@kbn/presentation-publishing'; +import { ControlStyle, ParentIgnoreSettings } from '../..'; +import { + ControlGroupChainingSystem, + ControlWidth, + CONTROL_GROUP_TYPE, + DEFAULT_CONTROL_GROW, + DEFAULT_CONTROL_STYLE, + DEFAULT_CONTROL_WIDTH, +} from '../../../common'; import { chaining$, controlFetch$, controlGroupFetch$ } from './control_fetch'; import { initControlsManager } from './init_controls_manager'; import { openEditControlGroupFlyout } from './open_edit_control_group_flyout'; @@ -40,6 +40,7 @@ import { ControlGroupApi, ControlGroupRuntimeState, ControlGroupSerializedState import { ControlGroup } from './components/control_group'; import { initSelectionsManager } from './selections_manager'; import { initializeControlGroupUnsavedChanges } from './control_group_unsaved_changes_api'; +import { openDataControlEditor } from '../controls/data_controls/open_data_control_editor'; export const getControlGroupEmbeddableFactory = (services: { core: CoreStart; @@ -162,6 +163,28 @@ export const getControlGroupEmbeddableFactory = (services: { i18n.translate('controls.controlGroup.displayName', { defaultMessage: 'Controls', }), + openAddDataControlFlyout: (settings) => { + const { controlInputTransform } = settings ?? { + controlInputTransform: (state) => state, + }; + openDataControlEditor({ + initialState: { + grow: api.grow.getValue(), + width: api.width.getValue(), + }, + onSave: ({ type: controlType, state: initialState }) => { + api.addNewPanel({ + panelType: controlType, + initialState: controlInputTransform!( + initialState as Partial, + controlType + ), + }); + }, + controlGroupApi: api, + services, + }); + }, serializeState: () => { const { panelsJSON, references } = controlsManager.serializeControls(); return { diff --git a/examples/controls_example/public/react_controls/control_group/init_controls_manager.test.ts b/src/plugins/controls/public/react_controls/control_group/init_controls_manager.test.ts similarity index 98% rename from examples/controls_example/public/react_controls/control_group/init_controls_manager.test.ts rename to src/plugins/controls/public/react_controls/control_group/init_controls_manager.test.ts index cc3b8492dce4a..451681fe5b3fd 100644 --- a/examples/controls_example/public/react_controls/control_group/init_controls_manager.test.ts +++ b/src/plugins/controls/public/react_controls/control_group/init_controls_manager.test.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { DefaultControlApi } from '../types'; +import { DefaultControlApi } from '../controls/types'; import { initControlsManager } from './init_controls_manager'; jest.mock('uuid', () => ({ diff --git a/examples/controls_example/public/react_controls/control_group/init_controls_manager.ts b/src/plugins/controls/public/react_controls/control_group/init_controls_manager.ts similarity index 99% rename from examples/controls_example/public/react_controls/control_group/init_controls_manager.ts rename to src/plugins/controls/public/react_controls/control_group/init_controls_manager.ts index dad214daf96b9..d9eccfa126a8a 100644 --- a/examples/controls_example/public/react_controls/control_group/init_controls_manager.ts +++ b/src/plugins/controls/public/react_controls/control_group/init_controls_manager.ts @@ -19,7 +19,7 @@ import { PublishingSubject, StateComparators } from '@kbn/presentation-publishin import { omit } from 'lodash'; import { apiHasSnapshottableState } from '@kbn/presentation-containers/interfaces/serialized_state'; import { ControlPanelsState, ControlPanelState } from './types'; -import { DefaultControlApi, DefaultControlState } from '../types'; +import { DefaultControlApi, DefaultControlState } from '../controls/types'; import { ControlGroupComparatorState } from './control_group_unsaved_changes_api'; export type ControlsInOrder = Array<{ id: string; type: string }>; diff --git a/examples/controls_example/public/react_controls/control_group/open_edit_control_group_flyout.tsx b/src/plugins/controls/public/react_controls/control_group/open_edit_control_group_flyout.tsx similarity index 98% rename from examples/controls_example/public/react_controls/control_group/open_edit_control_group_flyout.tsx rename to src/plugins/controls/public/react_controls/control_group/open_edit_control_group_flyout.tsx index 7ca8b993083c3..06ab4c063b5c0 100644 --- a/examples/controls_example/public/react_controls/control_group/open_edit_control_group_flyout.tsx +++ b/src/plugins/controls/public/react_controls/control_group/open_edit_control_group_flyout.tsx @@ -15,7 +15,7 @@ import { toMountPoint } from '@kbn/react-kibana-mount'; import React from 'react'; import { BehaviorSubject } from 'rxjs'; -import { ControlStateManager } from '../types'; +import { ControlStateManager } from '../controls/types'; import { ControlGroupEditor } from './control_group_editor'; import { ControlGroupApi, ControlGroupEditorState } from './types'; diff --git a/src/plugins/controls/public/react_controls/control_group/register_control_group_embeddable.ts b/src/plugins/controls/public/react_controls/control_group/register_control_group_embeddable.ts new file mode 100644 index 0000000000000..4534c8cb403b0 --- /dev/null +++ b/src/plugins/controls/public/react_controls/control_group/register_control_group_embeddable.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 type { CoreSetup } from '@kbn/core/public'; +import type { EmbeddableSetup } from '@kbn/embeddable-plugin/public'; +import type { ControlsPluginStartDeps } from '../../types'; +import { CONTROL_GROUP_TYPE } from '../../../common'; + +export function registerControlGroupEmbeddable( + coreSetup: CoreSetup, + embeddableSetup: EmbeddableSetup +) { + embeddableSetup.registerReactEmbeddableFactory(CONTROL_GROUP_TYPE, async () => { + const [{ getControlGroupEmbeddableFactory }, [coreStart, depsStart]] = await Promise.all([ + import('./get_control_group_factory'), + coreSetup.getStartServices(), + ]); + return getControlGroupEmbeddableFactory({ + core: coreStart, + dataViews: depsStart.data.dataViews, + }); + }); +} diff --git a/examples/controls_example/public/react_controls/control_group/selections_manager.test.ts b/src/plugins/controls/public/react_controls/control_group/selections_manager.test.ts similarity index 100% rename from examples/controls_example/public/react_controls/control_group/selections_manager.test.ts rename to src/plugins/controls/public/react_controls/control_group/selections_manager.test.ts diff --git a/examples/controls_example/public/react_controls/control_group/selections_manager.ts b/src/plugins/controls/public/react_controls/control_group/selections_manager.ts similarity index 100% rename from examples/controls_example/public/react_controls/control_group/selections_manager.ts rename to src/plugins/controls/public/react_controls/control_group/selections_manager.ts diff --git a/examples/controls_example/public/react_controls/control_group/serialization_utils.ts b/src/plugins/controls/public/react_controls/control_group/serialization_utils.ts similarity index 95% rename from examples/controls_example/public/react_controls/control_group/serialization_utils.ts rename to src/plugins/controls/public/react_controls/control_group/serialization_utils.ts index b38b22fc04249..f57fbd801804f 100644 --- a/examples/controls_example/public/react_controls/control_group/serialization_utils.ts +++ b/src/plugins/controls/public/react_controls/control_group/serialization_utils.ts @@ -6,9 +6,9 @@ * Side Public License, v 1. */ -import { DEFAULT_CONTROL_GROW, DEFAULT_CONTROL_WIDTH } from '@kbn/controls-plugin/common'; import { SerializedPanelState } from '@kbn/presentation-containers'; import { omit } from 'lodash'; +import { DEFAULT_CONTROL_GROW, DEFAULT_CONTROL_WIDTH } from '../../../common'; import { ControlGroupRuntimeState, ControlGroupSerializedState } from './types'; export const deserializeControlGroup = ( diff --git a/examples/controls_example/public/react_controls/control_group/types.ts b/src/plugins/controls/public/react_controls/control_group/types.ts similarity index 91% rename from examples/controls_example/public/react_controls/control_group/types.ts rename to src/plugins/controls/public/react_controls/control_group/types.ts index 17ce4f1890751..d58a487b86a79 100644 --- a/examples/controls_example/public/react_controls/control_group/types.ts +++ b/src/plugins/controls/public/react_controls/control_group/types.ts @@ -6,9 +6,8 @@ * Side Public License, v 1. */ -import { ControlGroupChainingSystem } from '@kbn/controls-plugin/common/control_group/types'; -import { ParentIgnoreSettings } from '@kbn/controls-plugin/public'; -import { ControlStyle, ControlWidth } from '@kbn/controls-plugin/public/types'; +import { Observable } from 'rxjs'; + import { DefaultEmbeddableApi } from '@kbn/embeddable-plugin/public'; import { Filter } from '@kbn/es-query'; import { @@ -27,8 +26,12 @@ import { PublishingSubject, } from '@kbn/presentation-publishing'; import { PublishesDataViews } from '@kbn/presentation-publishing/interfaces/publishes_data_views'; -import { Observable } from 'rxjs'; -import { DefaultControlState, PublishesControlDisplaySettings } from '../types'; + +import { ParentIgnoreSettings } from '../..'; +import { ControlInputTransform } from '../../../common'; +import { ControlGroupChainingSystem } from '../../../common/control_group/types'; +import { ControlStyle, ControlWidth } from '../../types'; +import { DefaultControlState, PublishesControlDisplaySettings } from '../controls/types'; import { ControlFetchContext } from './control_fetch/control_fetch'; /** The control display settings published by the control group are the "default" */ @@ -66,6 +69,9 @@ export type ControlGroupApi = PresentationContainer & ignoreParentSettings$: PublishingSubject; allowExpensiveQueries$: PublishingSubject; untilInitialized: () => Promise; + openAddDataControlFlyout: (settings?: { + controlInputTransform?: ControlInputTransform; + }) => void; }; export interface ControlGroupRuntimeState { diff --git a/examples/controls_example/public/react_controls/constants.ts b/src/plugins/controls/public/react_controls/controls/constants.ts similarity index 100% rename from examples/controls_example/public/react_controls/constants.ts rename to src/plugins/controls/public/react_controls/controls/constants.ts diff --git a/examples/controls_example/public/react_controls/data_controls/data_control_constants.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/data_control_constants.tsx similarity index 98% rename from examples/controls_example/public/react_controls/data_controls/data_control_constants.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/data_control_constants.tsx index 9bc9eddbfc0d2..d68309b62ed31 100644 --- a/examples/controls_example/public/react_controls/data_controls/data_control_constants.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/data_control_constants.tsx @@ -6,8 +6,8 @@ * Side Public License, v 1. */ -import { RANGE_SLIDER_CONTROL } from '@kbn/controls-plugin/common'; import { i18n } from '@kbn/i18n'; +import { RANGE_SLIDER_CONTROL } from '../../../../common'; export const DataControlEditorStrings = { manageControl: { diff --git a/examples/controls_example/public/react_controls/data_controls/data_control_editor.test.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/data_control_editor.test.tsx similarity index 97% rename from examples/controls_example/public/react_controls/data_controls/data_control_editor.test.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/data_control_editor.test.tsx index d6c1ff9a1ae35..9b5798efdc220 100644 --- a/examples/controls_example/public/react_controls/data_controls/data_control_editor.test.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/data_control_editor.test.tsx @@ -16,14 +16,14 @@ import { TimeRange } from '@kbn/es-query'; import { I18nProvider } from '@kbn/i18n-react'; import { act, fireEvent, render, RenderResult, waitFor } from '@testing-library/react'; -import { getAllControlTypes, getControlFactory } from '../control_factory_registry'; -jest.mock('../control_factory_registry', () => ({ - ...jest.requireActual('../control_factory_registry'), +import { getAllControlTypes, getControlFactory } from '../../control_factory_registry'; +jest.mock('../../control_factory_registry', () => ({ + ...jest.requireActual('../../control_factory_registry'), getAllControlTypes: jest.fn(), getControlFactory: jest.fn(), })); -import { DEFAULT_CONTROL_GROW, DEFAULT_CONTROL_WIDTH } from '@kbn/controls-plugin/common'; -import { ControlGroupApi } from '../control_group/types'; +import { DEFAULT_CONTROL_GROW, DEFAULT_CONTROL_WIDTH } from '../../../../common'; +import { ControlGroupApi } from '../../control_group/types'; import { DataControlEditor } from './data_control_editor'; import { DataControlEditorState } from './open_data_control_editor'; import { diff --git a/examples/controls_example/public/react_controls/data_controls/data_control_editor.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/data_control_editor.tsx similarity index 97% rename from examples/controls_example/public/react_controls/data_controls/data_control_editor.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/data_control_editor.tsx index bccf64bf0745a..701d8c1d85391 100644 --- a/examples/controls_example/public/react_controls/data_controls/data_control_editor.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/data_control_editor.tsx @@ -30,13 +30,6 @@ import { EuiTitle, EuiToolTip, } from '@elastic/eui'; -import { - ControlWidth, - DEFAULT_CONTROL_GROW, - DEFAULT_CONTROL_WIDTH, -} from '@kbn/controls-plugin/common'; -import { CONTROL_WIDTH_OPTIONS } from '@kbn/controls-plugin/public'; -import { DataControlFieldRegistry } from '@kbn/controls-plugin/public/types'; import { DataViewField } from '@kbn/data-views-plugin/common'; import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import { useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; @@ -45,13 +38,16 @@ import { LazyFieldPicker, withSuspense, } from '@kbn/presentation-util-plugin/public'; +import { DataControlFieldRegistry } from '../../../types'; +import { CONTROL_WIDTH_OPTIONS } from '../../..'; +import { ControlWidth, DEFAULT_CONTROL_GROW, DEFAULT_CONTROL_WIDTH } from '../../../../common'; -import { getAllControlTypes, getControlFactory } from '../control_factory_registry'; -import { ControlGroupApi } from '../control_group/types'; +import { getAllControlTypes, getControlFactory } from '../../control_factory_registry'; +import { ControlGroupApi } from '../../control_group/types'; import { DataControlEditorStrings } from './data_control_constants'; import { getDataControlFieldRegistry } from './data_control_editor_utils'; import { DataControlEditorState } from './open_data_control_editor'; -import { DataControlFactory, isDataControlFactory } from './types'; +import { DataControlFactory, DefaultDataControlState, isDataControlFactory } from './types'; export interface ControlEditorProps { initialState: State; @@ -213,7 +209,7 @@ export const DataControlEditor = setEditorState({ ...editorState, ...newState })} setControlEditorValid={setControlOptionsValid} diff --git a/examples/controls_example/public/react_controls/data_controls/data_control_editor_utils.ts b/src/plugins/controls/public/react_controls/controls/data_controls/data_control_editor_utils.ts similarity index 91% rename from examples/controls_example/public/react_controls/data_controls/data_control_editor_utils.ts rename to src/plugins/controls/public/react_controls/controls/data_controls/data_control_editor_utils.ts index d4ced0b1aafa6..f621cf24226d2 100644 --- a/examples/controls_example/public/react_controls/data_controls/data_control_editor_utils.ts +++ b/src/plugins/controls/public/react_controls/controls/data_controls/data_control_editor_utils.ts @@ -8,9 +8,9 @@ import { memoize } from 'lodash'; -import { DataControlFieldRegistry } from '@kbn/controls-plugin/public/types'; import { DataView } from '@kbn/data-views-plugin/common'; -import { getAllControlTypes, getControlFactory } from '../control_factory_registry'; +import { DataControlFieldRegistry } from '../../../types'; +import { getAllControlTypes, getControlFactory } from '../../control_factory_registry'; import { isDataControlFactory } from './types'; /** TODO: This funciton is duplicated from the controls plugin to avoid exporting it */ diff --git a/examples/controls_example/public/react_controls/data_controls/initialize_data_control.test.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/initialize_data_control.test.tsx similarity index 98% rename from examples/controls_example/public/react_controls/data_controls/initialize_data_control.test.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/initialize_data_control.test.tsx index 97ac9a6977226..5dd6bf745feca 100644 --- a/examples/controls_example/public/react_controls/data_controls/initialize_data_control.test.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/initialize_data_control.test.tsx @@ -10,7 +10,7 @@ import { coreMock } from '@kbn/core/public/mocks'; import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; import type { DataView } from '@kbn/data-views-plugin/public'; import { first, skip } from 'rxjs'; -import { ControlGroupApi } from '../control_group/types'; +import { ControlGroupApi } from '../../control_group/types'; import { initializeDataControl } from './initialize_data_control'; describe('initializeDataControl', () => { diff --git a/examples/controls_example/public/react_controls/data_controls/initialize_data_control.ts b/src/plugins/controls/public/react_controls/controls/data_controls/initialize_data_control.ts similarity index 98% rename from examples/controls_example/public/react_controls/data_controls/initialize_data_control.ts rename to src/plugins/controls/public/react_controls/controls/data_controls/initialize_data_control.ts index c376890b232f5..12bfba658c9f5 100644 --- a/examples/controls_example/public/react_controls/data_controls/initialize_data_control.ts +++ b/src/plugins/controls/public/react_controls/controls/data_controls/initialize_data_control.ts @@ -21,7 +21,7 @@ import { SerializedPanelState } from '@kbn/presentation-containers'; import { StateComparators } from '@kbn/presentation-publishing'; import { i18n } from '@kbn/i18n'; -import { ControlGroupApi } from '../control_group/types'; +import { ControlGroupApi } from '../../control_group/types'; import { initializeDefaultControlApi } from '../initialize_default_control_api'; import { ControlApiInitialization, ControlStateManager, DefaultControlState } from '../types'; import { openDataControlEditor } from './open_data_control_editor'; @@ -116,7 +116,7 @@ export const initializeDataControl = ( if (!field) { defaultControl.api.setBlockingError( new Error( - i18n.translate('controlsExamples.errors.fieldNotFound', { + i18n.translate('controls.dataControl.fieldNotFound', { defaultMessage: 'Could not locate field: {fieldName}', values: { fieldName: nextFieldName }, }) diff --git a/examples/controls_example/public/react_controls/data_controls/mocks/api_mocks.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/mocks/api_mocks.tsx similarity index 87% rename from examples/controls_example/public/react_controls/data_controls/mocks/api_mocks.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/mocks/api_mocks.tsx index a21e253f57628..f2696bd293ae8 100644 --- a/examples/controls_example/public/react_controls/data_controls/mocks/api_mocks.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/mocks/api_mocks.tsx @@ -8,13 +8,13 @@ import { BehaviorSubject } from 'rxjs'; -import { OptionsListSuggestions } from '@kbn/controls-plugin/common/options_list/types'; import { DataViewField } from '@kbn/data-views-plugin/common'; import { PublishingSubject } from '@kbn/presentation-publishing'; -import { OptionsListSelection } from '../../../../common/options_list/options_list_selections'; -import { OptionsListSearchTechnique } from '../../../../common/options_list/suggestions_searching'; -import { OptionsListSortingType } from '../../../../common/options_list/suggestions_sorting'; +import { OptionsListSuggestions } from '../../../../../common/options_list/types'; +import { OptionsListSelection } from '../../../../../common/options_list/options_list_selections'; +import { OptionsListSearchTechnique } from '../../../../../common/options_list/suggestions_searching'; +import { OptionsListSortingType } from '../../../../../common/options_list/suggestions_sorting'; import { OptionsListDisplaySettings } from '../options_list_control/types'; export const getOptionsListMocks = () => { diff --git a/examples/controls_example/public/react_controls/data_controls/mocks/factory_mocks.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/mocks/factory_mocks.tsx similarity index 100% rename from examples/controls_example/public/react_controls/data_controls/mocks/factory_mocks.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/mocks/factory_mocks.tsx diff --git a/examples/controls_example/public/react_controls/data_controls/open_data_control_editor.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/open_data_control_editor.tsx similarity index 96% rename from examples/controls_example/public/react_controls/data_controls/open_data_control_editor.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/open_data_control_editor.tsx index 3c16183b18434..fbddf0e7af831 100644 --- a/examples/controls_example/public/react_controls/data_controls/open_data_control_editor.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/open_data_control_editor.tsx @@ -16,11 +16,11 @@ import { tracksOverlays } from '@kbn/presentation-containers'; import { apiHasParentApi } from '@kbn/presentation-publishing'; import { toMountPoint } from '@kbn/react-kibana-mount'; -import { ControlGroupApi } from '../control_group/types'; +import { ControlGroupApi } from '../../control_group/types'; import { DataControlEditor } from './data_control_editor'; import { DefaultDataControlState } from './types'; -export type DataControlEditorState = Omit & { +export type DataControlEditorState = Partial & { fieldName?: string; controlType?: string; controlId?: string; diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list.scss b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list.scss similarity index 100% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list.scss rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list.scss diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_control.test.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_control.test.tsx similarity index 100% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_control.test.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_control.test.tsx diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_control.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_control.tsx similarity index 97% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_control.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_control.tsx index c102f7822b804..5411b6122ac25 100644 --- a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_control.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_control.tsx @@ -24,8 +24,8 @@ import { useBatchedPublishingSubjects, } from '@kbn/presentation-publishing'; -import { OptionsListSelection } from '../../../../../common/options_list/options_list_selections'; -import { MIN_POPOVER_WIDTH } from '../constants'; +import { OptionsListSelection } from '../../../../../../common/options_list/options_list_selections'; +import { MIN_POPOVER_WIDTH } from '../../../constants'; import { useOptionsListContext } from '../options_list_context_provider'; import { OptionsListPopover } from './options_list_popover'; import { OptionsListStrings } from '../options_list_strings'; diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_editor_options.test.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_editor_options.test.tsx similarity index 99% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_editor_options.test.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_editor_options.test.tsx index 5023a5d276eb5..f463400b351c8 100644 --- a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_editor_options.test.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_editor_options.test.tsx @@ -16,7 +16,7 @@ import { getMockedControlGroupApi } from '../../../mocks/control_mocks'; import { CustomOptionsComponentProps, DefaultDataControlState } from '../../types'; import { OptionsListControlState } from '../types'; import { OptionsListEditorOptions } from './options_list_editor_options'; -import { ControlGroupApi } from '../../../control_group/types'; +import { ControlGroupApi } from '../../../../control_group/types'; import { BehaviorSubject } from 'rxjs'; describe('Options list sorting button', () => { diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_editor_options.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_editor_options.tsx similarity index 97% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_editor_options.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_editor_options.tsx index 3374104c7dabb..e749973c99f74 100644 --- a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_editor_options.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_editor_options.tsx @@ -14,8 +14,8 @@ import { useStateFromPublishingSubject } from '@kbn/presentation-publishing'; import { getCompatibleSearchTechniques, OptionsListSearchTechnique, -} from '../../../../../common/options_list/suggestions_searching'; -import { ControlSettingTooltipLabel } from '../../../components/control_setting_tooltip_label'; +} from '../../../../../../common/options_list/suggestions_searching'; +import { ControlSettingTooltipLabel } from '../../../../control_group/components/control_setting_tooltip_label'; import { CustomOptionsComponentProps } from '../../types'; import { DEFAULT_SEARCH_TECHNIQUE } from '../constants'; import { OptionsListControlState } from '../types'; diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover.test.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover.test.tsx similarity index 100% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover.test.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover.test.tsx diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover.tsx similarity index 100% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover.tsx diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover_action_bar.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover_action_bar.tsx similarity index 98% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover_action_bar.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover_action_bar.tsx index 73843ae90d9b3..503a32933cec8 100644 --- a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover_action_bar.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover_action_bar.tsx @@ -19,7 +19,7 @@ import { } from '@elastic/eui'; import { useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; -import { getCompatibleSearchTechniques } from '../../../../../common/options_list/suggestions_searching'; +import { getCompatibleSearchTechniques } from '../../../../../../common/options_list/suggestions_searching'; import { useOptionsListContext } from '../options_list_context_provider'; import { OptionsListPopoverSortingButton } from './options_list_popover_sorting_button'; import { OptionsListStrings } from '../options_list_strings'; diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover_empty_message.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover_empty_message.tsx similarity index 100% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover_empty_message.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover_empty_message.tsx diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover_footer.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover_footer.tsx similarity index 100% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover_footer.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover_footer.tsx diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover_invalid_selections.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover_invalid_selections.tsx similarity index 100% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover_invalid_selections.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover_invalid_selections.tsx diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover_sorting_button.test.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover_sorting_button.test.tsx similarity index 100% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover_sorting_button.test.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover_sorting_button.test.tsx diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover_sorting_button.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover_sorting_button.tsx similarity index 98% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover_sorting_button.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover_sorting_button.tsx index b8a0823dea393..e95b7950314c9 100644 --- a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover_sorting_button.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover_sorting_button.tsx @@ -27,7 +27,7 @@ import { getCompatibleSortingTypes, OptionsListSortBy, OPTIONS_LIST_DEFAULT_SORT, -} from '../../../../../common/options_list/suggestions_sorting'; +} from '../../../../../../common/options_list/suggestions_sorting'; import { useOptionsListContext } from '../options_list_context_provider'; import { OptionsListStrings } from '../options_list_strings'; diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover_suggestion_badge.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover_suggestion_badge.tsx similarity index 100% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover_suggestion_badge.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover_suggestion_badge.tsx diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover_suggestions.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover_suggestions.tsx similarity index 97% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover_suggestions.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover_suggestions.tsx index a8cd84252e0d9..4cf010f0473aa 100644 --- a/examples/controls_example/public/react_controls/data_controls/options_list_control/components/options_list_popover_suggestions.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/components/options_list_popover_suggestions.tsx @@ -10,11 +10,11 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { EuiHighlight, EuiSelectable } from '@elastic/eui'; import { EuiSelectableOption } from '@elastic/eui/src/components/selectable/selectable_option'; -import { OptionsListSuggestions } from '@kbn/controls-plugin/common/options_list/types'; import { useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; import { euiThemeVars } from '@kbn/ui-theme'; -import { OptionsListSelection } from '../../../../../common/options_list/options_list_selections'; +import { OptionsListSuggestions } from '../../../../../../common/options_list/types'; +import { OptionsListSelection } from '../../../../../../common/options_list/options_list_selections'; import { MAX_OPTIONS_LIST_REQUEST_SIZE } from '../constants'; import { useOptionsListContext } from '../options_list_context_provider'; import { OptionsListStrings } from '../options_list_strings'; diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/constants.ts b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/constants.ts similarity index 62% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/constants.ts rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/constants.ts index 6400e7b8efa42..5d21e2d04a572 100644 --- a/examples/controls_example/public/react_controls/data_controls/options_list_control/constants.ts +++ b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/constants.ts @@ -6,18 +6,14 @@ * Side Public License, v 1. */ -import { OPTIONS_LIST_CONTROL } from '@kbn/controls-plugin/common'; -import { OptionsListSearchTechnique } from '@kbn/controls-plugin/common/options_list/suggestions_searching'; -import { OptionsListSortingType } from '@kbn/controls-plugin/common/options_list/suggestions_sorting'; +import { OptionsListSearchTechnique } from '../../../../../common/options_list/suggestions_searching'; +import { OptionsListSortingType } from '../../../../../common/options_list/suggestions_sorting'; -export const OPTIONS_LIST_CONTROL_TYPE = OPTIONS_LIST_CONTROL; export const DEFAULT_SEARCH_TECHNIQUE: OptionsListSearchTechnique = 'prefix'; export const OPTIONS_LIST_DEFAULT_SORT: OptionsListSortingType = { by: '_count', direction: 'desc', }; -export const MIN_POPOVER_WIDTH = 300; - export const MIN_OPTIONS_LIST_REQUEST_SIZE = 10; export const MAX_OPTIONS_LIST_REQUEST_SIZE = 1000; diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/fetch_and_validate.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/fetch_and_validate.tsx similarity index 91% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/fetch_and_validate.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/fetch_and_validate.tsx index 6f02e26864184..7b6db45a1ba2a 100644 --- a/examples/controls_example/public/react_controls/data_controls/options_list_control/fetch_and_validate.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/fetch_and_validate.tsx @@ -16,12 +16,11 @@ import { withLatestFrom, } from 'rxjs'; -import { OptionsListSuccessResponse } from '@kbn/controls-plugin/common/options_list/types'; - import { PublishingSubject } from '@kbn/presentation-publishing'; -import { isValidSearch } from '../../../../common/options_list/suggestions_searching'; -import { OptionsListSelection } from '../../../../common/options_list/options_list_selections'; -import { ControlFetchContext } from '../../control_group/control_fetch'; +import { OptionsListSuccessResponse } from '../../../../../common/options_list/types'; +import { isValidSearch } from '../../../../../common/options_list/is_valid_search'; +import { OptionsListSelection } from '../../../../../common/options_list/options_list_selections'; +import { ControlFetchContext } from '../../../control_group/control_fetch'; import { ControlStateManager } from '../../types'; import { DataControlServices } from '../types'; import { OptionsListFetchCache } from './options_list_fetch_cache'; diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/get_options_list_control_factory.test.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/get_options_list_control_factory.test.tsx similarity index 100% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/get_options_list_control_factory.test.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/get_options_list_control_factory.test.tsx diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/get_options_list_control_factory.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/get_options_list_control_factory.tsx similarity index 97% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/get_options_list_control_factory.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/get_options_list_control_factory.tsx index e71bcd9002c36..12d0de5a3d7d3 100644 --- a/examples/controls_example/public/react_controls/data_controls/options_list_control/get_options_list_control_factory.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/get_options_list_control_factory.tsx @@ -9,20 +9,21 @@ import React, { useEffect } from 'react'; import { BehaviorSubject, combineLatest, debounceTime, filter, skip } from 'rxjs'; -import { OptionsListSearchTechnique } from '@kbn/controls-plugin/common/options_list/suggestions_searching'; -import { OptionsListSortingType } from '@kbn/controls-plugin/common/options_list/suggestions_sorting'; -import { - OptionsListSuccessResponse, - OptionsListSuggestions, -} from '@kbn/controls-plugin/common/options_list/types'; import { buildExistsFilter, buildPhraseFilter, buildPhrasesFilter, Filter } from '@kbn/es-query'; import { useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; +import { + OPTIONS_LIST_CONTROL, + OptionsListSuccessResponse, + OptionsListSuggestions, +} from '../../../../../common/options_list/types'; import { getSelectionAsFieldType, OptionsListSelection, -} from '../../../../common/options_list/options_list_selections'; -import { isValidSearch } from '../../../../common/options_list/suggestions_searching'; +} from '../../../../../common/options_list/options_list_selections'; +import { isValidSearch } from '../../../../../common/options_list/is_valid_search'; +import { OptionsListSearchTechnique } from '../../../../../common/options_list/suggestions_searching'; +import { OptionsListSortingType } from '../../../../../common/options_list/suggestions_sorting'; import { initializeDataControl } from '../initialize_data_control'; import { DataControlFactory, DataControlServices } from '../types'; import { OptionsListControl } from './components/options_list_control'; @@ -30,7 +31,6 @@ import { OptionsListEditorOptions } from './components/options_list_editor_optio import { DEFAULT_SEARCH_TECHNIQUE, MIN_OPTIONS_LIST_REQUEST_SIZE, - OPTIONS_LIST_CONTROL_TYPE, OPTIONS_LIST_DEFAULT_SORT, } from './constants'; import { fetchAndValidate$ } from './fetch_and_validate'; @@ -43,7 +43,7 @@ export const getOptionsListControlFactory = ( services: DataControlServices ): DataControlFactory => { return { - type: OPTIONS_LIST_CONTROL_TYPE, + type: OPTIONS_LIST_CONTROL, order: 3, // should always be first, since this is the most popular control getIconType: () => 'editorChecklist', getDisplayName: OptionsListStrings.control.getDisplayName, @@ -86,7 +86,7 @@ export const getOptionsListControlFactory = ( Pick >( uuid, - OPTIONS_LIST_CONTROL_TYPE, + OPTIONS_LIST_CONTROL, initialState, { searchTechnique: searchTechnique$, singleSelect: singleSelect$ }, controlGroupApi, diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/options_list_context_provider.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/options_list_context_provider.tsx similarity index 93% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/options_list_context_provider.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/options_list_context_provider.tsx index 4c992331e6a5a..b9e5852b7c699 100644 --- a/examples/controls_example/public/react_controls/data_controls/options_list_control/options_list_context_provider.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/options_list_context_provider.tsx @@ -15,7 +15,7 @@ import { OptionsListComponentState, OptionsListDisplaySettings, } from './types'; -import { OptionsListSelection } from '../../../../common/options_list/options_list_selections'; +import { OptionsListSelection } from '../../../../../common/options_list/options_list_selections'; export type ContextStateManager = ControlStateManager< Omit diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/options_list_control_selections.ts b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/options_list_control_selections.ts similarity index 96% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/options_list_control_selections.ts rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/options_list_control_selections.ts index 58efa05110844..3b3f0aea7ed38 100644 --- a/examples/controls_example/public/react_controls/data_controls/options_list_control/options_list_control_selections.ts +++ b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/options_list_control_selections.ts @@ -10,7 +10,7 @@ import { BehaviorSubject } from 'rxjs'; import deepEqual from 'react-fast-compare'; import { PublishingSubject, StateComparators } from '@kbn/presentation-publishing'; import { OptionsListControlState } from './types'; -import { OptionsListSelection } from '../../../../common/options_list/options_list_selections'; +import { OptionsListSelection } from '../../../../../common/options_list/options_list_selections'; export function initializeOptionsListSelections( initialState: OptionsListControlState, diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/options_list_fetch_cache.ts b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/options_list_fetch_cache.ts similarity index 98% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/options_list_fetch_cache.ts rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/options_list_fetch_cache.ts index 84f9d2fc5e206..7b30504e3ab1c 100644 --- a/examples/controls_example/public/react_controls/data_controls/options_list_control/options_list_fetch_cache.ts +++ b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/options_list_fetch_cache.ts @@ -11,14 +11,14 @@ import hash from 'object-hash'; import dateMath from '@kbn/datemath'; +import { getEsQueryConfig } from '@kbn/data-plugin/public'; +import { buildEsQuery } from '@kbn/es-query'; import { type OptionsListFailureResponse, type OptionsListRequest, type OptionsListResponse, type OptionsListSuccessResponse, -} from '@kbn/controls-plugin/common/options_list/types'; -import { getEsQueryConfig } from '@kbn/data-plugin/public'; -import { buildEsQuery } from '@kbn/es-query'; +} from '../../../../../common/options_list/types'; import { DataControlServices } from '../types'; const REQUEST_CACHE_SIZE = 50; // only store a max of 50 responses diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/options_list_strings.ts b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/options_list_strings.ts similarity index 99% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/options_list_strings.ts rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/options_list_strings.ts index 5bf1c4c92239a..4ed8f72ed4cda 100644 --- a/examples/controls_example/public/react_controls/data_controls/options_list_control/options_list_strings.ts +++ b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/options_list_strings.ts @@ -7,7 +7,7 @@ */ import { i18n } from '@kbn/i18n'; -import { OptionsListSearchTechnique } from '../../../../common/options_list/suggestions_searching'; +import { OptionsListSearchTechnique } from '../../../../../common/options_list/suggestions_searching'; export const OptionsListStrings = { control: { diff --git a/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/register_options_list_control.ts b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/register_options_list_control.ts new file mode 100644 index 0000000000000..c3b7723f69bb7 --- /dev/null +++ b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/register_options_list_control.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { CoreSetup } from '@kbn/core/public'; +import type { ControlsPluginStartDeps } from '../../../../types'; +import { registerControlFactory } from '../../../control_factory_registry'; +import { OPTIONS_LIST_CONTROL } from '../../../../../common'; + +export function registerOptionsListControl(coreSetup: CoreSetup) { + registerControlFactory(OPTIONS_LIST_CONTROL, async () => { + const [{ getOptionsListControlFactory }, [coreStart, depsStart]] = await Promise.all([ + import('./get_options_list_control_factory'), + coreSetup.getStartServices(), + ]); + return getOptionsListControlFactory({ + core: coreStart, + data: depsStart.data, + dataViews: depsStart.data.dataViews, + }); + }); +} diff --git a/examples/controls_example/public/react_controls/data_controls/options_list_control/types.ts b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/types.ts similarity index 82% rename from examples/controls_example/public/react_controls/data_controls/options_list_control/types.ts rename to src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/types.ts index b2e2f9c4c75b1..c564c583df5aa 100644 --- a/examples/controls_example/public/react_controls/data_controls/options_list_control/types.ts +++ b/src/plugins/controls/public/react_controls/controls/data_controls/options_list_control/types.ts @@ -8,12 +8,12 @@ import { BehaviorSubject } from 'rxjs'; -import { OptionsListSearchTechnique } from '@kbn/controls-plugin/common/options_list/suggestions_searching'; -import { OptionsListSortingType } from '@kbn/controls-plugin/common/options_list/suggestions_sorting'; -import { OptionsListSuggestions } from '@kbn/controls-plugin/common/options_list/types'; import { PublishingSubject } from '@kbn/presentation-publishing'; -import { OptionsListSelection } from '../../../../common/options_list/options_list_selections'; +import { OptionsListSearchTechnique } from '../../../../../common/options_list/suggestions_searching'; +import { OptionsListSortingType } from '../../../../../common/options_list/suggestions_sorting'; +import { OptionsListSuggestions } from '../../../../../common/options_list/types'; +import { OptionsListSelection } from '../../../../../common/options_list/options_list_selections'; import { DataControlApi, DefaultDataControlState } from '../types'; export interface OptionsListDisplaySettings { diff --git a/examples/controls_example/public/react_controls/data_controls/publishes_async_filters.ts b/src/plugins/controls/public/react_controls/controls/data_controls/publishes_async_filters.ts similarity index 100% rename from examples/controls_example/public/react_controls/data_controls/publishes_async_filters.ts rename to src/plugins/controls/public/react_controls/controls/data_controls/publishes_async_filters.ts diff --git a/examples/controls_example/public/react_controls/data_controls/range_slider/components/range_slider.scss b/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/components/range_slider.scss similarity index 100% rename from examples/controls_example/public/react_controls/data_controls/range_slider/components/range_slider.scss rename to src/plugins/controls/public/react_controls/controls/data_controls/range_slider/components/range_slider.scss diff --git a/examples/controls_example/public/react_controls/data_controls/range_slider/components/range_slider_control.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/components/range_slider_control.tsx similarity index 100% rename from examples/controls_example/public/react_controls/data_controls/range_slider/components/range_slider_control.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/range_slider/components/range_slider_control.tsx diff --git a/examples/controls_example/public/react_controls/data_controls/range_slider/get_range_slider_control_factory.test.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/get_range_slider_control_factory.test.tsx similarity index 100% rename from examples/controls_example/public/react_controls/data_controls/range_slider/get_range_slider_control_factory.test.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/range_slider/get_range_slider_control_factory.test.tsx diff --git a/examples/controls_example/public/react_controls/data_controls/range_slider/get_range_slider_control_factory.tsx b/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/get_range_slider_control_factory.tsx similarity index 97% rename from examples/controls_example/public/react_controls/data_controls/range_slider/get_range_slider_control_factory.tsx rename to src/plugins/controls/public/react_controls/controls/data_controls/range_slider/get_range_slider_control_factory.tsx index a9b3e31a2c706..cc953e3109a07 100644 --- a/examples/controls_example/public/react_controls/data_controls/range_slider/get_range_slider_control_factory.tsx +++ b/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/get_range_slider_control_factory.tsx @@ -17,14 +17,15 @@ import { RangeSliderControl } from './components/range_slider_control'; import { hasNoResults$ } from './has_no_results'; import { minMax$ } from './min_max'; import { RangeSliderStrings } from './range_slider_strings'; -import { RangesliderControlApi, RangesliderControlState, RANGE_SLIDER_CONTROL_TYPE } from './types'; +import { RangesliderControlApi, RangesliderControlState } from './types'; import { initializeRangeControlSelections } from './range_control_selections'; +import { RANGE_SLIDER_CONTROL } from '../../../../../common'; export const getRangesliderControlFactory = ( services: DataControlServices ): DataControlFactory => { return { - type: RANGE_SLIDER_CONTROL_TYPE, + type: RANGE_SLIDER_CONTROL, getIconType: () => 'controlsHorizontal', getDisplayName: RangeSliderStrings.control.getDisplayName, isFieldCompatible: (field) => { @@ -61,7 +62,7 @@ export const getRangesliderControlFactory = ( const dataControl = initializeDataControl>( uuid, - RANGE_SLIDER_CONTROL_TYPE, + RANGE_SLIDER_CONTROL, initialState, { step: step$, diff --git a/examples/controls_example/public/react_controls/data_controls/range_slider/has_no_results.ts b/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/has_no_results.ts similarity index 96% rename from examples/controls_example/public/react_controls/data_controls/range_slider/has_no_results.ts rename to src/plugins/controls/public/react_controls/controls/data_controls/range_slider/has_no_results.ts index 1a1e62dfde209..3b7b21eadc5da 100644 --- a/examples/controls_example/public/react_controls/data_controls/range_slider/has_no_results.ts +++ b/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/has_no_results.ts @@ -12,8 +12,8 @@ import { DataView } from '@kbn/data-views-plugin/public'; import { AggregateQuery, Filter, Query, TimeRange } from '@kbn/es-query'; import { PublishesDataViews } from '@kbn/presentation-publishing'; import { combineLatest, lastValueFrom, Observable, switchMap, tap } from 'rxjs'; -import { ControlFetchContext } from '../../control_group/control_fetch'; -import { ControlGroupApi } from '../../control_group/types'; +import { ControlFetchContext } from '../../../control_group/control_fetch'; +import { ControlGroupApi } from '../../../control_group/types'; import { DataControlApi } from '../types'; export function hasNoResults$({ diff --git a/examples/controls_example/public/react_controls/data_controls/range_slider/min_max.ts b/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/min_max.ts similarity index 98% rename from examples/controls_example/public/react_controls/data_controls/range_slider/min_max.ts rename to src/plugins/controls/public/react_controls/controls/data_controls/range_slider/min_max.ts index 2f65e523c7441..54ee8bf68031d 100644 --- a/examples/controls_example/public/react_controls/data_controls/range_slider/min_max.ts +++ b/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/min_max.ts @@ -12,7 +12,7 @@ import { DataView, DataViewField } from '@kbn/data-views-plugin/public'; import { AggregateQuery, Filter, Query, TimeRange } from '@kbn/es-query'; import { PublishesDataViews, PublishingSubject } from '@kbn/presentation-publishing'; import { combineLatest, lastValueFrom, Observable, switchMap, tap } from 'rxjs'; -import { ControlFetchContext } from '../../control_group/control_fetch'; +import { ControlFetchContext } from '../../../control_group/control_fetch'; export function minMax$({ controlFetch$, diff --git a/examples/controls_example/public/react_controls/data_controls/range_slider/range_control_selections.ts b/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/range_control_selections.ts similarity index 100% rename from examples/controls_example/public/react_controls/data_controls/range_slider/range_control_selections.ts rename to src/plugins/controls/public/react_controls/controls/data_controls/range_slider/range_control_selections.ts diff --git a/examples/controls_example/public/react_controls/data_controls/range_slider/range_slider_strings.ts b/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/range_slider_strings.ts similarity index 72% rename from examples/controls_example/public/react_controls/data_controls/range_slider/range_slider_strings.ts rename to src/plugins/controls/public/react_controls/controls/data_controls/range_slider/range_slider_strings.ts index cdf64fee21fd5..155a4713f5bb8 100644 --- a/examples/controls_example/public/react_controls/data_controls/range_slider/range_slider_strings.ts +++ b/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/range_slider_strings.ts @@ -11,23 +11,23 @@ import { i18n } from '@kbn/i18n'; export const RangeSliderStrings = { control: { getDisplayName: () => - i18n.translate('controlsExamples.rangeSliderControl.displayName', { + i18n.translate('controls.rangeSliderControl.displayName', { defaultMessage: 'Range slider', }), getInvalidSelectionWarningLabel: () => - i18n.translate('controlsExamples.rangeSlider.control.invalidSelectionWarningLabel', { + i18n.translate('controls.rangeSlider.control.invalidSelectionWarningLabel', { defaultMessage: 'Selected range returns no results.', }), }, editor: { getStepTitle: () => - i18n.translate('controlsExamples.rangeSlider.editor.stepSizeTitle', { + i18n.translate('controls.rangeSlider.editor.stepSizeTitle', { defaultMessage: 'Step size', }), }, popover: { getNoAvailableDataHelpText: () => - i18n.translate('controlsExamples.rangeSlider.popover.noAvailableDataHelpText', { + i18n.translate('controls.rangeSlider.popover.noAvailableDataHelpText', { defaultMessage: 'There is no data to display. Adjust the time range and filters.', }), }, diff --git a/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/register_range_slider_control.ts b/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/register_range_slider_control.ts new file mode 100644 index 0000000000000..4a01a10aeaa30 --- /dev/null +++ b/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/register_range_slider_control.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 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { CoreSetup } from '@kbn/core/public'; +import type { ControlsPluginStartDeps } from '../../../../types'; +import { registerControlFactory } from '../../../control_factory_registry'; +import { RANGE_SLIDER_CONTROL } from '../../../../../common'; + +export function registerRangeSliderControl(coreSetup: CoreSetup) { + registerControlFactory(RANGE_SLIDER_CONTROL, async () => { + const [{ getRangesliderControlFactory }, [coreStart, depsStart]] = await Promise.all([ + import('./get_range_slider_control_factory'), + coreSetup.getStartServices(), + ]); + + return getRangesliderControlFactory({ + core: coreStart, + data: depsStart.data, + dataViews: depsStart.data.dataViews, + }); + }); +} diff --git a/examples/controls_example/public/react_controls/data_controls/range_slider/types.ts b/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/types.ts similarity index 91% rename from examples/controls_example/public/react_controls/data_controls/range_slider/types.ts rename to src/plugins/controls/public/react_controls/controls/data_controls/range_slider/types.ts index 5dc83aa55da5f..f32dab087f5d6 100644 --- a/examples/controls_example/public/react_controls/data_controls/range_slider/types.ts +++ b/src/plugins/controls/public/react_controls/controls/data_controls/range_slider/types.ts @@ -8,8 +8,6 @@ import { DataControlApi, DefaultDataControlState } from '../types'; -export const RANGE_SLIDER_CONTROL_TYPE = 'rangeSlider'; - export type RangeValue = [string, string]; export interface RangesliderControlState extends DefaultDataControlState { diff --git a/examples/controls_example/public/react_controls/data_controls/types.ts b/src/plugins/controls/public/react_controls/controls/data_controls/types.ts similarity index 97% rename from examples/controls_example/public/react_controls/data_controls/types.ts rename to src/plugins/controls/public/react_controls/controls/data_controls/types.ts index 39effdb015184..07025d6380071 100644 --- a/examples/controls_example/public/react_controls/data_controls/types.ts +++ b/src/plugins/controls/public/react_controls/controls/data_controls/types.ts @@ -17,7 +17,7 @@ import { PublishesPanelTitle, PublishingSubject, } from '@kbn/presentation-publishing'; -import { ControlGroupApi } from '../control_group/types'; +import { ControlGroupApi } from '../../control_group/types'; import { ControlFactory, DefaultControlApi, DefaultControlState } from '../types'; import { PublishesAsyncFilters } from './publishes_async_filters'; diff --git a/examples/controls_example/public/react_controls/initialize_default_control_api.tsx b/src/plugins/controls/public/react_controls/controls/initialize_default_control_api.tsx similarity index 96% rename from examples/controls_example/public/react_controls/initialize_default_control_api.tsx rename to src/plugins/controls/public/react_controls/controls/initialize_default_control_api.tsx index cab0f2c46b003..d70cb822c346c 100644 --- a/examples/controls_example/public/react_controls/initialize_default_control_api.tsx +++ b/src/plugins/controls/public/react_controls/controls/initialize_default_control_api.tsx @@ -8,9 +8,9 @@ import { BehaviorSubject } from 'rxjs'; -import { ControlWidth } from '@kbn/controls-plugin/common'; import { SerializedPanelState } from '@kbn/presentation-containers'; import { StateComparators } from '@kbn/presentation-publishing'; +import { ControlWidth } from '../../../common'; import { ControlApiInitialization, diff --git a/examples/controls_example/public/react_controls/mocks/control_mocks.ts b/src/plugins/controls/public/react_controls/controls/mocks/control_mocks.ts similarity index 92% rename from examples/controls_example/public/react_controls/mocks/control_mocks.ts rename to src/plugins/controls/public/react_controls/controls/mocks/control_mocks.ts index fb484013f7ccc..d9aefc5331216 100644 --- a/examples/controls_example/public/react_controls/mocks/control_mocks.ts +++ b/src/plugins/controls/public/react_controls/controls/mocks/control_mocks.ts @@ -9,8 +9,8 @@ import { TimeRange } from '@kbn/es-query'; import { PublishesUnifiedSearch, StateComparators } from '@kbn/presentation-publishing'; import { BehaviorSubject } from 'rxjs'; -import { ControlFetchContext } from '../control_group/control_fetch/control_fetch'; -import { ControlGroupApi } from '../control_group/types'; +import { ControlFetchContext } from '../../control_group/control_fetch/control_fetch'; +import { ControlGroupApi } from '../../control_group/types'; import { ControlApiRegistration, ControlFactory, DefaultControlApi } from '../types'; export const getMockedControlGroupApi = ( diff --git a/examples/controls_example/public/react_controls/timeslider_control/components/index.scss b/src/plugins/controls/public/react_controls/controls/timeslider_control/components/index.scss similarity index 100% rename from examples/controls_example/public/react_controls/timeslider_control/components/index.scss rename to src/plugins/controls/public/react_controls/controls/timeslider_control/components/index.scss diff --git a/examples/controls_example/public/react_controls/timeslider_control/components/play_button.tsx b/src/plugins/controls/public/react_controls/controls/timeslider_control/components/play_button.tsx similarity index 100% rename from examples/controls_example/public/react_controls/timeslider_control/components/play_button.tsx rename to src/plugins/controls/public/react_controls/controls/timeslider_control/components/play_button.tsx diff --git a/examples/controls_example/public/react_controls/timeslider_control/components/time_slider_anchored_range.tsx b/src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_anchored_range.tsx similarity index 100% rename from examples/controls_example/public/react_controls/timeslider_control/components/time_slider_anchored_range.tsx rename to src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_anchored_range.tsx diff --git a/examples/controls_example/public/react_controls/timeslider_control/components/time_slider_popover_button.tsx b/src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_popover_button.tsx similarity index 100% rename from examples/controls_example/public/react_controls/timeslider_control/components/time_slider_popover_button.tsx rename to src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_popover_button.tsx diff --git a/examples/controls_example/public/react_controls/timeslider_control/components/time_slider_popover_content.tsx b/src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_popover_content.tsx similarity index 100% rename from examples/controls_example/public/react_controls/timeslider_control/components/time_slider_popover_content.tsx rename to src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_popover_content.tsx diff --git a/examples/controls_example/public/react_controls/timeslider_control/components/time_slider_prepend.tsx b/src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_prepend.tsx similarity index 100% rename from examples/controls_example/public/react_controls/timeslider_control/components/time_slider_prepend.tsx rename to src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_prepend.tsx diff --git a/examples/controls_example/public/react_controls/timeslider_control/components/time_slider_sliding_window_range.tsx b/src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_sliding_window_range.tsx similarity index 100% rename from examples/controls_example/public/react_controls/timeslider_control/components/time_slider_sliding_window_range.tsx rename to src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_sliding_window_range.tsx diff --git a/examples/controls_example/public/react_controls/timeslider_control/components/time_slider_strings.ts b/src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_strings.ts similarity index 100% rename from examples/controls_example/public/react_controls/timeslider_control/components/time_slider_strings.ts rename to src/plugins/controls/public/react_controls/controls/timeslider_control/components/time_slider_strings.ts diff --git a/examples/controls_example/public/react_controls/timeslider_control/get_time_range_meta.ts b/src/plugins/controls/public/react_controls/controls/timeslider_control/get_time_range_meta.ts similarity index 100% rename from examples/controls_example/public/react_controls/timeslider_control/get_time_range_meta.ts rename to src/plugins/controls/public/react_controls/controls/timeslider_control/get_time_range_meta.ts diff --git a/examples/controls_example/public/react_controls/timeslider_control/get_timeslider_control_factory.test.tsx b/src/plugins/controls/public/react_controls/controls/timeslider_control/get_timeslider_control_factory.test.tsx similarity index 100% rename from examples/controls_example/public/react_controls/timeslider_control/get_timeslider_control_factory.test.tsx rename to src/plugins/controls/public/react_controls/controls/timeslider_control/get_timeslider_control_factory.test.tsx diff --git a/examples/controls_example/public/react_controls/timeslider_control/get_timeslider_control_factory.tsx b/src/plugins/controls/public/react_controls/controls/timeslider_control/get_timeslider_control_factory.tsx similarity index 97% rename from examples/controls_example/public/react_controls/timeslider_control/get_timeslider_control_factory.tsx rename to src/plugins/controls/public/react_controls/controls/timeslider_control/get_timeslider_control_factory.tsx index 709166ca6fed4..f3d1b43de8fa2 100644 --- a/examples/controls_example/public/react_controls/timeslider_control/get_timeslider_control_factory.tsx +++ b/src/plugins/controls/public/react_controls/controls/timeslider_control/get_timeslider_control_factory.tsx @@ -19,13 +19,7 @@ import { ViewMode, } from '@kbn/presentation-publishing'; import { ControlFactory } from '../types'; -import { - TimesliderControlState, - TimesliderControlApi, - TIMESLIDER_CONTROL_TYPE, - Services, - Timeslice, -} from './types'; +import { TimesliderControlState, TimesliderControlApi, Services, Timeslice } from './types'; import { initializeDefaultControlApi } from '../initialize_default_control_api'; import { TimeSliderPopoverButton } from './components/time_slider_popover_button'; import { TimeSliderPopoverContent } from './components/time_slider_popover_content'; @@ -39,15 +33,16 @@ import { import { initTimeRangePercentage } from './init_time_range_percentage'; import './components/index.scss'; import { TimeSliderPrepend } from './components/time_slider_prepend'; +import { TIME_SLIDER_CONTROL } from '../../../../common'; export const getTimesliderControlFactory = ( services: Services ): ControlFactory => { return { - type: TIMESLIDER_CONTROL_TYPE, + type: TIME_SLIDER_CONTROL, getIconType: () => 'search', getDisplayName: () => - i18n.translate('controlsExamples.timesliderControl.displayName', { + i18n.translate('controls.timesliderControl.displayName', { defaultMessage: 'Time slider', }), buildControl: async (initialState, buildApi, uuid, controlGroupApi) => { diff --git a/examples/controls_example/public/react_controls/timeslider_control/init_time_range_percentage.ts b/src/plugins/controls/public/react_controls/controls/timeslider_control/init_time_range_percentage.ts similarity index 100% rename from examples/controls_example/public/react_controls/timeslider_control/init_time_range_percentage.ts rename to src/plugins/controls/public/react_controls/controls/timeslider_control/init_time_range_percentage.ts diff --git a/examples/controls_example/public/react_controls/timeslider_control/init_time_range_subscription.ts b/src/plugins/controls/public/react_controls/controls/timeslider_control/init_time_range_subscription.ts similarity index 100% rename from examples/controls_example/public/react_controls/timeslider_control/init_time_range_subscription.ts rename to src/plugins/controls/public/react_controls/controls/timeslider_control/init_time_range_subscription.ts diff --git a/src/plugins/controls/public/react_controls/controls/timeslider_control/register_timeslider_control.ts b/src/plugins/controls/public/react_controls/controls/timeslider_control/register_timeslider_control.ts new file mode 100644 index 0000000000000..6c74795051364 --- /dev/null +++ b/src/plugins/controls/public/react_controls/controls/timeslider_control/register_timeslider_control.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 type { CoreSetup } from '@kbn/core/public'; +import type { ControlsPluginStartDeps } from '../../../types'; +import { registerControlFactory } from '../../control_factory_registry'; +import { TIME_SLIDER_CONTROL } from '../../../../common'; + +export function registerTimeSliderControl(coreSetup: CoreSetup) { + registerControlFactory(TIME_SLIDER_CONTROL, async () => { + const [{ getTimesliderControlFactory }, [coreStart, depsStart]] = await Promise.all([ + import('./get_timeslider_control_factory'), + coreSetup.getStartServices(), + ]); + return getTimesliderControlFactory({ + core: coreStart, + data: depsStart.data, + }); + }); +} diff --git a/examples/controls_example/public/react_controls/timeslider_control/time_utils.tsx b/src/plugins/controls/public/react_controls/controls/timeslider_control/time_utils.tsx similarity index 100% rename from examples/controls_example/public/react_controls/timeslider_control/time_utils.tsx rename to src/plugins/controls/public/react_controls/controls/timeslider_control/time_utils.tsx diff --git a/examples/controls_example/public/react_controls/timeslider_control/types.ts b/src/plugins/controls/public/react_controls/controls/timeslider_control/types.ts similarity index 94% rename from examples/controls_example/public/react_controls/timeslider_control/types.ts rename to src/plugins/controls/public/react_controls/controls/timeslider_control/types.ts index 38dbf4572bbe2..bc5fcd67829c2 100644 --- a/examples/controls_example/public/react_controls/timeslider_control/types.ts +++ b/src/plugins/controls/public/react_controls/controls/timeslider_control/types.ts @@ -11,8 +11,6 @@ import { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { PublishesTimeslice } from '@kbn/presentation-publishing'; import type { DefaultControlApi, DefaultControlState } from '../types'; -export const TIMESLIDER_CONTROL_TYPE = 'timesliderControl'; - export type Timeslice = [number, number]; export interface TimesliderControlState extends DefaultControlState { diff --git a/examples/controls_example/public/react_controls/types.ts b/src/plugins/controls/public/react_controls/controls/types.ts similarity index 95% rename from examples/controls_example/public/react_controls/types.ts rename to src/plugins/controls/public/react_controls/controls/types.ts index c16333268441e..d89db77e1f53b 100644 --- a/examples/controls_example/public/react_controls/types.ts +++ b/src/plugins/controls/public/react_controls/controls/types.ts @@ -8,7 +8,6 @@ import { BehaviorSubject } from 'rxjs'; -import { CanClearSelections, ControlWidth } from '@kbn/controls-plugin/public/types'; import { SerializedPanelState } from '@kbn/presentation-containers'; import { PanelCompatibleComponent } from '@kbn/presentation-panel-plugin/public/panel_component/types'; import { @@ -23,8 +22,9 @@ import { PublishingSubject, StateComparators, } from '@kbn/presentation-publishing'; +import { CanClearSelections, ControlWidth } from '../../types'; -import { ControlGroupApi } from './control_group/types'; +import { ControlGroupApi } from '../control_group/types'; export interface PublishesControlDisplaySettings { grow: PublishingSubject; diff --git a/src/plugins/controls/tsconfig.json b/src/plugins/controls/tsconfig.json index 2fc9038dafe6c..053e17696dc32 100644 --- a/src/plugins/controls/tsconfig.json +++ b/src/plugins/controls/tsconfig.json @@ -40,7 +40,11 @@ "@kbn/shared-ux-markdown", "@kbn/react-kibana-context-render", "@kbn/presentation-containers", - "@kbn/presentation-publishing" + "@kbn/presentation-publishing", + "@kbn/content-management-utils", + "@kbn/core-lifecycle-browser", + "@kbn/field-formats-plugin", + "@kbn/presentation-panel-plugin" ], "exclude": ["target/**/*"] } diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.test.tsx b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.test.tsx index b7b52630f45d9..f7bd63bbcbb55 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.test.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.test.tsx @@ -136,7 +136,7 @@ const mockCalcFieldCounts = jest.fn(() => { return mockfieldCounts; }); -jest.mock('../../utils/calc_field_counts', () => ({ +jest.mock('@kbn/discover-utils/src/utils/calc_field_counts', () => ({ calcFieldCounts: () => mockCalcFieldCounts(), })); diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.tsx b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.tsx index 187a946892d1f..fa8128c0b95ec 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.tsx @@ -21,10 +21,10 @@ import { type UnifiedFieldListSidebarContainerApi, FieldsGroupNames, } from '@kbn/unified-field-list'; +import { calcFieldCounts } from '@kbn/discover-utils/src/utils/calc_field_counts'; import { PLUGIN_ID } from '../../../../../common'; import { useDiscoverServices } from '../../../../hooks/use_discover_services'; import { DataDocuments$ } from '../../state_management/discover_data_state_container'; -import { calcFieldCounts } from '../../utils/calc_field_counts'; import { FetchStatus, SidebarToggleState } from '../../../types'; import { DISCOVER_TOUR_STEP_ANCHOR_IDS } from '../../../../components/discover_tour'; import { diff --git a/src/plugins/discover/public/application/main/state_management/utils/get_esql_data_view.test.ts b/src/plugins/discover/public/application/main/state_management/utils/get_esql_data_view.test.ts index 8dc7c046b02ce..990c74fd712fd 100644 --- a/src/plugins/discover/public/application/main/state_management/utils/get_esql_data_view.test.ts +++ b/src/plugins/discover/public/application/main/state_management/utils/get_esql_data_view.test.ts @@ -32,7 +32,7 @@ describe('getEsqlDataView', () => { }); it('returns an adhoc dataview if it is adhoc with named params and query index pattern is the same as the dataview index pattern', async () => { - const query = { esql: 'from data-view-ad-hoc-title | where time >= ?start' }; + const query = { esql: 'from data-view-ad-hoc-title | where time >= ?t_start' }; const dataView = await getEsqlDataView(query, dataViewAdHocNoAtTimestamp, services); expect(dataView.timeFieldName).toBe('time'); }); diff --git a/src/plugins/discover/server/ui_settings.ts b/src/plugins/discover/server/ui_settings.ts index 5e66e1f2252d1..83a8240be0e49 100644 --- a/src/plugins/discover/server/ui_settings.ts +++ b/src/plugins/discover/server/ui_settings.ts @@ -28,6 +28,7 @@ import { MAX_DOC_FIELDS_DISPLAYED, SHOW_MULTIFIELDS, TRUNCATE_MAX_HEIGHT, + TRUNCATE_MAX_HEIGHT_DEFAULT_VALUE, SHOW_FIELD_STATISTICS, ROW_HEIGHT_OPTION, } from '@kbn/discover-utils'; @@ -318,7 +319,7 @@ export const getUiSettings: ( name: i18n.translate('discover.advancedSettings.params.maxCellHeightTitle', { defaultMessage: 'Maximum cell height in the classic table', }), - value: 115, + value: TRUNCATE_MAX_HEIGHT_DEFAULT_VALUE, category: ['discover'], description: i18n.translate('discover.advancedSettings.params.maxCellHeightText', { defaultMessage: @@ -326,5 +327,11 @@ export const getUiSettings: ( }), schema: schema.number({ min: 0 }), requiresPageReload: true, + deprecation: { + message: i18n.translate('discover.advancedSettings.discover.maxCellHeightDeprecation', { + defaultMessage: 'This setting is deprecated and will be removed in Kibana 9.0.', + }), + docLinksKey: 'discoverSettings', + }, }, }); diff --git a/src/plugins/unified_doc_viewer/public/__mocks__/services.ts b/src/plugins/unified_doc_viewer/public/__mocks__/services.ts index 5e7222f261532..81e2f084282f7 100644 --- a/src/plugins/unified_doc_viewer/public/__mocks__/services.ts +++ b/src/plugins/unified_doc_viewer/public/__mocks__/services.ts @@ -8,6 +8,7 @@ import { analyticsServiceMock } from '@kbn/core-analytics-browser-mocks'; import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; +import { coreMock } from '@kbn/core/public/mocks'; import { fieldFormatsMock } from '@kbn/field-formats-plugin/common/mocks'; import { fieldsMetadataPluginPublicMock } from '@kbn/fields-metadata-plugin/public/mocks'; import { uiSettingsServiceMock } from '@kbn/core-ui-settings-browser-mocks'; @@ -29,4 +30,5 @@ export const mockUnifiedDocViewerServices: jest.Mocked uiSettings: uiSettingsServiceMock.createStartContract(), unifiedDocViewer: mockUnifiedDocViewer, share: sharePluginMock.createStartContract(), + core: coreMock.createStart(), }; diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/legacy/table_columns.tsx b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/legacy/table_columns.tsx index 4b79a84970698..769fe008c120c 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/legacy/table_columns.tsx +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/legacy/table_columns.tsx @@ -105,6 +105,8 @@ export const MAIN_COLUMNS: Array> = [ formattedValue={formattedValue} rawValue={flattenedField} ignoreReason={ignored} + isDetails={false} + isLegacy={true} /> ); }, diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table.tsx b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table.tsx index 283c00eabae27..64659877910a7 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table.tsx +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table.tsx @@ -13,7 +13,6 @@ import useLocalStorage from 'react-use/lib/useLocalStorage'; import { EuiFlexGroup, EuiFlexItem, - EuiFieldSearch, EuiSpacer, EuiSelectableMessage, EuiDataGrid, @@ -28,7 +27,6 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { css } from '@emotion/react'; -import { debounce } from 'lodash'; import { Storage } from '@kbn/kibana-utils-plugin/public'; import { getFieldIconType } from '@kbn/field-utils/src/utils/get_field_icon_type'; import { @@ -39,16 +37,9 @@ import { isNestedFieldParent, usePager, } from '@kbn/discover-utils'; -import { - FieldDescription, - fieldNameWildcardMatcher, - getFieldSearchMatchingHighlight, - getTextBasedColumnIconType, -} from '@kbn/field-utils'; +import { getTextBasedColumnIconType } from '@kbn/field-utils'; import type { DocViewRenderProps } from '@kbn/unified-doc-viewer/types'; -import { FieldName } from '@kbn/unified-doc-viewer'; import { getUnifiedDocViewerServices } from '../../plugin'; -import { TableFieldValue } from './table_cell_value'; import { type TableRow, getFieldCellActions, @@ -60,12 +51,15 @@ import { DEFAULT_MARGIN_BOTTOM, getTabContentAvailableHeight, } from '../doc_viewer_source/get_height'; +import { TableFilters, TableFiltersProps, useTableFilters } from './table_filters'; +import { TableCell } from './table_cell'; export type FieldRecord = TableRow; interface ItemsEntry { pinnedItems: FieldRecord[]; restItems: FieldRecord[]; + allFields: TableFiltersProps['allFields']; } const MIN_NAME_COLUMN_WIDTH = 150; @@ -74,7 +68,6 @@ const PAGE_SIZE_OPTIONS = [25, 50, 100, 250, 500]; const DEFAULT_PAGE_SIZE = 25; const PINNED_FIELDS_KEY = 'discover:pinnedFields'; const PAGE_SIZE = 'discover:pageSize'; -const SEARCH_TEXT = 'discover:searchText'; const HIDE_NULL_VALUES = 'unifiedDocViewer:hideNullValues'; const GRID_COLUMN_FIELD_NAME = 'name'; @@ -126,14 +119,6 @@ const updatePageSize = (newPageSize: number, storage: Storage) => { storage.set(PAGE_SIZE, newPageSize); }; -const getSearchText = (storage: Storage) => { - return storage.get(SEARCH_TEXT) || ''; -}; -const updateSearchText = debounce( - (newSearchText: string, storage: Storage) => storage.set(SEARCH_TEXT, newSearchText), - 500 -); - export const DocViewerTable = ({ columns, columnsMeta, @@ -147,11 +132,10 @@ export const DocViewerTable = ({ }: DocViewRenderProps) => { const isEsqlMode = Array.isArray(textBasedHits); const [containerRef, setContainerRef] = useState(null); - const { fieldFormats, storage, uiSettings, fieldsMetadata } = getUnifiedDocViewerServices(); + const { fieldFormats, storage, uiSettings } = getUnifiedDocViewerServices(); const showMultiFields = uiSettings.get(SHOW_MULTIFIELDS); const currentDataViewId = dataView.id!; - const [searchText, setSearchText] = useState(getSearchText(storage)); const [pinnedFields, setPinnedFields] = useState( getPinnedFields(currentDataViewId, storage) ); @@ -165,10 +149,6 @@ export const DocViewerTable = ({ [flattened, dataView, showMultiFields] ); - const searchPlaceholder = i18n.translate('unifiedDocViewer.docView.table.searchPlaceHolder', { - defaultMessage: 'Search field names', - }); - const mapping = useCallback((name: string) => dataView.fields.getByName(name), [dataView.fields]); const onToggleColumn = useMemo(() => { @@ -196,14 +176,7 @@ export const DocViewerTable = ({ [currentDataViewId, pinnedFields, storage] ); - const onSearch = useCallback( - (event: React.ChangeEvent) => { - const newSearchText = event.currentTarget.value; - updateSearchText(newSearchText, storage); - setSearchText(newSearchText); - }, - [storage] - ); + const { onFilterField, ...tableFiltersProps } = useTableFilters(storage); const fieldToItem = useCallback( (field: string, isPinned: boolean) => { @@ -261,47 +234,64 @@ export const DocViewerTable = ({ ] ); - const { pinnedItems, restItems } = Object.keys(flattened) - .sort((fieldA, fieldB) => { - const mappingA = mapping(fieldA); - const mappingB = mapping(fieldB); - const nameA = !mappingA || !mappingA.displayName ? fieldA : mappingA.displayName; - const nameB = !mappingB || !mappingB.displayName ? fieldB : mappingB.displayName; - return nameA.localeCompare(nameB); - }) - .reduce( - (acc, curFieldName) => { - if (!shouldShowFieldHandler(curFieldName)) { - return acc; - } - const shouldHideNullValue = - areNullValuesHidden && flattened[curFieldName] == null && isEsqlMode; - if (shouldHideNullValue) { - return acc; - } - if (pinnedFields.includes(curFieldName)) { - acc.pinnedItems.push(fieldToItem(curFieldName, true)); - } else { - const fieldMapping = mapping(curFieldName); - if ( - !searchText?.trim() || - fieldNameWildcardMatcher( - { name: curFieldName, displayName: fieldMapping?.displayName }, - searchText - ) - ) { - // filter only unpinned fields - acc.restItems.push(fieldToItem(curFieldName, false)); + const { pinnedItems, restItems, allFields } = useMemo( + () => + Object.keys(flattened) + .sort((fieldA, fieldB) => { + const mappingA = mapping(fieldA); + const mappingB = mapping(fieldB); + const nameA = !mappingA || !mappingA.displayName ? fieldA : mappingA.displayName; + const nameB = !mappingB || !mappingB.displayName ? fieldB : mappingB.displayName; + return nameA.localeCompare(nameB); + }) + .reduce( + (acc, curFieldName) => { + if (!shouldShowFieldHandler(curFieldName)) { + return acc; + } + const shouldHideNullValue = + areNullValuesHidden && flattened[curFieldName] == null && isEsqlMode; + if (shouldHideNullValue) { + return acc; + } + + const isPinned = pinnedFields.includes(curFieldName); + const row = fieldToItem(curFieldName, isPinned); + + if (isPinned) { + acc.pinnedItems.push(row); + } else { + if (onFilterField(curFieldName, row.field.displayName, row.field.fieldType)) { + // filter only unpinned fields + acc.restItems.push(row); + } + } + + acc.allFields.push({ + name: curFieldName, + displayName: row.field.displayName, + type: row.field.fieldType, + }); + + return acc; + }, + { + pinnedItems: [], + restItems: [], + allFields: [], } - } - - return acc; - }, - { - pinnedItems: [], - restItems: [], - } - ); + ), + [ + areNullValuesHidden, + fieldToItem, + flattened, + isEsqlMode, + mapping, + onFilterField, + pinnedFields, + shouldShowFieldHandler, + ] + ); const rows = useMemo(() => [...pinnedItems, ...restItems], [pinnedItems, restItems]); @@ -380,60 +370,17 @@ export const DocViewerTable = ({ const renderCellValue: EuiDataGridProps['renderCellValue'] = useCallback( ({ rowIndex, columnId, isDetails }) => { - const row = rows[rowIndex]; - - if (!row) { - return null; - } - - const { - action: { flattenedField }, - field: { field, fieldMapping, fieldType, scripted, pinned }, - value: { formattedValue, ignored }, - } = row; - - if (columnId === 'name') { - return ( -
- - - {isDetails && !!fieldMapping ? ( -
- -
- ) : null} -
- ); - } - - if (columnId === 'value') { - return ( - - ); - } - - return null; + return ( + + ); }, - [rows, searchText, fieldsMetadata] + [rows, tableFiltersProps.searchTerm] ); const renderCellPopover = useCallback( @@ -489,14 +436,7 @@ export const DocViewerTable = ({
- + {rows.length === 0 ? ( @@ -540,6 +480,7 @@ export const DocViewerTable = ({ `} > = React.memo( + ({ searchTerm, rows, rowIndex, columnId, isDetails }) => { + const { fieldsMetadata } = getUnifiedDocViewerServices(); + + const row = rows[rowIndex]; + + if (!row) { + return null; + } + + const { + action: { flattenedField }, + field: { field, fieldMapping, fieldType, scripted, pinned }, + value: { formattedValue, ignored }, + } = row; + + if (columnId === 'name') { + return ( +
+ + + {isDetails && !!fieldMapping ? ( +
+ +
+ ) : null} +
+ ); + } + + if (columnId === 'value') { + return ( + + ); + } + + return null; + } +); diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table_cell_value.test.tsx b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table_cell_value.test.tsx new file mode 100644 index 0000000000000..e70c0903fe1ee --- /dev/null +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table_cell_value.test.tsx @@ -0,0 +1,216 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import { TRUNCATE_MAX_HEIGHT, TRUNCATE_MAX_HEIGHT_DEFAULT_VALUE } from '@kbn/discover-utils'; +import type { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; +import { TableFieldValue } from './table_cell_value'; +import { setUnifiedDocViewerServices } from '../../plugin'; +import { mockUnifiedDocViewerServices } from '../../__mocks__'; + +const mockServices = { + ...mockUnifiedDocViewerServices, +}; + +let mockTruncateMaxHeightSetting: number | undefined; +mockServices.uiSettings.get = ((key: string) => { + if (key === TRUNCATE_MAX_HEIGHT) { + return mockTruncateMaxHeightSetting ?? TRUNCATE_MAX_HEIGHT_DEFAULT_VALUE; + } + return; +}) as IUiSettingsClient['get']; + +setUnifiedDocViewerServices(mockUnifiedDocViewerServices); + +let mockScrollHeight = 0; +jest.spyOn(HTMLElement.prototype, 'scrollHeight', 'get').mockImplementation(() => mockScrollHeight); + +describe('TableFieldValue', () => { + afterEach(() => { + mockScrollHeight = 0; + mockTruncateMaxHeightSetting = undefined; + }); + + it('should render correctly', async () => { + mockScrollHeight = 10; + + render( + + ); + + expect(screen.getByText('100,000')).toBeInTheDocument(); + expect(screen.queryByTestId('toggleLongFieldValue-bytes')).toBeNull(); + }); + + it('should truncate a long value correctly', async () => { + mockScrollHeight = 1000; + + const value = 'long value'.repeat(300); + render( + + ); + + expect(screen.getByText(value)).toBeInTheDocument(); + + let toggleButton = screen.getByTestId('toggleLongFieldValue-message'); + expect(toggleButton).toBeInTheDocument(); + expect(toggleButton.getAttribute('aria-expanded')).toBe('false'); + + let valueElement = screen.getByTestId('tableDocViewRow-message-value'); + expect(valueElement.getAttribute('css')).toBeDefined(); + expect(valueElement.classList.contains('kbnDocViewer__value--truncated')).toBe(true); + + toggleButton.click(); + + toggleButton = screen.getByTestId('toggleLongFieldValue-message'); + expect(toggleButton).toBeInTheDocument(); + expect(toggleButton.getAttribute('aria-expanded')).toBe('true'); + + valueElement = screen.getByTestId('tableDocViewRow-message-value'); + expect(valueElement.getAttribute('css')).toBeNull(); + expect(valueElement.classList.contains('kbnDocViewer__value--truncated')).toBe(false); + + toggleButton.click(); + + toggleButton = screen.getByTestId('toggleLongFieldValue-message'); + expect(toggleButton).toBeInTheDocument(); + expect(toggleButton.getAttribute('aria-expanded')).toBe('false'); + + valueElement = screen.getByTestId('tableDocViewRow-message-value'); + expect(valueElement.getAttribute('css')).toBeDefined(); + expect(valueElement.classList.contains('kbnDocViewer__value--truncated')).toBe(true); + }); + + it('should not truncate a long value when inside a popover', async () => { + mockScrollHeight = 1000; + + const value = 'long value'.repeat(300); + render( + + ); + + expect(screen.getByText(value)).toBeInTheDocument(); + expect(screen.queryByTestId('toggleLongFieldValue-message')).toBeNull(); + + const valueElement = screen.getByTestId('tableDocViewRow-message-value'); + expect(valueElement.getAttribute('css')).toBeNull(); + expect(valueElement.classList.contains('kbnDocViewer__value--truncated')).toBe(false); + }); + + it('should truncate a long value in legacy table correctly', async () => { + mockScrollHeight = 1000; + + const value = 'long value'.repeat(300); + render( + + ); + + expect(screen.getByText(value)).toBeInTheDocument(); + + let toggleButton = screen.getByTestId('toggleLongFieldValue-message'); + expect(toggleButton).toBeInTheDocument(); + expect(toggleButton.getAttribute('aria-expanded')).toBe('false'); + + let valueElement = screen.getByTestId('tableDocViewRow-message-value'); + expect(valueElement.getAttribute('css')).toBeDefined(); + expect(valueElement.classList.contains('kbnDocViewer__value--truncated')).toBe(true); + + toggleButton.click(); + + toggleButton = screen.getByTestId('toggleLongFieldValue-message'); + expect(toggleButton).toBeInTheDocument(); + expect(toggleButton.getAttribute('aria-expanded')).toBe('true'); + + valueElement = screen.getByTestId('tableDocViewRow-message-value'); + expect(valueElement.getAttribute('css')).toBeNull(); + expect(valueElement.classList.contains('kbnDocViewer__value--truncated')).toBe(false); + + toggleButton.click(); + + toggleButton = screen.getByTestId('toggleLongFieldValue-message'); + expect(toggleButton).toBeInTheDocument(); + expect(toggleButton.getAttribute('aria-expanded')).toBe('false'); + + valueElement = screen.getByTestId('tableDocViewRow-message-value'); + expect(valueElement.getAttribute('css')).toBeDefined(); + expect(valueElement.classList.contains('kbnDocViewer__value--truncated')).toBe(true); + }); + + it('should not truncate a long value in legacy table if limit is not reached', async () => { + mockScrollHeight = 112; + + const value = 'long value'.repeat(300); + render( + + ); + + expect(screen.getByText(value)).toBeInTheDocument(); + expect(screen.queryByTestId('toggleLongFieldValue-message')).toBeNull(); + + const valueElement = screen.getByTestId('tableDocViewRow-message-value'); + expect(valueElement.getAttribute('css')).toBeNull(); + expect(valueElement.classList.contains('kbnDocViewer__value--truncated')).toBe(false); + }); + + it('should not truncate a long value in legacy table if setting is 0', async () => { + mockScrollHeight = 1000; + mockTruncateMaxHeightSetting = 0; + + const value = 'long value'.repeat(300); + render( + + ); + + expect(screen.getByText(value)).toBeInTheDocument(); + expect(screen.queryByTestId('toggleLongFieldValue-message')).toBeNull(); + + const valueElement = screen.getByTestId('tableDocViewRow-message-value'); + expect(valueElement.getAttribute('css')).toBeNull(); + expect(valueElement.classList.contains('kbnDocViewer__value--truncated')).toBe(false); + }); +}); diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table_cell_value.tsx b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table_cell_value.tsx index 79c79e6a45836..3072d5ac7f4d7 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table_cell_value.tsx +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table_cell_value.tsx @@ -7,12 +7,27 @@ */ import { css } from '@emotion/react'; -import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiTextColor, EuiToolTip } from '@elastic/eui'; -import classNames from 'classnames'; -import React, { Fragment } from 'react'; +import { + EuiButtonIcon, + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiTextColor, + EuiToolTip, + useEuiTheme, + useResizeObserver, +} from '@elastic/eui'; +import classnames from 'classnames'; +import React, { Fragment, useCallback, useState } from 'react'; import { i18n } from '@kbn/i18n'; -import { IgnoredReason } from '@kbn/discover-utils'; +import { IgnoredReason, TRUNCATE_MAX_HEIGHT } from '@kbn/discover-utils'; import { FieldRecord } from './table'; +import { getUnifiedDocViewerServices } from '../../plugin'; + +const DOC_VIEWER_DEFAULT_TRUNCATE_MAX_HEIGHT = 110; + +// Keep in memory what field values were expanded by the user and restore this state when the user opens DocViewer again +const expandedFieldValuesSet = new Set(); interface IgnoreWarningProps { reason: IgnoredReason; @@ -84,6 +99,8 @@ type TableFieldValueProps = Pick & { formattedValue: FieldRecord['value']['formattedValue']; rawValue: unknown; ignoreReason?: IgnoredReason; + isDetails?: boolean; // true when inside EuiDataGrid cell popover + isLegacy?: boolean; // true when inside legacy table }; export const TableFieldValue = ({ @@ -91,29 +108,109 @@ export const TableFieldValue = ({ field, rawValue, ignoreReason, + isDetails, + isLegacy, }: TableFieldValueProps) => { - const valueClassName = classNames({ - // eslint-disable-next-line @typescript-eslint/naming-convention - kbnDocViewer__value: true, + const { euiTheme } = useEuiTheme(); + const { uiSettings } = getUnifiedDocViewerServices(); + const truncationHeight = isLegacy + ? uiSettings.get(TRUNCATE_MAX_HEIGHT) + : DOC_VIEWER_DEFAULT_TRUNCATE_MAX_HEIGHT; + + const [containerRef, setContainerRef] = useState(null); + useResizeObserver(containerRef); + const containerScrollHeight = containerRef?.scrollHeight ?? 0; + + const [isValueExpanded, setIsValueExpanded] = useState(expandedFieldValuesSet.has(field)); + const isCollapsible = + !isDetails && + Boolean(rawValue) && + truncationHeight > 0 && + containerScrollHeight > 0 && + containerScrollHeight > truncationHeight; + const isCollapsed = isCollapsible && !isValueExpanded; + + const onToggleCollapse = useCallback( + () => + setIsValueExpanded((isExpandedPrev) => { + const isExpandedNext = !isExpandedPrev; + if (isExpandedNext) { + expandedFieldValuesSet.add(field); + } else { + expandedFieldValuesSet.delete(field); + } + return isExpandedNext; + }), + [field, setIsValueExpanded] + ); + + const toggleButtonLabel = isCollapsed + ? i18n.translate('unifiedDocViewer.docViews.table.viewMoreButton', { + defaultMessage: 'View more', + }) + : i18n.translate('unifiedDocViewer.docViews.table.viewLessButton', { + defaultMessage: 'View less', + }); + + const shouldTruncate = isCollapsible && isCollapsed; + const valueElementId = `tableDocViewRow-${field}-value`; + + const valueClasses = classnames('kbnDocViewer__value', { + 'kbnDocViewer__value--truncated': shouldTruncate, }); + return ( {ignoreReason && ( - {ignoreReason && ( - - - - )} + + + )} -
+ + {isCollapsible && ( + + + + )} + +
+ + ); }; diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table_filters.tsx b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table_filters.tsx new file mode 100644 index 0000000000000..0a030336571e8 --- /dev/null +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table_filters.tsx @@ -0,0 +1,171 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useCallback, useState, useMemo } from 'react'; +import { EuiFieldSearch } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { Storage } from '@kbn/kibana-utils-plugin/public'; +import { debounce } from 'lodash'; +import { fieldNameWildcardMatcher, type FieldTypeKnown } from '@kbn/field-utils'; +import type { FieldListItem } from '@kbn/unified-field-list'; +import { + FieldTypeFilter, + type FieldTypeFilterProps, +} from '@kbn/unified-field-list/src/components/field_list_filters/field_type_filter'; +import { getUnifiedDocViewerServices } from '../../plugin'; + +export const LOCAL_STORAGE_KEY_SEARCH_TERM = 'discover:searchText'; +export const LOCAL_STORAGE_KEY_SELECTED_FIELD_TYPES = 'unifiedDocViewer:selectedFieldTypes'; + +const searchPlaceholder = i18n.translate('unifiedDocViewer.docView.table.searchPlaceHolder', { + defaultMessage: 'Search field names', +}); + +interface TableFiltersCommonProps { + // search + searchTerm: string; + onChangeSearchTerm: (searchTerm: string) => void; + // field types + selectedFieldTypes: FieldTypeFilterProps['selectedFieldTypes']; + onChangeFieldTypes: FieldTypeFilterProps['onChange']; +} + +export interface TableFiltersProps extends TableFiltersCommonProps { + allFields: FieldListItem[]; +} + +export const TableFilters: React.FC = ({ + searchTerm, + onChangeSearchTerm, + selectedFieldTypes, + onChangeFieldTypes, + allFields, +}) => { + const { core } = getUnifiedDocViewerServices(); + + const onSearchTermChange = useCallback( + (event: React.ChangeEvent) => { + const newSearchTerm = event.currentTarget.value; + onChangeSearchTerm(newSearchTerm); + }, + [onChangeSearchTerm] + ); + + return ( + + ) : undefined + } + /> + ); +}; + +const persistSearchTerm = debounce( + (newSearchText: string, storage: Storage) => + storage.set(LOCAL_STORAGE_KEY_SEARCH_TERM, newSearchText), + 500, + { leading: true, trailing: true } +); + +const persistSelectedFieldTypes = debounce( + (selectedFieldTypes: FieldTypeKnown[], storage: Storage) => + storage.set(LOCAL_STORAGE_KEY_SELECTED_FIELD_TYPES, JSON.stringify(selectedFieldTypes)), + 500, + { leading: true, trailing: true } +); + +const getStoredFieldTypes = (storage: Storage) => { + const storedFieldTypes = storage.get(LOCAL_STORAGE_KEY_SELECTED_FIELD_TYPES); + let parsedFieldTypes: FieldTypeKnown[] = []; + + try { + parsedFieldTypes = storedFieldTypes ? JSON.parse(storedFieldTypes) : []; + } catch { + // ignore invalid JSON + } + + return Array.isArray(parsedFieldTypes) ? parsedFieldTypes : []; +}; + +interface UseTableFiltersReturn extends TableFiltersCommonProps { + onFilterField: ( + fieldName: string, + fieldDisplayName: string | undefined, + fieldType: string | undefined + ) => boolean; +} + +export const useTableFilters = (storage: Storage): UseTableFiltersReturn => { + const [searchTerm, setSearchTerm] = useState(storage.get(LOCAL_STORAGE_KEY_SEARCH_TERM) || ''); + const [selectedFieldTypes, setSelectedFieldTypes] = useState( + getStoredFieldTypes(storage) + ); + + const onChangeSearchTerm = useCallback( + (newSearchTerm: string) => { + setSearchTerm(newSearchTerm); + persistSearchTerm(newSearchTerm, storage); + }, + [storage, setSearchTerm] + ); + + const onChangeFieldTypes = useCallback( + (newFieldTypes: FieldTypeKnown[]) => { + setSelectedFieldTypes(newFieldTypes); + persistSelectedFieldTypes(newFieldTypes, storage); + }, + [storage, setSelectedFieldTypes] + ); + + const onFilterField: UseTableFiltersReturn['onFilterField'] = useCallback( + (fieldName, fieldDisplayName, fieldType) => { + const term = searchTerm?.trim(); + if ( + term && + !fieldNameWildcardMatcher({ name: fieldName, displayName: fieldDisplayName }, term) + ) { + return false; + } + + if (selectedFieldTypes.length > 0 && fieldType) { + return selectedFieldTypes.includes(fieldType); + } + + return true; + }, + [searchTerm, selectedFieldTypes] + ); + + return useMemo( + () => ({ + // props for TableFilters component + searchTerm, + onChangeSearchTerm, + selectedFieldTypes, + onChangeFieldTypes, + // the actual filtering function + onFilterField, + }), + [searchTerm, onChangeSearchTerm, selectedFieldTypes, onChangeFieldTypes, onFilterField] + ); +}; diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/test_filters.test.ts b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/test_filters.test.ts new file mode 100644 index 0000000000000..77895ab4f9179 --- /dev/null +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/test_filters.test.ts @@ -0,0 +1,128 @@ +/* + * 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 { renderHook, act } from '@testing-library/react-hooks'; +import { Storage } from '@kbn/kibana-utils-plugin/public'; +import { + useTableFilters, + LOCAL_STORAGE_KEY_SEARCH_TERM, + LOCAL_STORAGE_KEY_SELECTED_FIELD_TYPES, +} from './table_filters'; + +const storage = new Storage(window.localStorage); + +describe('useTableFilters', () => { + beforeAll(() => { + jest.useFakeTimers(); + }); + afterAll(() => { + jest.useRealTimers(); + }); + + afterEach(() => { + storage.clear(); + }); + + it('should return initial search term and field types', () => { + const { result } = renderHook(() => useTableFilters(storage)); + + expect(result.current.searchTerm).toBe(''); + expect(result.current.selectedFieldTypes).toEqual([]); + expect(result.current.onFilterField('extension', undefined, 'keyword')).toBe(true); + expect(result.current.onFilterField('bytes', undefined, 'number')).toBe(true); + + expect(storage.get(LOCAL_STORAGE_KEY_SEARCH_TERM)).toBeNull(); + }); + + it('should filter by search term', () => { + const { result } = renderHook(() => useTableFilters(storage)); + + act(() => { + result.current.onChangeSearchTerm('ext'); + }); + + expect(result.current.onFilterField('extension', undefined, 'keyword')).toBe(true); + expect(result.current.onFilterField('bytes', undefined, 'number')).toBe(false); + + expect(storage.get(LOCAL_STORAGE_KEY_SEARCH_TERM)).toBe('ext'); + }); + + it('should filter by field type', () => { + const { result } = renderHook(() => useTableFilters(storage)); + + act(() => { + result.current.onChangeFieldTypes(['number']); + }); + + expect(result.current.onFilterField('extension', undefined, 'keyword')).toBe(false); + expect(result.current.onFilterField('bytes', undefined, 'number')).toBe(true); + + act(() => { + result.current.onChangeFieldTypes(['keyword']); + }); + + expect(result.current.onFilterField('extension', undefined, 'keyword')).toBe(true); + expect(result.current.onFilterField('bytes', undefined, 'number')).toBe(false); + + act(() => { + result.current.onChangeFieldTypes(['number', 'keyword']); + }); + + expect(result.current.onFilterField('extension', undefined, 'keyword')).toBe(true); + expect(result.current.onFilterField('bytes', undefined, 'number')).toBe(true); + + jest.advanceTimersByTime(600); + expect(storage.get(LOCAL_STORAGE_KEY_SELECTED_FIELD_TYPES)).toBe('["number","keyword"]'); + }); + + it('should filter by search term and field type', () => { + const { result } = renderHook(() => useTableFilters(storage)); + + act(() => { + result.current.onChangeSearchTerm('ext'); + result.current.onChangeFieldTypes(['keyword']); + }); + + expect(result.current.onFilterField('extension', undefined, 'keyword')).toBe(true); + expect(result.current.onFilterField('bytes', undefined, 'number')).toBe(false); + + act(() => { + result.current.onChangeSearchTerm('ext'); + result.current.onChangeFieldTypes(['number']); + }); + + expect(result.current.onFilterField('extension', undefined, 'keyword')).toBe(false); + expect(result.current.onFilterField('bytes', undefined, 'number')).toBe(false); + + act(() => { + result.current.onChangeSearchTerm('bytes'); + result.current.onChangeFieldTypes(['number']); + }); + + expect(result.current.onFilterField('extension', undefined, 'keyword')).toBe(false); + expect(result.current.onFilterField('bytes', undefined, 'number')).toBe(true); + + jest.advanceTimersByTime(600); + expect(storage.get(LOCAL_STORAGE_KEY_SEARCH_TERM)).toBe('bytes'); + expect(storage.get(LOCAL_STORAGE_KEY_SELECTED_FIELD_TYPES)).toBe('["number"]'); + }); + + it('should restore previous filters', () => { + storage.set(LOCAL_STORAGE_KEY_SEARCH_TERM, 'bytes'); + storage.set(LOCAL_STORAGE_KEY_SELECTED_FIELD_TYPES, '["number"]'); + + const { result } = renderHook(() => useTableFilters(storage)); + + expect(result.current.searchTerm).toBe('bytes'); + expect(result.current.selectedFieldTypes).toEqual(['number']); + + expect(result.current.onFilterField('extension', undefined, 'keyword')).toBe(false); + expect(result.current.onFilterField('bytes', undefined, 'number')).toBe(true); + expect(result.current.onFilterField('bytes_counter', undefined, 'counter')).toBe(false); + }); +}); diff --git a/src/plugins/unified_doc_viewer/public/plugin.tsx b/src/plugins/unified_doc_viewer/public/plugin.tsx index e8a23342e7976..d1e9d1cb86b18 100644 --- a/src/plugins/unified_doc_viewer/public/plugin.tsx +++ b/src/plugins/unified_doc_viewer/public/plugin.tsx @@ -120,6 +120,7 @@ export class UnifiedDocViewerPublicPlugin uiSettings, unifiedDocViewer, share, + core, }; setUnifiedDocViewerServices(services); return unifiedDocViewer; diff --git a/src/plugins/unified_doc_viewer/public/types.ts b/src/plugins/unified_doc_viewer/public/types.ts index 9266328306aaf..42a562944c1e1 100644 --- a/src/plugins/unified_doc_viewer/public/types.ts +++ b/src/plugins/unified_doc_viewer/public/types.ts @@ -5,10 +5,12 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ + export type { JsonCodeEditorProps } from './components'; export type { EsDocSearchProps } from './hooks'; export type { UnifiedDocViewerSetup, UnifiedDocViewerStart } from './plugin'; +import type { CoreStart } from '@kbn/core-lifecycle-browser'; import type { AnalyticsServiceStart } from '@kbn/core-analytics-browser'; import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; @@ -27,4 +29,5 @@ export interface UnifiedDocViewerServices { uiSettings: IUiSettingsClient; unifiedDocViewer: UnifiedDocViewerStart; share: SharePluginStart; + core: CoreStart; } diff --git a/src/plugins/unified_doc_viewer/tsconfig.json b/src/plugins/unified_doc_viewer/tsconfig.json index 3b271744ed4af..ef3a7a91153ac 100644 --- a/src/plugins/unified_doc_viewer/tsconfig.json +++ b/src/plugins/unified_doc_viewer/tsconfig.json @@ -35,7 +35,9 @@ "@kbn/core-notifications-browser", "@kbn/deeplinks-observability", "@kbn/share-plugin", - "@kbn/router-utils" + "@kbn/router-utils", + "@kbn/unified-field-list", + "@kbn/core-lifecycle-browser" ], "exclude": [ "target/**/*", diff --git a/test/functional/apps/discover/esql/_esql_view.ts b/test/functional/apps/discover/esql/_esql_view.ts index 0ab0e30a45eab..a5a2fa78a7b65 100644 --- a/test/functional/apps/discover/esql/_esql_view.ts +++ b/test/functional/apps/discover/esql/_esql_view.ts @@ -113,11 +113,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await testSubjects.exists('unifiedHistogramChart')).to.be(false); }); - it('should render the histogram for indices with no @timestamp field when the ?start, ?end params are in the query', async function () { + it('should render the histogram for indices with no @timestamp field when the ?t_start, ?t_end params are in the query', async function () { await PageObjects.discover.selectTextBaseLang(); await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); - const testQuery = `from kibana_sample_data_flights | limit 10 | where timestamp >= ?start and timestamp <= ?end`; + const testQuery = `from kibana_sample_data_flights | limit 10 | where timestamp >= ?t_start and timestamp <= ?t_end`; await monacoEditor.setCodeEditorValue(testQuery); await testSubjects.click('querySubmitButton'); diff --git a/test/functional/apps/discover/group1/_discover.ts b/test/functional/apps/discover/group1/_discover.ts index c931187250cc3..e6cf2edca620f 100644 --- a/test/functional/apps/discover/group1/_discover.ts +++ b/test/functional/apps/discover/group1/_discover.ts @@ -216,8 +216,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await kibanaServer.uiSettings.update({ 'dateFormat:tz': 'America/Phoenix' }); await PageObjects.common.navigateToApp('discover'); await PageObjects.header.awaitKibanaChrome(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); await PageObjects.timePicker.setDefaultAbsoluteRange(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); await queryBar.clearQuery(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); log.debug( 'check that the newest doc timestamp is now -7 hours from the UTC time in the first test' diff --git a/test/functional/apps/discover/group2_data_grid3/_data_grid_row_selection.ts b/test/functional/apps/discover/group2_data_grid3/_data_grid_row_selection.ts index 82532641c58ae..c06d724c2e135 100644 --- a/test/functional/apps/discover/group2_data_grid3/_data_grid_row_selection.ts +++ b/test/functional/apps/discover/group2_data_grid3/_data_grid_row_selection.ts @@ -16,7 +16,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); const security = getService('security'); const testSubjects = getService('testSubjects'); - const PageObjects = getPageObjects(['common', 'discover', 'header', 'timePicker', 'dashboard']); + const browser = getService('browser'); + const PageObjects = getPageObjects([ + 'common', + 'discover', + 'header', + 'timePicker', + 'unifiedFieldList', + ]); const PAGE_SIZE = 5; const defaultSettings = { @@ -151,5 +158,84 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await testSubjects.missingOrFail('dscGridSelectAllDocs'); }); }); + + it('can copy selected rows as JSON', async () => { + await dataGrid.selectRow(2); + await dataGrid.selectRow(1); + + await retry.try(async () => { + expect(await dataGrid.isSelectedRowsMenuVisible()).to.be(true); + expect(await dataGrid.getNumberOfSelectedRowsOnCurrentPage()).to.be(2); + expect(await dataGrid.getNumberOfSelectedRows()).to.be(2); + }); + + await dataGrid.openSelectedRowsMenu(); + await testSubjects.click('dscGridCopySelectedDocumentsJSON'); + + await retry.try(async () => { + await testSubjects.missingOrFail('unifiedDataTableSelectionMenu'); + }); + + const clipboardData = await browser.execute(() => navigator.clipboard.readText()); + expect( + clipboardData.startsWith( + '[{"_index":"logstash-2015.09.22","_id":"AU_x3-TcGFA8no6Qjipx","_version":1,"_score":null,"fields":{' + ) + ).to.be(true); + }); + + it('can copy selected rows as text', async () => { + await dataGrid.selectRow(2); + await dataGrid.selectRow(1); + + await retry.try(async () => { + expect(await dataGrid.isSelectedRowsMenuVisible()).to.be(true); + expect(await dataGrid.getNumberOfSelectedRowsOnCurrentPage()).to.be(2); + expect(await dataGrid.getNumberOfSelectedRows()).to.be(2); + }); + + await dataGrid.openSelectedRowsMenu(); + await testSubjects.click('unifiedDataTableCopyRowsAsText'); + + await retry.try(async () => { + await testSubjects.missingOrFail('unifiedDataTableSelectionMenu'); + }); + + const clipboardData = await browser.execute(() => navigator.clipboard.readText()); + expect( + clipboardData.startsWith( + '"\'@timestamp"\t"\'@message"\t"\'@message.raw"\t"\'@tags"\t"\'@tags.raw"\t"_id"' + ) + ).to.be(true); + }); + + it('can copy columns for selected rows as text', async () => { + await PageObjects.unifiedFieldList.clickFieldListItemAdd('extension'); + await PageObjects.unifiedFieldList.clickFieldListItemAdd('bytes'); + await retry.try(async () => { + expect(await dataGrid.getHeaderFields()).to.eql(['@timestamp', 'extension', 'bytes']); + }); + + await dataGrid.selectRow(1); + await dataGrid.selectRow(0); + + await retry.try(async () => { + expect(await dataGrid.isSelectedRowsMenuVisible()).to.be(true); + expect(await dataGrid.getNumberOfSelectedRowsOnCurrentPage()).to.be(2); + expect(await dataGrid.getNumberOfSelectedRows()).to.be(2); + }); + + await dataGrid.openSelectedRowsMenu(); + await testSubjects.click('unifiedDataTableCopyRowsAsText'); + + await retry.try(async () => { + await testSubjects.missingOrFail('unifiedDataTableSelectionMenu'); + }); + + const clipboardData = await browser.execute(() => navigator.clipboard.readText()); + expect(clipboardData).to.be( + '"\'@timestamp"\textension\tbytes\n"Sep 22, 2015 @ 23:50:13.253"\tjpg\t"7,124"\n"Sep 22, 2015 @ 23:43:58.175"\tjpg\t"5,453"' + ); + }); }); } diff --git a/test/functional/apps/discover/group3/_doc_viewer.ts b/test/functional/apps/discover/group3/_doc_viewer.ts index 2ce59a332cf67..66f1f74a4ddbe 100644 --- a/test/functional/apps/discover/group3/_doc_viewer.ts +++ b/test/functional/apps/discover/group3/_doc_viewer.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import expect from '@kbn/expect'; import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { @@ -111,6 +112,84 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); }); + describe('filter by field type', function () { + beforeEach(async () => { + await dataGrid.clickRowToggle(); + await PageObjects.discover.isShowingDocViewer(); + await retry.waitFor('rendered items', async () => { + return (await find.allByCssSelector('.kbnDocViewer__fieldName')).length > 0; + }); + }); + + it('should reveal and hide the filter form when the toggle is clicked', async function () { + await PageObjects.discover.openFilterByFieldTypeInDocViewer(); + expect(await find.allByCssSelector('[data-test-subj*="typeFilter"]')).to.have.length(6); + await PageObjects.discover.closeFilterByFieldTypeInDocViewer(); + }); + + it('should filter by field type', async function () { + const initialFieldsCount = (await find.allByCssSelector('.kbnDocViewer__fieldName')).length; + + await PageObjects.discover.openFilterByFieldTypeInDocViewer(); + + await testSubjects.click('typeFilter-date'); + + await retry.waitFor('first updates', async () => { + return (await find.allByCssSelector('.kbnDocViewer__fieldName')).length === 4; + }); + + await testSubjects.click('typeFilter-number'); + + await retry.waitFor('second updates', async () => { + return (await find.allByCssSelector('.kbnDocViewer__fieldName')).length === 7; + }); + + await testSubjects.click('unifiedDocViewerFieldsTableFieldTypeFilterClearAll'); + + await retry.waitFor('reset', async () => { + return ( + (await find.allByCssSelector('.kbnDocViewer__fieldName')).length === initialFieldsCount + ); + }); + }); + + it('should show filters by type in ES|QL view', async function () { + await PageObjects.discover.selectTextBaseLang(); + + const testQuery = `from logstash-* | limit 10000`; + await monacoEditor.setCodeEditorValue(testQuery); + await testSubjects.click('querySubmitButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await dataGrid.clickRowToggle(); + await PageObjects.discover.isShowingDocViewer(); + await retry.waitFor('rendered items', async () => { + return (await find.allByCssSelector('.kbnDocViewer__fieldName')).length > 0; + }); + + const initialFieldsCount = (await find.allByCssSelector('.kbnDocViewer__fieldName')).length; + const numberFieldsCount = 6; + + expect(initialFieldsCount).to.above(numberFieldsCount); + + const pinnedFieldsCount = 1; + await dataGrid.clickFieldActionInFlyout('agent', 'togglePinFilterButton'); + + await PageObjects.discover.openFilterByFieldTypeInDocViewer(); + expect(await find.allByCssSelector('[data-test-subj*="typeFilter"]')).to.have.length(6); + + await testSubjects.click('typeFilter-number'); + + await retry.waitFor('updates', async () => { + return ( + (await find.allByCssSelector('.kbnDocViewer__fieldName')).length === + numberFieldsCount + pinnedFieldsCount + ); + }); + }); + }); + describe('hide null values switch - ES|QL mode', function () { beforeEach(async () => { await PageObjects.discover.selectTextBaseLang(); diff --git a/test/functional/page_objects/discover_page.ts b/test/functional/page_objects/discover_page.ts index c00e2c311e68c..3d364d9ff2c3e 100644 --- a/test/functional/page_objects/discover_page.ts +++ b/test/functional/page_objects/discover_page.ts @@ -448,6 +448,19 @@ export class DiscoverPageObject extends FtrService { await fieldSearch.type(name); } + public async openFilterByFieldTypeInDocViewer() { + await this.testSubjects.click('unifiedDocViewerFieldsTableFieldTypeFilterToggle'); + await this.testSubjects.existOrFail('unifiedDocViewerFieldsTableFieldTypeFilterOptions'); + } + + public async closeFilterByFieldTypeInDocViewer() { + await this.testSubjects.click('unifiedDocViewerFieldsTableFieldTypeFilterToggle'); + + await this.retry.waitFor('doc viewer filter closed', async () => { + return !(await this.testSubjects.exists('unifiedDocViewerFieldsTableFieldTypeFilterOptions')); + }); + } + public async getMarks() { const table = await this.docTable.getTable(); const marks = await table.findAllByTagName('mark'); diff --git a/test/plugin_functional/test_suites/saved_objects_management/hidden_from_http_apis.ts b/test/plugin_functional/test_suites/saved_objects_management/hidden_from_http_apis.ts index c37bd671a764f..3bb078d4d6864 100644 --- a/test/plugin_functional/test_suites/saved_objects_management/hidden_from_http_apis.ts +++ b/test/plugin_functional/test_suites/saved_objects_management/hidden_from_http_apis.ts @@ -12,6 +12,11 @@ import type { Response } from 'supertest'; import { SavedObject } from '@kbn/core/types'; import type { PluginFunctionalProviderContext } from '../../services'; +interface MinimalSO { + id: string; + type: string; +} + function parseNdJson(input: string): Array> { return input.split('\n').map((str) => JSON.parse(str)); } @@ -112,10 +117,12 @@ export default function ({ getService }: PluginFunctionalProviderContext) { .expect(200) .then((resp) => { expect( - resp.body.saved_objects.map((so: { id: string; type: string }) => ({ - id: so.id, - type: so.type, - })) + resp.body.saved_objects + .map((so: MinimalSO) => ({ + id: so.id, + type: so.type, + })) + .sort((a: MinimalSO, b: MinimalSO) => (a.id > b.id ? 1 : -1)) ).to.eql([ { id: 'hidden-from-http-apis-1', diff --git a/tsconfig.base.json b/tsconfig.base.json index d4b0d76a56413..e9fb8a5b9c426 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1546,6 +1546,8 @@ "@kbn/server-http-tools/*": ["packages/kbn-server-http-tools/*"], "@kbn/server-route-repository": ["packages/kbn-server-route-repository"], "@kbn/server-route-repository/*": ["packages/kbn-server-route-repository/*"], + "@kbn/server-route-repository-client": ["packages/kbn-server-route-repository-client"], + "@kbn/server-route-repository-client/*": ["packages/kbn-server-route-repository-client/*"], "@kbn/server-route-repository-utils": ["packages/kbn-server-route-repository-utils"], "@kbn/server-route-repository-utils/*": ["packages/kbn-server-route-repository-utils/*"], "@kbn/serverless": ["x-pack/plugins/serverless"], @@ -1718,6 +1720,8 @@ "@kbn/synthetics-e2e/*": ["x-pack/plugins/observability_solution/synthetics/e2e/*"], "@kbn/synthetics-plugin": ["x-pack/plugins/observability_solution/synthetics"], "@kbn/synthetics-plugin/*": ["x-pack/plugins/observability_solution/synthetics/*"], + "@kbn/synthetics-private-location": ["x-pack/packages/kbn-synthetics-private-location"], + "@kbn/synthetics-private-location/*": ["x-pack/packages/kbn-synthetics-private-location/*"], "@kbn/task-manager-fixture-plugin": ["x-pack/test/alerting_api_integration/common/plugins/task_manager_fixture"], "@kbn/task-manager-fixture-plugin/*": ["x-pack/test/alerting_api_integration/common/plugins/task_manager_fixture/*"], "@kbn/task-manager-performance-plugin": ["x-pack/test/plugin_api_perf/plugins/task_manager_performance"], diff --git a/versions.json b/versions.json index b096cb490ff00..4d3ab259480e9 100644 --- a/versions.json +++ b/versions.json @@ -8,17 +8,11 @@ "currentMinor": true }, { - "version": "8.15.0", + "version": "8.15.1", "branch": "8.15", "currentMajor": true, "previousMinor": true }, - { - "version": "8.14.4", - "branch": "8.14", - "currentMajor": true, - "previousMinor": true - }, { "version": "7.17.24", "branch": "7.17", diff --git a/x-pack/packages/kbn-entities-schema/index.ts b/x-pack/packages/kbn-entities-schema/index.ts index 8251e1c14755f..33a989cb8d804 100644 --- a/x-pack/packages/kbn-entities-schema/index.ts +++ b/x-pack/packages/kbn-entities-schema/index.ts @@ -8,6 +8,7 @@ export * from './src/schema/entity_definition'; export * from './src/schema/entity'; export * from './src/schema/common'; +export * from './src/schema/patterns'; export * from './src/rest_spec/delete'; export * from './src/rest_spec/reset'; export * from './src/rest_spec/get'; diff --git a/x-pack/packages/kbn-entities-schema/src/schema/patterns.test.ts b/x-pack/packages/kbn-entities-schema/src/schema/patterns.test.ts new file mode 100644 index 0000000000000..0d049152991f1 --- /dev/null +++ b/x-pack/packages/kbn-entities-schema/src/schema/patterns.test.ts @@ -0,0 +1,33 @@ +/* + * 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 { entitiesIndexPattern, entitiesAliasPattern } from './patterns'; + +describe('index/alias pattern helpers', () => { + describe('entitiesIndexPattern', () => { + it('generates a index pattern', () => { + expect( + entitiesIndexPattern({ + definitionId: 'my-definition', + schemaVersion: 'v1', + dataset: 'latest', + }) + ).toEqual('.entities.v1.latest.my-definition'); + }); + }); + + describe('entitiesAliasPattern', () => { + it('generates a alias pattern', () => { + expect( + entitiesAliasPattern({ + type: 'service', + dataset: 'latest', + }) + ).toEqual('entities-service-latest'); + }); + }); +}); diff --git a/x-pack/packages/kbn-entities-schema/src/schema/patterns.ts b/x-pack/packages/kbn-entities-schema/src/schema/patterns.ts new file mode 100644 index 0000000000000..2481769f2b473 --- /dev/null +++ b/x-pack/packages/kbn-entities-schema/src/schema/patterns.ts @@ -0,0 +1,41 @@ +/* + * 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 const ENTITY_BASE_PREFIX = 'entities'; +export const ENTITY_HISTORY = 'history' as const; +export const ENTITY_LATEST = 'latest' as const; + +export const ENTITY_SCHEMA_VERSION_V1 = 'v1'; + +type SchemaVersion = `v${number}`; +type Dataset = typeof ENTITY_LATEST | typeof ENTITY_HISTORY; + +interface IndexPatternOptions { + dataset: TDataset; + schemaVersion: SchemaVersion; + definitionId: string; +} + +interface AliasPatternOptions { + dataset: TDataset; + type: string; +} + +export function entitiesIndexPattern({ + schemaVersion, + dataset, + definitionId, +}: IndexPatternOptions) { + return `.${ENTITY_BASE_PREFIX}.${schemaVersion}.${dataset}.${definitionId}` as const; +} + +export function entitiesAliasPattern({ + type, + dataset, +}: AliasPatternOptions) { + return `${ENTITY_BASE_PREFIX}-${type}-${dataset}` as const; +} diff --git a/x-pack/packages/kbn-synthetics-private-location/README.md b/x-pack/packages/kbn-synthetics-private-location/README.md new file mode 100644 index 0000000000000..57fea6207dd10 --- /dev/null +++ b/x-pack/packages/kbn-synthetics-private-location/README.md @@ -0,0 +1,56 @@ +# @kbn/synthetics-private-location + +Quickily start Fleet, enroll Elastic Agent, and create a private location. + +## Usage + +``` +node x-pack/scripts/synthetics_private_location.js +``` + +For available options, run `--help`. + +## Prerequistes + +This script requires `docker` and the following `kibama.yml` configuration. + +``` +# Create an agent policy for Fleet Server. +xpack.fleet.agentPolicies: + - name: Fleet Server policy + id: fleet-server-policy + is_default_fleet_server: true + # is_managed: true # Useful to mimic cloud environment + description: Fleet server policy + namespace: default + package_policies: + - name: Fleet Server + package: + name: fleet_server + inputs: + - type: fleet-server + keep_enabled: true + vars: + - name: host + value: 0.0.0.0 + frozen: true + - name: port + value: 8220 + frozen: true + +# Set a default Fleet Server host. +xpack.fleet.fleetServerHosts: + - id: default-fleet-server + name: Default Fleet server + is_default: true + host_urls: ['https://host.docker.internal:8220'] # For running a Fleet Server Docker container + +# Set a default Elasticsearch output. +xpack.fleet.outputs: + - id: es-default-output + name: Default output + type: elasticsearch + is_default: true + is_default_monitoring: true + hosts: ['http://host.docker.internal:9200'] # For enrolling dockerized agents +``` diff --git a/x-pack/packages/kbn-synthetics-private-location/index.ts b/x-pack/packages/kbn-synthetics-private-location/index.ts new file mode 100644 index 0000000000000..9411c1c3b0eea --- /dev/null +++ b/x-pack/packages/kbn-synthetics-private-location/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export type { CliOptions } from './src/types'; +export { run } from './src/run'; +export { cli } from './src/cli'; +// export { cleanup } from './src/cleanup'; +export { DEFAULTS } from './src/constants'; diff --git a/x-pack/packages/kbn-synthetics-private-location/jest.config.js b/x-pack/packages/kbn-synthetics-private-location/jest.config.js new file mode 100644 index 0000000000000..658017a2f17c9 --- /dev/null +++ b/x-pack/packages/kbn-synthetics-private-location/jest.config.js @@ -0,0 +1,12 @@ +/* + * 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. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../..', + roots: ['/x-pack/packages/kbn-synthetics-private-location'], +}; diff --git a/x-pack/packages/kbn-synthetics-private-location/kibana.jsonc b/x-pack/packages/kbn-synthetics-private-location/kibana.jsonc new file mode 100644 index 0000000000000..6ff6d3f1645c2 --- /dev/null +++ b/x-pack/packages/kbn-synthetics-private-location/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/synthetics-private-location", + "owner": "@elastic/obs-ux-management-team" +} diff --git a/x-pack/packages/kbn-synthetics-private-location/package.json b/x-pack/packages/kbn-synthetics-private-location/package.json new file mode 100644 index 0000000000000..3b3e435e6feb3 --- /dev/null +++ b/x-pack/packages/kbn-synthetics-private-location/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/synthetics-private-location", + "private": true, + "version": "1.0.0", + "license": "Elastic License 2.0" +} \ No newline at end of file diff --git a/x-pack/packages/kbn-synthetics-private-location/src/cli.ts b/x-pack/packages/kbn-synthetics-private-location/src/cli.ts new file mode 100644 index 0000000000000..4a25b5323b7ab --- /dev/null +++ b/x-pack/packages/kbn-synthetics-private-location/src/cli.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ToolingLog } from '@kbn/tooling-log'; +import { parseCliOptions } from './lib/parse_cli_options'; +import { CliOptions } from './types'; +import { run } from './run'; + +export async function cli(cliOptions?: CliOptions) { + const options = cliOptions ?? parseCliOptions(); + const logger = new ToolingLog({ level: 'info', writeTo: process.stdout }); + return run(options, logger); +} diff --git a/x-pack/packages/kbn-synthetics-private-location/src/constants.ts b/x-pack/packages/kbn-synthetics-private-location/src/constants.ts new file mode 100644 index 0000000000000..41fcfcb112c6b --- /dev/null +++ b/x-pack/packages/kbn-synthetics-private-location/src/constants.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { v4 as uuidv4 } from 'uuid'; + +export const DEFAULTS = { + LOCATION_NAME: `Default location ${uuidv4()}`, + AGENT_POLICY_NAME: `Synthetics agent policy ${uuidv4()}`, + ELASTICSEARCH_HOST: 'http://localhost:9200', + KIBANA_URL: 'http://localhost:5601', + KIBANA_USERNAME: 'elastic', + KIBANA_PASSWORD: 'changeme', +}; diff --git a/x-pack/packages/kbn-synthetics-private-location/src/lib/create_agent_policy.ts b/x-pack/packages/kbn-synthetics-private-location/src/lib/create_agent_policy.ts new file mode 100644 index 0000000000000..5171abcca6906 --- /dev/null +++ b/x-pack/packages/kbn-synthetics-private-location/src/lib/create_agent_policy.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 { isError } from 'lodash'; +import { ToolingLog } from '@kbn/tooling-log'; +import { CliOptions } from '../types'; +import type { KibanaAPIClient } from './kibana_api_client'; + +export async function createElasticAgentPolicy( + { agentPolicyName }: CliOptions, + logger: ToolingLog, + kibanaApiClient: KibanaAPIClient +) { + try { + const response = await kibanaApiClient.sendRequest({ + method: 'post', + url: 'api/fleet/agent_policies', + data: { + name: agentPolicyName, + description: '', + namespace: 'default', + monitoring_enabled: ['logs', 'metrics'], + inactivity_timeout: 1209600, + is_protected: false, + }, + }); + + logger.info(`Generated elastic agent policy`); + return response.data; + } catch (error) { + if (isError(error)) { + logger.error(`Error generating elastic agent policy: ${error.message} ${error.stack}`); + } + throw error; + } +} diff --git a/x-pack/packages/kbn-synthetics-private-location/src/lib/create_private_location.ts b/x-pack/packages/kbn-synthetics-private-location/src/lib/create_private_location.ts new file mode 100644 index 0000000000000..a0d389eafa4a5 --- /dev/null +++ b/x-pack/packages/kbn-synthetics-private-location/src/lib/create_private_location.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 { isError } from 'lodash'; +import { ToolingLog } from '@kbn/tooling-log'; +import { CliOptions } from '../types'; +import { KibanaAPIClient } from './kibana_api_client'; + +export async function createPrivateLocation( + { kibanaUrl, kibanaPassword, kibanaUsername, locationName }: CliOptions, + logger: ToolingLog, + kibanaApiClient: KibanaAPIClient, + agentPolicyId: string +) { + try { + const response = await kibanaApiClient.sendRequest({ + method: 'post', + url: 'api/synthetics/private_locations', + data: { + label: locationName, + agentPolicyId, + }, + }); + + logger.info(`Synthetics private location created successfully`); + return response.data; + } catch (error) { + if (isError(error)) { + logger.error(`Error creating synthetics private location: ${error.message} ${error.stack}`); + } + throw error; + } +} diff --git a/x-pack/packages/kbn-synthetics-private-location/src/lib/enroll_agent.ts b/x-pack/packages/kbn-synthetics-private-location/src/lib/enroll_agent.ts new file mode 100644 index 0000000000000..143ff08642fff --- /dev/null +++ b/x-pack/packages/kbn-synthetics-private-location/src/lib/enroll_agent.ts @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { spawn, spawnSync } from 'child_process'; +import * as path from 'path'; +import { CliOptions } from '../types'; +import { KibanaAPIClient } from './kibana_api_client'; + +export async function enrollAgent( + { kibanaUrl, elasticsearchHost }: CliOptions, + enrollmentToken: string, + kibanaApiClient: KibanaAPIClient +) { + const formattedKibanaURL = new URL(kibanaUrl); + const formattedElasticsearchHost = new URL(elasticsearchHost); + if (formattedKibanaURL.hostname === 'localhost') { + formattedKibanaURL.hostname = 'host.docker.internal'; + } + if (formattedElasticsearchHost.hostname === 'localhost') { + formattedElasticsearchHost.hostname = 'host.docker.internal'; + } + const version = `${await kibanaApiClient.getKibanaVersion()}-SNAPSHOT`; + await new Promise((res, rej) => { + try { + const fleetProcess = spawn( + 'docker', + [ + 'run', + '-e', + 'FLEET_SERVER_ENABLE=1', + '-e', + `FLEET_SERVER_ELASTICSEARCH_HOST=${formattedElasticsearchHost.origin}`, + '-e', + 'FLEET_SERVER_POLICY_ID=fleet-server-policy', + '-e', + 'FLEET_INSECURE=1', + '-e', + `KIBANA_HOST=${formattedKibanaURL.origin}`, + '-e', + 'KIBANA_USERNAME=elastic', + '-e', + 'KIBANA_PASSWORD=changeme', + '-e', + 'KIBANA_FLEET_SETUP=1', + '-p', + '8220:8220', + '--rm', + `docker.elastic.co/beats/elastic-agent:${version}`, + ], + { + shell: true, + cwd: path.join(__dirname, '../'), + timeout: 120000, + } + ); + setTimeout(res, 10_000); + fleetProcess.on('error', rej); + } catch (error) { + rej(error); + } + }); + + spawnSync( + 'docker', + [ + 'run', + '-e', + 'FLEET_URL=https://host.docker.internal:8220', + '-e', + 'FLEET_ENROLL=1', + '-e', + `FLEET_ENROLLMENT_TOKEN=${enrollmentToken}`, + '-e', + 'FLEET_INSECURE=1', + '--rm', + `docker.elastic.co/beats/elastic-agent-complete:${version}`, + ], + { + stdio: 'inherit', + } + ); +} diff --git a/x-pack/packages/kbn-synthetics-private-location/src/lib/fetch_agent_policy_enrollment_token.ts b/x-pack/packages/kbn-synthetics-private-location/src/lib/fetch_agent_policy_enrollment_token.ts new file mode 100644 index 0000000000000..0eeecc2529289 --- /dev/null +++ b/x-pack/packages/kbn-synthetics-private-location/src/lib/fetch_agent_policy_enrollment_token.ts @@ -0,0 +1,33 @@ +/* + * 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 { isError } from 'lodash'; +import { ToolingLog } from '@kbn/tooling-log'; +import { KibanaAPIClient } from './kibana_api_client'; +import { CliOptions } from '../types'; + +export async function fetchAgentPolicyEnrollmentToken( + { kibanaUrl, kibanaPassword, kibanaUsername }: CliOptions, + logger: ToolingLog, + kibanaApiClient: KibanaAPIClient, + agentPolicyId: string +) { + try { + const response = await kibanaApiClient.sendRequest({ + method: 'get', + url: `api/fleet/enrollment_api_keys?kuery=policy_id:${agentPolicyId}`, + }); + + logger.info(`Fetching agent policy enrollment token`); + return response.data; + } catch (error) { + if (isError(error)) { + logger.error(`Error fetching agent enrollment token: ${error.message} ${error.stack}`); + } + throw error; + } +} diff --git a/x-pack/packages/kbn-synthetics-private-location/src/lib/generate_fleet_service_token.ts b/x-pack/packages/kbn-synthetics-private-location/src/lib/generate_fleet_service_token.ts new file mode 100644 index 0000000000000..c754840ed8a11 --- /dev/null +++ b/x-pack/packages/kbn-synthetics-private-location/src/lib/generate_fleet_service_token.ts @@ -0,0 +1,32 @@ +/* + * 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 { isError } from 'lodash'; +import { ToolingLog } from '@kbn/tooling-log'; +import { CliOptions } from '../types'; +import { KibanaAPIClient } from './kibana_api_client'; + +export async function generateFleetServiceToken( + { kibanaUrl, kibanaPassword, kibanaUsername }: CliOptions, + logger: ToolingLog, + kibanaApiClient: KibanaAPIClient +) { + try { + const response = await kibanaApiClient.sendRequest({ + method: 'post', + url: 'api/fleet/service_tokens', + }); + + logger.info(`Generated fleet server service token saved`); + return response.data; + } catch (error) { + if (isError(error)) { + logger.error(`Error generating fleet server service token: ${error.message} ${error.stack}`); + } + throw error; + } +} diff --git a/x-pack/packages/kbn-synthetics-private-location/src/lib/kibana_api_client.ts b/x-pack/packages/kbn-synthetics-private-location/src/lib/kibana_api_client.ts new file mode 100644 index 0000000000000..f6f0709218499 --- /dev/null +++ b/x-pack/packages/kbn-synthetics-private-location/src/lib/kibana_api_client.ts @@ -0,0 +1,76 @@ +/* + * 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 { isError } from 'lodash'; +import { ToolingLog } from '@kbn/tooling-log'; +import { KBN_CERT_PATH, KBN_KEY_PATH } from '@kbn/dev-utils'; +import fs from 'fs'; +import https, { Agent } from 'https'; +import axios from 'axios'; + +export class KibanaAPIClient { + private isHTTPS: boolean; + private httpsAgent: Agent | undefined; + + constructor( + private kibanaUrl: string, + private kibanaUsername: string, + private kibanaPassword: string, + private logger: ToolingLog + ) { + this.isHTTPS = new URL(kibanaUrl).protocol === 'https:'; + this.httpsAgent = this.isHTTPS + ? new https.Agent({ + ca: fs.readFileSync(KBN_CERT_PATH), + key: fs.readFileSync(KBN_KEY_PATH), + // hard-coded set to false like in packages/kbn-cli-dev-mode/src/base_path_proxy_server.ts + rejectUnauthorized: false, + }) + : undefined; + } + + public async sendRequest({ + method, + url, + data, + headers, + }: { + method: string; + url: string; + data?: Record; + headers?: Record; + }) { + try { + const response = await axios({ + method, + url: `${this.kibanaUrl}/${url}`, + data, + headers: { + 'kbn-xsrf': 'true', + 'elastic-api-version': '2023-10-31', + ...headers, + }, + auth: { + username: this.kibanaUsername, + password: this.kibanaPassword, + }, + httpsAgent: this.httpsAgent, + }); + return response; + } catch (e) { + if (isError(e)) { + this.logger.error(`Error sending request to Kibana: ${e.message} ${e.stack}`); + } + throw e; + } + } + + public async getKibanaVersion() { + const res = await this.sendRequest({ method: 'GET', url: 'api/status' }); + return res.data.version.number; + } +} diff --git a/x-pack/packages/kbn-synthetics-private-location/src/lib/parse_cli_options.ts b/x-pack/packages/kbn-synthetics-private-location/src/lib/parse_cli_options.ts new file mode 100644 index 0000000000000..f4fc29411db1d --- /dev/null +++ b/x-pack/packages/kbn-synthetics-private-location/src/lib/parse_cli_options.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 { Command } from 'commander'; +import { CliOptions } from '../types'; +import { DEFAULTS } from '../constants'; + +export function parseCliOptions(): CliOptions { + const program = new Command(); + program + .name('synthetics_private_location.js') + .description( + 'A script to start Fleet Server, enroll Elastic Agent, and create a Synthetics private location' + ) + .option( + '--elasticsearch-host
', + 'The address to the Elasticsearch cluster', + DEFAULTS.ELASTICSEARCH_HOST + ) + .option('--kibana-url
', 'The address to the Kibana server', DEFAULTS.KIBANA_URL) + .option( + '--kibana-username ', + 'The username for the Kibana server', + DEFAULTS.KIBANA_USERNAME + ) + .option( + '--kibana-password ', + 'The password for the Kibana server', + DEFAULTS.KIBANA_PASSWORD + ) + .option( + '--location-name ', + 'The name of the Synthetics private location', + DEFAULTS.LOCATION_NAME + ) + .option( + '--agent-policy-name ', + 'The name of the agent policy', + DEFAULTS.AGENT_POLICY_NAME + ); + + program.parse(process.argv); + return program.opts() as CliOptions; +} diff --git a/x-pack/packages/kbn-synthetics-private-location/src/run.ts b/x-pack/packages/kbn-synthetics-private-location/src/run.ts new file mode 100644 index 0000000000000..c9a0931b3733d --- /dev/null +++ b/x-pack/packages/kbn-synthetics-private-location/src/run.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 { ToolingLog } from '@kbn/tooling-log'; +import type { CliOptions } from './types'; +import { createElasticAgentPolicy } from './lib/create_agent_policy'; +import { fetchAgentPolicyEnrollmentToken } from './lib/fetch_agent_policy_enrollment_token'; +import { enrollAgent } from './lib/enroll_agent'; +import { createPrivateLocation } from './lib/create_private_location'; +import { KibanaAPIClient } from './lib/kibana_api_client'; + +export async function run(options: CliOptions, logger: ToolingLog) { + const kibanaClient = new KibanaAPIClient( + options.kibanaUrl, + options.kibanaUsername, + options.kibanaPassword, + logger + ); + const { + item: { id: agentPolicyId }, + } = await createElasticAgentPolicy(options, logger, kibanaClient); + await createPrivateLocation(options, logger, kibanaClient, agentPolicyId); + const { list } = await fetchAgentPolicyEnrollmentToken( + options, + logger, + kibanaClient, + agentPolicyId + ); + const [enrollmentTokenConfig] = list; + const { api_key: enrollmentToken } = enrollmentTokenConfig; + enrollAgent(options, enrollmentToken, kibanaClient); +} diff --git a/x-pack/packages/kbn-synthetics-private-location/src/types.ts b/x-pack/packages/kbn-synthetics-private-location/src/types.ts new file mode 100644 index 0000000000000..1ec7f6ad9d595 --- /dev/null +++ b/x-pack/packages/kbn-synthetics-private-location/src/types.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. + */ + +export interface CliOptions { + locationName: string; + agentPolicyName: string; + kibanaUrl: string; + kibanaUsername: string; + kibanaPassword: string; + elasticsearchHost: string; +} diff --git a/x-pack/packages/kbn-synthetics-private-location/tsconfig.json b/x-pack/packages/kbn-synthetics-private-location/tsconfig.json new file mode 100644 index 0000000000000..c6a5932133cb3 --- /dev/null +++ b/x-pack/packages/kbn-synthetics-private-location/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/tooling-log", + "@kbn/dev-utils", + ] +} diff --git a/x-pack/plugins/alerting/server/config.test.ts b/x-pack/plugins/alerting/server/config.test.ts index 164b317cdf2ac..9e2d2d089ac62 100644 --- a/x-pack/plugins/alerting/server/config.test.ts +++ b/x-pack/plugins/alerting/server/config.test.ts @@ -23,7 +23,7 @@ describe('config validation', () => { }, "maxEphemeralActionsPerAlert": 10, "rules": Object { - "maxScheduledPerMinute": 10000, + "maxScheduledPerMinute": 32000, "minimumScheduleInterval": Object { "enforce": false, "value": "1m", diff --git a/x-pack/plugins/alerting/server/config.ts b/x-pack/plugins/alerting/server/config.ts index 6dd96667f9553..ccacc6440b03a 100644 --- a/x-pack/plugins/alerting/server/config.ts +++ b/x-pack/plugins/alerting/server/config.ts @@ -38,7 +38,7 @@ const rulesSchema = schema.object({ }), enforce: schema.boolean({ defaultValue: false }), // if enforce is false, only warnings will be shown }), - maxScheduledPerMinute: schema.number({ defaultValue: 10000, max: 10000, min: 0 }), + maxScheduledPerMinute: schema.number({ defaultValue: 32000, max: 32000, min: 0 }), overwriteProducer: schema.maybe( schema.oneOf([ schema.literal('observability'), diff --git a/x-pack/plugins/cases/public/components/custom_fields/index.test.tsx b/x-pack/plugins/cases/public/components/custom_fields/index.test.tsx index 4da76d846dd9d..2a09c0b207be1 100644 --- a/x-pack/plugins/cases/public/components/custom_fields/index.test.tsx +++ b/x-pack/plugins/cases/public/components/custom_fields/index.test.tsx @@ -7,7 +7,7 @@ import React from 'react'; import userEvent from '@testing-library/user-event'; -import { screen } from '@testing-library/react'; +import { screen, waitFor } from '@testing-library/react'; import type { AppMockRenderer } from '../../common/mock'; import { createAppMockRenderer } from '../../common/mock'; @@ -17,8 +17,7 @@ import { MAX_CUSTOM_FIELDS_PER_CASE } from '../../../common/constants'; import { CustomFields } from '.'; import * as i18n from './translations'; -// FLAKY: https://github.com/elastic/kibana/issues/176805 -describe.skip('CustomFields', () => { +describe('CustomFields', () => { let appMockRender: AppMockRenderer; const props = { @@ -68,7 +67,9 @@ describe.skip('CustomFields', () => { userEvent.click(await screen.findByTestId('add-custom-field')); - expect(props.handleAddCustomField).toBeCalled(); + await waitFor(() => { + expect(props.handleAddCustomField).toBeCalled(); + }); }); it('calls handleEditCustomField on edit option click', async () => { @@ -80,13 +81,9 @@ describe.skip('CustomFields', () => { await screen.findByTestId(`${customFieldsConfigurationMock[0].key}-custom-field-edit`) ); - expect(props.handleEditCustomField).toBeCalledWith(customFieldsConfigurationMock[0].key); - }); - - it('shows the experimental badge', async () => { - appMockRender.render(); - - expect(await screen.findByTestId('case-experimental-badge')).toBeInTheDocument(); + await waitFor(() => { + expect(props.handleEditCustomField).toBeCalledWith(customFieldsConfigurationMock[0].key); + }); }); it('shows error when custom fields reaches the limit', async () => { diff --git a/x-pack/plugins/cases/public/components/edit_connector/push_button.test.tsx b/x-pack/plugins/cases/public/components/edit_connector/push_button.test.tsx index fee6fdc8d1557..54fae78d22813 100644 --- a/x-pack/plugins/cases/public/components/edit_connector/push_button.test.tsx +++ b/x-pack/plugins/cases/public/components/edit_connector/push_button.test.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { screen } from '@testing-library/react'; +import { screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import type { AppMockRenderer } from '../../common/mock'; @@ -36,39 +36,42 @@ describe('PushButton ', () => { it('renders the button without tooltip', async () => { appMockRender.render(); - expect(screen.getByTestId('push-to-external-service')).toBeInTheDocument(); + expect(await screen.findByTestId('push-to-external-service')).toBeInTheDocument(); expect(screen.queryByTestId('push-button-tooltip')).not.toBeInTheDocument(); }); it('renders the correct label when the connector has not been pushed', async () => { appMockRender.render(); - expect(screen.getByText('Push as My SN connector incident')).toBeInTheDocument(); + expect(await screen.findByText('Push as My SN connector incident')).toBeInTheDocument(); }); it('renders the correct label when the connector has been pushed', async () => { appMockRender.render(); - expect(screen.getByText('Update My SN connector incident')).toBeInTheDocument(); + expect(await screen.findByText('Update My SN connector incident')).toBeInTheDocument(); }); it('pushed correctly', async () => { appMockRender.render(); - userEvent.click(screen.getByTestId('push-to-external-service')); - expect(pushToService).toHaveBeenCalled(); + userEvent.click(await screen.findByTestId('push-to-external-service')); + + await waitFor(() => { + expect(pushToService).toHaveBeenCalled(); + }); }); it('disables the button', async () => { appMockRender.render(); - expect(screen.getByTestId('push-to-external-service')).toBeDisabled(); + expect(await screen.findByTestId('push-to-external-service')).toBeDisabled(); }); it('shows the tooltip context correctly', async () => { appMockRender.render(); - userEvent.hover(screen.getByTestId('push-to-external-service')); + userEvent.hover(await screen.findByTestId('push-to-external-service')); expect(await screen.findByText('My SN connector incident is up to date')).toBeInTheDocument(); expect(await screen.findByText('No update is required')).toBeInTheDocument(); @@ -83,7 +86,7 @@ describe('PushButton ', () => { /> ); - userEvent.hover(screen.getByTestId('push-to-external-service')); + userEvent.hover(await screen.findByTestId('push-to-external-service')); expect(await screen.findByText('My title')).toBeInTheDocument(); expect(await screen.findByText('My desc')).toBeInTheDocument(); diff --git a/x-pack/plugins/cases/public/components/system_actions/cases/cases_params.test.tsx b/x-pack/plugins/cases/public/components/system_actions/cases/cases_params.test.tsx index e43eb7a253026..02cfa92f9e2a0 100644 --- a/x-pack/plugins/cases/public/components/system_actions/cases/cases_params.test.tsx +++ b/x-pack/plugins/cases/public/components/system_actions/cases/cases_params.test.tsx @@ -9,18 +9,25 @@ import React from 'react'; import type { ActionConnector } from '@kbn/triggers-actions-ui-plugin/public/types'; import { fireEvent, render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { showEuiComboBoxOptions } from '@elastic/eui/lib/test/rtl'; +import { useAlertsDataView } from '@kbn/alerts-ui-shared/src/common/hooks/use_alerts_data_view'; import { useApplication } from '../../../common/lib/kibana/use_application'; -import { useAlertDataViews } from '../hooks/use_alert_data_view'; import { CasesParamsFields } from './cases_params'; -import { showEuiComboBoxOptions } from '@elastic/eui/lib/test/rtl'; +import { useKibana } from '../../../common/lib/kibana/kibana_react'; +import { createStartServicesMock } from '../../../common/lib/kibana/kibana_react.mock'; -jest.mock('@kbn/triggers-actions-ui-plugin/public/common/lib/kibana'); +jest.mock('@kbn/alerts-ui-shared/src/common/hooks/use_alerts_data_view'); jest.mock('../../../common/lib/kibana/use_application'); -jest.mock('../hooks/use_alert_data_view'); +jest.mock('../../../common/lib/kibana/kibana_react'); -const useAlertDataViewsMock = useAlertDataViews as jest.Mock; +const useKibanaMock = jest.mocked(useKibana); +const useAlertsDataViewMock = jest.mocked(useAlertsDataView); const useApplicationMock = useApplication as jest.Mock; +useKibanaMock.mockReturnValue({ + services: { ...createStartServicesMock(), data: { dataViews: {} } }, +} as unknown as ReturnType); + const actionParams = { subAction: 'run', subActionParams: { @@ -52,24 +59,25 @@ describe('CasesParamsFields renders', () => { beforeEach(() => { jest.clearAllMocks(); useApplicationMock.mockReturnValueOnce({ appId: 'management' }); - useAlertDataViewsMock.mockReturnValue({ - loading: false, - dataViews: [ - { - title: '.alerts-test', - fields: [ - { - name: 'host.ip', - type: 'ip', - aggregatable: true, - }, - { - name: 'host.geo.location', - type: 'geo_point', - }, - ], - }, - ], + useAlertsDataViewMock.mockReturnValue({ + isLoading: false, + dataView: { + title: '.alerts-test', + fields: [ + { + name: 'host.ip', + type: 'ip', + aggregatable: true, + searchable: true, + }, + { + name: 'host.geo.location', + type: 'geo_point', + aggregatable: false, + searchable: true, + }, + ], + }, }); }); @@ -83,14 +91,14 @@ describe('CasesParamsFields renders', () => { }); it('renders loading state of grouping by fields correctly', async () => { - useAlertDataViewsMock.mockReturnValue({ loading: true }); + useAlertsDataViewMock.mockReturnValue({ isLoading: true }); render(); expect(await screen.findByRole('progressbar')).toBeInTheDocument(); }); it('disables dropdown when loading grouping by fields', async () => { - useAlertDataViewsMock.mockReturnValue({ loading: true }); + useAlertsDataViewMock.mockReturnValue({ isLoading: true }); render(); expect(await screen.findByRole('progressbar')).toBeInTheDocument(); @@ -161,29 +169,31 @@ describe('CasesParamsFields renders', () => { }); it('updates grouping by field by search', async () => { - useAlertDataViewsMock.mockReturnValue({ - loading: false, - dataViews: [ - { - title: '.alerts-test', - fields: [ - { - name: 'host.ip', - type: 'ip', - aggregatable: true, - }, - { - name: 'host.geo.location', - type: 'geo_point', - }, - { - name: 'alert.name', - type: 'string', - aggregatable: true, - }, - ], - }, - ], + useAlertsDataViewMock.mockReturnValue({ + isLoading: false, + dataView: { + title: '.alerts-test', + fields: [ + { + name: 'host.ip', + type: 'ip', + aggregatable: true, + searchable: true, + }, + { + name: 'host.geo.location', + type: 'geo_point', + aggregatable: false, + searchable: true, + }, + { + name: 'alert.name', + type: 'string', + aggregatable: true, + searchable: true, + }, + ], + }, }); render(); diff --git a/x-pack/plugins/cases/public/components/system_actions/cases/cases_params.tsx b/x-pack/plugins/cases/public/components/system_actions/cases/cases_params.tsx index 71e9380246278..4b667d7880758 100644 --- a/x-pack/plugins/cases/public/components/system_actions/cases/cases_params.tsx +++ b/x-pack/plugins/cases/public/components/system_actions/cases/cases_params.tsx @@ -8,6 +8,7 @@ import React, { memo, useCallback, useEffect, useMemo } from 'react'; import type { ActionParamsProps } from '@kbn/triggers-actions-ui-plugin/public/types'; +import type { AlertConsumers, ValidFeatureId } from '@kbn/rule-data-utils'; import type { EuiComboBoxOptionOption } from '@elastic/eui'; import { EuiCheckbox, @@ -19,20 +20,30 @@ import { EuiSpacer, EuiComboBox, } from '@elastic/eui'; -import type { ValidFeatureId } from '@kbn/rule-data-utils'; -import { CASES_CONNECTOR_SUB_ACTION } from '../../../../common/constants'; +import { useAlertsDataView } from '@kbn/alerts-ui-shared/src/common/hooks/use_alerts_data_view'; import * as i18n from './translations'; import type { CasesActionParams } from './types'; +import { CASES_CONNECTOR_SUB_ACTION } from '../../../../common/constants'; import { DEFAULT_TIME_WINDOW, TIME_UNITS } from './constants'; import { getTimeUnitOptions } from './utils'; -import { useAlertDataViews } from '../hooks/use_alert_data_view'; +import { useKibana } from '../../../common/lib/kibana'; export const CasesParamsFieldsComponent: React.FunctionComponent< ActionParamsProps > = ({ actionParams, editAction, errors, index, producerId }) => { - const { dataViews, loading: loadingAlertDataViews } = useAlertDataViews( - producerId ? [producerId as ValidFeatureId] : [] - ); + const { + http, + notifications: { toasts }, + data: { dataViews: dataViewsService }, + } = useKibana().services; + const { dataView, isLoading: loadingAlertDataViews } = useAlertsDataView({ + http, + toasts, + dataViewsService, + featureIds: producerId + ? [producerId as Exclude] + : [], + }); const { timeWindow, reopenClosedCases, groupingBy } = useMemo( () => @@ -108,21 +119,17 @@ export const CasesParamsFieldsComponent: React.FunctionComponent< ); const options: Array> = useMemo(() => { - if (!dataViews?.length) { + if (!dataView) { return []; } - return dataViews - .map((dataView) => { - return dataView.fields - .filter((field) => Boolean(field.aggregatable)) - .map((field) => ({ - value: field.name, - label: field.name, - })); - }) - .flat(); - }, [dataViews]); + return dataView.fields + .filter((field) => Boolean(field.aggregatable)) + .map((field) => ({ + value: field.name, + label: field.name, + })); + }, [dataView]); const selectedOptions = groupingBy.map((field) => ({ value: field, label: field })); diff --git a/x-pack/plugins/cases/public/components/system_actions/hooks/alert_fields.ts b/x-pack/plugins/cases/public/components/system_actions/hooks/alert_fields.ts deleted file mode 100644 index 8a73674a5e264..0000000000000 --- a/x-pack/plugins/cases/public/components/system_actions/hooks/alert_fields.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { ValidFeatureId } from '@kbn/rule-data-utils'; -import type { HttpSetup } from '@kbn/core/public'; -import type { FieldSpec } from '@kbn/data-views-plugin/common'; -import { BASE_RAC_ALERTS_API_PATH } from '@kbn/rule-registry-plugin/common'; - -export async function fetchAlertFields({ - http, - featureIds, -}: { - http: HttpSetup; - featureIds: ValidFeatureId[]; -}): Promise { - const { fields: alertFields = [] } = await http.get<{ fields: FieldSpec[] }>( - `${BASE_RAC_ALERTS_API_PATH}/browser_fields`, - { - query: { featureIds }, - } - ); - return alertFields; -} diff --git a/x-pack/plugins/cases/public/components/system_actions/hooks/alert_index.ts b/x-pack/plugins/cases/public/components/system_actions/hooks/alert_index.ts deleted file mode 100644 index 4b5a496f226bb..0000000000000 --- a/x-pack/plugins/cases/public/components/system_actions/hooks/alert_index.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { BASE_RAC_ALERTS_API_PATH } from '@kbn/rule-registry-plugin/common'; -import type { HttpSetup } from '@kbn/core/public'; - -export async function fetchAlertIndexNames({ - http, - features, -}: { - http: HttpSetup; - features: string; -}): Promise { - const { index_name: indexNamesStr = [] } = await http.get<{ index_name: string[] }>( - `${BASE_RAC_ALERTS_API_PATH}/index`, - { - query: { features }, - } - ); - return indexNamesStr; -} diff --git a/x-pack/plugins/cases/public/components/system_actions/hooks/use_alert_data_view.test.tsx b/x-pack/plugins/cases/public/components/system_actions/hooks/use_alert_data_view.test.tsx deleted file mode 100644 index 8dbb501e4cf15..0000000000000 --- a/x-pack/plugins/cases/public/components/system_actions/hooks/use_alert_data_view.test.tsx +++ /dev/null @@ -1,135 +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 { waitFor } from '@testing-library/react'; -import { renderHook } from '@testing-library/react-hooks/dom'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { AlertConsumers } from '@kbn/rule-data-utils'; -import type { ValidFeatureId } from '@kbn/rule-data-utils'; -import { createStartServicesMock } from '../../../common/lib/kibana/kibana_react.mock'; -import { useAlertDataViews } from './use_alert_data_view'; - -const mockUseKibanaReturnValue = createStartServicesMock(); - -jest.mock('@kbn/kibana-react-plugin/public', () => ({ - __esModule: true, - useKibana: jest.fn(() => ({ - services: mockUseKibanaReturnValue, - })), -})); - -jest.mock('./alert_index', () => ({ - fetchAlertIndexNames: jest.fn(), -})); - -const { fetchAlertIndexNames } = jest.requireMock('./alert_index'); - -jest.mock('./alert_fields', () => ({ - fetchAlertFields: jest.fn(), -})); -const { fetchAlertFields } = jest.requireMock('./alert_fields'); - -const queryClient = new QueryClient({ - defaultOptions: { - queries: { - retry: false, - cacheTime: 0, - }, - }, -}); -const wrapper = ({ children }: { children: Node }) => ( - {children} -); - -describe('useAlertDataView', () => { - const observabilityAlertFeatureIds: ValidFeatureId[] = [ - AlertConsumers.APM, - AlertConsumers.INFRASTRUCTURE, - AlertConsumers.LOGS, - AlertConsumers.UPTIME, - ]; - - beforeEach(() => { - fetchAlertIndexNames.mockResolvedValue([ - '.alerts-observability.uptime.alerts-*', - '.alerts-observability.metrics.alerts-*', - '.alerts-observability.logs.alerts-*', - '.alerts-observability.apm.alerts-*', - ]); - fetchAlertFields.mockResolvedValue([{ data: ' fields' }]); - }); - - afterEach(() => { - queryClient.clear(); - jest.clearAllMocks(); - }); - - it('initially is loading and does not have data', async () => { - const mockedAsyncDataView = { - loading: true, - dataview: undefined, - }; - - const { result } = renderHook(() => useAlertDataViews(observabilityAlertFeatureIds), { - wrapper, - }); - - await waitFor(() => expect(result.current).toEqual(mockedAsyncDataView)); - }); - - it('fetch index names + fields for the provided o11y featureIds', async () => { - renderHook(() => useAlertDataViews(observabilityAlertFeatureIds), { - wrapper, - }); - - await waitFor(() => expect(fetchAlertIndexNames).toHaveBeenCalledTimes(1)); - expect(fetchAlertFields).toHaveBeenCalledTimes(1); - }); - - it('only fetch index names for security featureId', async () => { - renderHook(() => useAlertDataViews([AlertConsumers.SIEM]), { - wrapper, - }); - - await waitFor(() => expect(fetchAlertIndexNames).toHaveBeenCalledTimes(1)); - expect(fetchAlertFields).toHaveBeenCalledTimes(0); - }); - - it('Do not fetch anything if security and o11y featureIds are mixed together', async () => { - const { result } = renderHook( - () => useAlertDataViews([AlertConsumers.SIEM, AlertConsumers.LOGS]), - { - wrapper, - } - ); - - await waitFor(() => - expect(result.current).toEqual({ - loading: false, - dataview: undefined, - }) - ); - expect(fetchAlertIndexNames).toHaveBeenCalledTimes(0); - expect(fetchAlertFields).toHaveBeenCalledTimes(0); - }); - - it('if fetch throws error return no data', async () => { - fetchAlertIndexNames.mockRejectedValue('error'); - - const { result } = renderHook(() => useAlertDataViews(observabilityAlertFeatureIds), { - wrapper, - }); - - await waitFor(() => - expect(result.current).toEqual({ - loading: false, - dataview: undefined, - }) - ); - }); -}); diff --git a/x-pack/plugins/cases/public/components/system_actions/hooks/use_alert_data_view.ts b/x-pack/plugins/cases/public/components/system_actions/hooks/use_alert_data_view.ts deleted file mode 100644 index 863b07949af9d..0000000000000 --- a/x-pack/plugins/cases/public/components/system_actions/hooks/use_alert_data_view.ts +++ /dev/null @@ -1,161 +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'; -import type { DataView } from '@kbn/data-views-plugin/common'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; -import type { ValidFeatureId } from '@kbn/rule-data-utils'; -import { AlertConsumers } from '@kbn/rule-data-utils'; -import { useEffect, useMemo, useState } from 'react'; -import { useQuery } from '@tanstack/react-query'; -import type { TriggersAndActionsUiServices } from '@kbn/triggers-actions-ui-plugin/public'; -import { fetchAlertIndexNames } from './alert_index'; -import { fetchAlertFields } from './alert_fields'; - -export interface UserAlertDataViews { - dataViews?: DataView[]; - loading: boolean; -} - -export function useAlertDataViews(featureIds: ValidFeatureId[]): UserAlertDataViews { - const { - http, - data: dataService, - notifications: { toasts }, - } = useKibana().services; - const [dataViews, setDataViews] = useState(undefined); - const features = featureIds.sort().join(','); - const isOnlySecurity = featureIds.length === 1 && featureIds.includes(AlertConsumers.SIEM); - - const hasSecurityAndO11yFeatureIds = - featureIds.length > 1 && featureIds.includes(AlertConsumers.SIEM); - - const hasNoSecuritySolution = - featureIds.length > 0 && !isOnlySecurity && !hasSecurityAndO11yFeatureIds; - - const queryIndexNameFn = () => { - return fetchAlertIndexNames({ http, features }); - }; - - const queryAlertFieldsFn = () => { - return fetchAlertFields({ http, featureIds }); - }; - - const onErrorFn = () => { - toasts.addDanger( - i18n.translate('xpack.cases.systemActions.useAlertDataView.useAlertDataMessage', { - defaultMessage: 'Unable to load alert data view', - }) - ); - }; - - const { - data: indexNames, - isSuccess: isIndexNameSuccess, - isInitialLoading: isIndexNameInitialLoading, - isLoading: isIndexNameLoading, - } = useQuery({ - queryKey: ['loadAlertIndexNames', features], - queryFn: queryIndexNameFn, - onError: onErrorFn, - refetchOnWindowFocus: false, - enabled: featureIds.length > 0 && !hasSecurityAndO11yFeatureIds, - }); - - const { - data: alertFields, - isSuccess: isAlertFieldsSuccess, - isInitialLoading: isAlertFieldsInitialLoading, - isLoading: isAlertFieldsLoading, - } = useQuery({ - queryKey: ['loadAlertFields', features], - queryFn: queryAlertFieldsFn, - onError: onErrorFn, - refetchOnWindowFocus: false, - enabled: hasNoSecuritySolution, - }); - - useEffect(() => { - return () => { - dataViews?.map((dv) => dataService.dataViews.clearInstanceCache(dv.id)); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [dataViews]); - - // FUTURE ENGINEER this useEffect is for security solution user since - // we are using the user privilege to access the security alert index - useEffect(() => { - async function createDataView() { - const localDataview = await dataService?.dataViews.create({ - title: (indexNames ?? []).join(','), - allowNoIndex: true, - }); - setDataViews([localDataview]); - } - - if (isOnlySecurity && isIndexNameSuccess) { - createDataView(); - } - }, [dataService?.dataViews, indexNames, isIndexNameSuccess, isOnlySecurity]); - - // FUTURE ENGINEER this useEffect is for o11y and stack solution user since - // we are using the kibana user privilege to access the alert index - useEffect(() => { - if ( - indexNames && - alertFields && - !isOnlySecurity && - isAlertFieldsSuccess && - isIndexNameSuccess - ) { - setDataViews([ - { - title: (indexNames ?? []).join(','), - fieldFormatMap: {}, - fields: (alertFields ?? [])?.map((field) => { - return { - ...field, - ...(field.esTypes && field.esTypes.includes('flattened') ? { type: 'string' } : {}), - }; - }), - }, - ] as unknown as DataView[]); - } - }, [ - alertFields, - dataService?.dataViews, - indexNames, - isIndexNameSuccess, - isOnlySecurity, - isAlertFieldsSuccess, - ]); - - return useMemo( - () => ({ - dataViews, - loading: - featureIds.length === 0 || hasSecurityAndO11yFeatureIds - ? false - : isOnlySecurity - ? isIndexNameInitialLoading || isIndexNameLoading - : isIndexNameInitialLoading || - isIndexNameLoading || - isAlertFieldsInitialLoading || - isAlertFieldsLoading, - }), - [ - dataViews, - featureIds.length, - hasSecurityAndO11yFeatureIds, - isOnlySecurity, - isIndexNameInitialLoading, - isIndexNameLoading, - isAlertFieldsInitialLoading, - isAlertFieldsLoading, - ] - ); -} diff --git a/x-pack/plugins/cases/tsconfig.json b/x-pack/plugins/cases/tsconfig.json index 6bbc5cfd4e421..fbe05134b5bfd 100644 --- a/x-pack/plugins/cases/tsconfig.json +++ b/x-pack/plugins/cases/tsconfig.json @@ -73,9 +73,9 @@ "@kbn/datemath", "@kbn/core-logging-server-mocks", "@kbn/core-logging-browser-mocks", - "@kbn/data-views-plugin", "@kbn/core-http-router-server-internal", "@kbn/presentation-publishing", + "@kbn/alerts-ui-shared", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/cloud_security_posture/common/constants.ts b/x-pack/plugins/cloud_security_posture/common/constants.ts index 053dcc4867bdd..720251dee5a77 100644 --- a/x-pack/plugins/cloud_security_posture/common/constants.ts +++ b/x-pack/plugins/cloud_security_posture/common/constants.ts @@ -45,8 +45,11 @@ export const CLOUD_SECURITY_POSTURE_PACKAGE_NAME = 'cloud_security_posture'; export const CDR_MISCONFIGURATIONS_DATA_VIEW_NAME = 'Latest Cloud Security Misconfigurations'; export const CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX = 'security_solution_cdr_latest_misconfigurations'; -export const CDR_MISCONFIGURATIONS_INDEX_PATTERN = - 'logs-*_latest_misconfigurations_cdr,logs-cloud_security_posture.findings_latest-default'; +export const CDR_LATEST_NATIVE_MISCONFIGURATIONS_INDEX_PATTERN = + 'logs-cloud_security_posture.findings_latest-default'; +export const CDR_LATEST_THIRD_PARTY_MISCONFIGURATIONS_INDEX_PATTERN = + 'logs-*_latest_misconfigurations_cdr'; +export const CDR_MISCONFIGURATIONS_INDEX_PATTERN = `${CDR_LATEST_NATIVE_MISCONFIGURATIONS_INDEX_PATTERN},${CDR_LATEST_THIRD_PARTY_MISCONFIGURATIONS_INDEX_PATTERN}`; export const CDR_VULNERABILITIES_DATA_VIEW_NAME = 'Latest Cloud Security Vulnerabilities'; export const CDR_VULNERABILITIES_DATA_VIEW_ID_PREFIX = @@ -54,15 +57,11 @@ export const CDR_VULNERABILITIES_DATA_VIEW_ID_PREFIX = export const CDR_VULNERABILITIES_INDEX_PATTERN = 'logs-*_latest_vulnerabilities_cdr,logs-cloud_security_posture.vulnerabilities_latest-default'; -// TODO: REMOVE CSP_LATEST_FINDINGS_DATA_VIEW and replace it with LATEST_FINDINGS_INDEX_PATTERN -export const CSP_LATEST_FINDINGS_DATA_VIEW = 'logs-cloud_security_posture.findings_latest-*'; - export const FINDINGS_INDEX_NAME = 'logs-cloud_security_posture.findings'; export const FINDINGS_INDEX_PATTERN = 'logs-cloud_security_posture.findings-default*'; export const FINDINGS_INDEX_DEFAULT_NS = 'logs-cloud_security_posture.findings-default'; export const LATEST_FINDINGS_INDEX_TEMPLATE_NAME = 'logs-cloud_security_posture.findings_latest'; -export const LATEST_FINDINGS_INDEX_PATTERN = 'logs-cloud_security_posture.findings_latest-*'; export const LATEST_FINDINGS_INDEX_DEFAULT_NS = 'logs-cloud_security_posture.findings_latest-default'; diff --git a/x-pack/plugins/cloud_security_posture/public/common/api/use_data_view.ts b/x-pack/plugins/cloud_security_posture/public/common/api/use_data_view.ts index 6f75ed3dc3958..41b40da90a6d4 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/api/use_data_view.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/api/use_data_view.ts @@ -7,21 +7,24 @@ import { useQuery } from '@tanstack/react-query'; import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; import { CspClientPluginStartDeps } from '../../types'; /** * Hook to retrieve a Data View by it's Index Pattern title */ -export const useDataView = (indexPattern: string) => { +export const useDataView = (dataViewId: string) => { const { data: { dataViews }, + spaces, } = useKibana().services; - - return useQuery(['useDataView', indexPattern], async () => { - const [dataView] = await dataViews.find(indexPattern); - + return useQuery(['useDataView', dataViewId], async () => { + // Using default space if spaces is not available or for serverless projects where spaces are not enabled. + const currentSpaceId = spaces ? (await spaces.getActiveSpace()).id : DEFAULT_SPACE_ID; + const dataViewIdCurrentSpace = `${dataViewId}-${currentSpaceId}`; + const dataView = await dataViews.get(dataViewIdCurrentSpace); if (!dataView) { - throw new Error(`Data view not found [${indexPattern}]`); + throw new Error(`Data view not found [${dataViewIdCurrentSpace}]`); } return dataView; diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.ts b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.ts index 633d280b0654f..b5b0cdb84bd86 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.ts @@ -9,7 +9,7 @@ import { useCallback } from 'react'; import { useHistory } from 'react-router-dom'; import { Filter } from '@kbn/es-query'; import { - LATEST_FINDINGS_INDEX_PATTERN, + CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX, SECURITY_DEFAULT_DATA_VIEW_ID, } from '../../../common/constants'; import { findingsNavigation } from '../navigation/constants'; @@ -77,7 +77,7 @@ const useNavigate = (pathname: string, dataViewId = SECURITY_DEFAULT_DATA_VIEW_I }; export const useNavigateFindings = () => { - const { data } = useDataView(LATEST_FINDINGS_INDEX_PATTERN); + const { data } = useDataView(CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX); return useNavigate(findingsNavigation.findings_default.path, data?.id); }; 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 1c94500579e48..dc5cc9b4fd4a5 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 @@ -8,7 +8,7 @@ import React from 'react'; import { Redirect, useLocation } from 'react-router-dom'; import { Routes, Route } from '@kbn/shared-ux-router'; import { TrackApplicationView } from '@kbn/usage-collection-plugin/public'; -import { LATEST_FINDINGS_INDEX_PATTERN } from '../../../common/constants'; +import { CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX } from '../../../common/constants'; import { useCspSetupStatusApi } from '../../common/api/use_setup_status_api'; import { NoFindingsStates } from '../../components/no_findings_states'; import { CloudPosturePage, defaultLoadingRenderer } from '../../components/cloud_posture_page'; @@ -19,7 +19,7 @@ import { DataViewContext } from '../../common/contexts/data_view_context'; export const Configurations = () => { const location = useLocation(); - const dataViewQuery = useDataView(LATEST_FINDINGS_INDEX_PATTERN); + const dataViewQuery = useDataView(CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX); const { data: getSetupStatus, isLoading: getSetupStatusIsLoading } = useCspSetupStatusApi(); const hasConfigurationFindings = getSetupStatus?.kspm.status === 'indexed' || getSetupStatus?.cspm.status === 'indexed'; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx b/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx index a67a7bd873e4d..118ebb86e0d64 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/findings_flyout.test.tsx @@ -9,8 +9,8 @@ import userEvent from '@testing-library/user-event'; import { FindingsRuleFlyout } from './findings_flyout'; import { render, screen } from '@testing-library/react'; import { TestProvider } from '../../../test/test_provider'; +import { CDR_MISCONFIGURATIONS_INDEX_PATTERN } from '../../../../common/constants'; import { mockFindingsHit, mockWizFinding } from '../__mocks__/findings'; -import { LATEST_FINDINGS_INDEX_DEFAULT_NS } from '../../../../common/constants'; const onPaginate = jest.fn(); @@ -43,7 +43,7 @@ describe('', () => { getByText(mockFindingsHit.resource.id); getByText(mockFindingsHit.resource.name); getAllByText(mockFindingsHit.rule.section); - getByText(LATEST_FINDINGS_INDEX_DEFAULT_NS); + getByText(CDR_MISCONFIGURATIONS_INDEX_PATTERN); mockFindingsHit.rule.tags.forEach((tag) => { getAllByText(tag); }); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/overview_tab.tsx b/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/overview_tab.tsx index c23a6b7d82ddd..38c526df1e758 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/overview_tab.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/overview_tab.tsx @@ -25,8 +25,8 @@ import { truthy } from '../../../../common/utils/helpers'; import { CSP_MOMENT_FORMAT } from '../../../common/constants'; import { INTERNAL_FEATURE_FLAGS, - LATEST_FINDINGS_INDEX_DEFAULT_NS, - LATEST_FINDINGS_INDEX_PATTERN, + CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX, + CDR_MISCONFIGURATIONS_INDEX_PATTERN, } from '../../../../common/constants'; import { useDataView } from '../../../common/api/use_data_view'; import { useKibana } from '../../../common/hooks/use_kibana'; @@ -114,13 +114,13 @@ const getDetailsList = ( getDatasetDisplayName(data.data_stream?.dataset) || data.data_stream?.dataset || EMPTY_VALUE, }, { - title: i18n.translate('xpack.csp.findings.findingsFlyout.overviewTab.indexTitle', { - defaultMessage: 'Index', + title: i18n.translate('xpack.csp.findings.findingsFlyout.overviewTab.dataViewTitle', { + defaultMessage: 'Data View', }), description: discoverDataViewLink ? ( - {LATEST_FINDINGS_INDEX_DEFAULT_NS} + {CDR_MISCONFIGURATIONS_INDEX_PATTERN} ) : ( - LATEST_FINDINGS_INDEX_DEFAULT_NS + CDR_MISCONFIGURATIONS_INDEX_PATTERN ), }, ]; @@ -189,13 +189,13 @@ export const OverviewTab = ({ ruleFlyoutLink?: string; }) => { const { discover } = useKibana().services; - const latestFindingsDataView = useDataView(LATEST_FINDINGS_INDEX_PATTERN); + const cdrMisconfigurationsDataView = useDataView(CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX); // link will navigate to our dataview in discover, filtered by the data source of the finding const discoverDataViewLink = useMemo( () => discover.locator?.getRedirectUrl({ - dataViewId: latestFindingsDataView.data?.id, + dataViewId: cdrMisconfigurationsDataView.data?.id, ...(data.data_stream?.dataset && { filters: [ { @@ -212,7 +212,7 @@ export const OverviewTab = ({ ], }), }), - [data.data_stream?.dataset, discover.locator, latestFindingsDataView.data?.id] + [data.data_stream?.dataset, discover.locator, cdrMisconfigurationsDataView.data?.id] ); const hasEvidence = !isEmpty(data.result?.evidence); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_grouped_findings.tsx b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_grouped_findings.tsx index 5784e1e43bcf3..9c1125257520e 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_grouped_findings.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_grouped_findings.tsx @@ -10,7 +10,7 @@ import type { IKibanaSearchResponse } from '@kbn/search-types'; import { GenericBuckets, GroupingQuery, RootAggregation } from '@kbn/grouping/src'; import { useQuery } from '@tanstack/react-query'; import { lastValueFrom } from 'rxjs'; -import { CSP_LATEST_FINDINGS_DATA_VIEW } from '../../../../common/constants'; +import { CDR_MISCONFIGURATIONS_INDEX_PATTERN } from '../../../../common/constants'; import { useKibana } from '../../../common/hooks/use_kibana'; import { showErrorToast } from '../../../common/utils/show_error_toast'; @@ -69,7 +69,7 @@ export interface FindingsGroupingAggregation { export const getGroupedFindingsQuery = (query: GroupingQuery) => ({ ...query, - index: CSP_LATEST_FINDINGS_DATA_VIEW, + index: CDR_MISCONFIGURATIONS_INDEX_PATTERN, size: 0, }); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings.ts b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings.ts index d609617824269..3af41c5921416 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings.ts @@ -16,7 +16,7 @@ import { useKibana } from '../../../common/hooks/use_kibana'; import type { FindingsBaseEsQuery } from '../../../common/types'; import { getAggregationCount, getFindingsCountAggQuery } from '../utils/utils'; import { - CSP_LATEST_FINDINGS_DATA_VIEW, + CDR_MISCONFIGURATIONS_INDEX_PATTERN, LATEST_FINDINGS_RETENTION_POLICY, } from '../../../../common/constants'; import { MAX_FINDINGS_TO_LOAD } from '../../../common/constants'; @@ -48,7 +48,7 @@ export const getFindingsQuery = ( const mutedRulesFilterQuery = buildMutedRulesFilter(rulesStates); return { - index: CSP_LATEST_FINDINGS_DATA_VIEW, + index: CDR_MISCONFIGURATIONS_INDEX_PATTERN, sort: getMultiFieldsSort(sort), size: MAX_FINDINGS_TO_LOAD, aggs: getFindingsCountAggQuery(), diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.test.ts b/x-pack/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.test.ts index 7c73dacbd5e5c..db7d856e23aa7 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.test.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/utils/get_filters.test.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { CSP_LATEST_FINDINGS_DATA_VIEW } from '../../../../common/constants'; +import { CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX } from '../../../../common/constants'; import { createStubDataView } from '@kbn/data-views-plugin/common/stubs'; import { DataView } from '@kbn/data-views-plugin/common'; import { getFilters } from './get_filters'; @@ -16,7 +16,7 @@ describe('Get Filters', () => { beforeEach(() => { dataViewMock = createStubDataView({ spec: { - id: CSP_LATEST_FINDINGS_DATA_VIEW, + id: CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX, fields: { a: { searchable: false, diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities.tsx b/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities.tsx index 7f48cf18fb044..5940b022a0b90 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; import { Routes, Route } from '@kbn/shared-ux-router'; -import { LATEST_VULNERABILITIES_INDEX_PATTERN } from '../../../common/constants'; +import { CDR_VULNERABILITIES_DATA_VIEW_ID_PREFIX } from '../../../common/constants'; import { NoVulnerabilitiesStates } from '../../components/no_vulnerabilities_states'; import { useCspSetupStatusApi } from '../../common/api/use_setup_status_api'; import { CloudPosturePage } from '../../components/cloud_posture_page'; @@ -16,7 +16,7 @@ import { LatestVulnerabilitiesContainer } from './latest_vulnerabilities_contain import { DataViewContext } from '../../common/contexts/data_view_context'; export const Vulnerabilities = () => { - const dataViewQuery = useDataView(LATEST_VULNERABILITIES_INDEX_PATTERN); + const dataViewQuery = useDataView(CDR_VULNERABILITIES_DATA_VIEW_ID_PREFIX); const getSetupStatus = useCspSetupStatusApi(); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx b/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx index 3a1d83e4189fc..cb975088c5c8e 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilties.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import Chance from 'chance'; import { Vulnerabilities } from './vulnerabilities'; import { - CSP_LATEST_FINDINGS_DATA_VIEW, + CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX, LATEST_VULNERABILITIES_INDEX_DEFAULT_NS, VULN_MGMT_POLICY_TEMPLATE, } from '../../../common/constants'; @@ -58,7 +58,7 @@ beforeEach(() => { status: 'success', data: createStubDataView({ spec: { - id: CSP_LATEST_FINDINGS_DATA_VIEW, + id: CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX, }, }), }); diff --git a/x-pack/plugins/cloud_security_posture/public/test/mock_server/handlers/dataview.handlers.mock.ts b/x-pack/plugins/cloud_security_posture/public/test/mock_server/handlers/dataview.handlers.mock.ts index 266f7f652d299..fb7a25fbcdadf 100644 --- a/x-pack/plugins/cloud_security_posture/public/test/mock_server/handlers/dataview.handlers.mock.ts +++ b/x-pack/plugins/cloud_security_posture/public/test/mock_server/handlers/dataview.handlers.mock.ts @@ -6,6 +6,10 @@ */ import { http, HttpResponse } from 'msw'; +import { + CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX, + CDR_MISCONFIGURATIONS_INDEX_PATTERN, +} from '../../../../common/constants'; const generateDataViewField = (name: string, type: 'string' | 'date' = 'string') => ({ name, @@ -45,3 +49,33 @@ export const defaultDataViewFindHandler = http.get( }); } ); + +export const defaultDataViewGetHandler = http.get( + 'http://localhost/internal/data_views/', + ({ request }) => { + const url = new URL(request.url); + const id = url.searchParams.get('id'); + + // if (id?.includes('logs-cloud_security_posture.findings_latest-*')) { + if (id?.includes(CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX)) { + return HttpResponse.json({ + fields: [ + generateDataViewField('@timestamp', 'date'), + generateDataViewField('resource.id'), + generateDataViewField('resource.name'), + generateDataViewField('resource.sub_type'), + generateDataViewField('result.evaluation'), + generateDataViewField('rule.benchmark.rule_number'), + generateDataViewField('rule.name'), + generateDataViewField('rule.section'), + ], + indices: [CDR_MISCONFIGURATIONS_INDEX_PATTERN], + }); + } + + return HttpResponse.json({ + fields: [], + indices: [], + }); + } +); diff --git a/x-pack/plugins/cloud_security_posture/public/test/mock_server/handlers/index.ts b/x-pack/plugins/cloud_security_posture/public/test/mock_server/handlers/index.ts index 311e3ba1b7a27..ae140c0f24426 100644 --- a/x-pack/plugins/cloud_security_posture/public/test/mock_server/handlers/index.ts +++ b/x-pack/plugins/cloud_security_posture/public/test/mock_server/handlers/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { defaultDataViewFindHandler } from './dataview.handlers.mock'; +import { defaultDataViewFindHandler, defaultDataViewGetHandler } from './dataview.handlers.mock'; import { defaultFleetCspPackageHandler } from './fleet.handlers.mock'; import { defaultApiLicensingInfo } from './licensing.handlers.mock'; @@ -18,4 +18,5 @@ export const defaultHandlers = [ defaultApiLicensingInfo, defaultDataViewFindHandler, defaultFleetCspPackageHandler, + defaultDataViewGetHandler, ]; diff --git a/x-pack/plugins/cloud_security_posture/public/test/mock_server/mock_server.ts b/x-pack/plugins/cloud_security_posture/public/test/mock_server/mock_server.ts index bef10309fb210..999f130c275cc 100644 --- a/x-pack/plugins/cloud_security_posture/public/test/mock_server/mock_server.ts +++ b/x-pack/plugins/cloud_security_posture/public/test/mock_server/mock_server.ts @@ -131,6 +131,26 @@ export const getMockServerDependencies = () => { return [dataView]; }, + get: async (id: string) => { + const response = await fetch(`${MOCK_SERVER_BASE_URL}/internal/data_views/?id=${id}`); + + const responseJson = await response.json(); + + const fields = responseJson.fields.reduce((acc: any, field: any) => { + acc[field.name] = field; + return acc; + }, {}); + + const dataView = createStubDataView({ + spec: { + id, + title: responseJson.indices[0], + fields, + }, + }); + + return dataView; + }, }, }, licensing: { diff --git a/x-pack/plugins/cloud_security_posture/public/types.ts b/x-pack/plugins/cloud_security_posture/public/types.ts index 4b8499fdd82a0..d16d4e2b7dcbb 100755 --- a/x-pack/plugins/cloud_security_posture/public/types.ts +++ b/x-pack/plugins/cloud_security_posture/public/types.ts @@ -25,6 +25,7 @@ import type { UsageCollectionStart, } from '@kbn/usage-collection-plugin/public'; import { SharePluginStart } from '@kbn/share-plugin/public'; +import { SpacesPluginStart } from '@kbn/spaces-plugin/public'; import type { CspRouterProps } from './application/csp_router'; import type { CloudSecurityPosturePageId } from './common/navigation/types'; @@ -67,6 +68,7 @@ export interface CspClientPluginStartDeps { licensing: LicensingPluginStart; share: SharePluginStart; storage: Storage; + spaces: SpacesPluginStart; // optional usageCollection?: UsageCollectionStart; diff --git a/x-pack/plugins/cloud_security_posture/server/create_indices/latest_indices.ts b/x-pack/plugins/cloud_security_posture/server/create_indices/latest_indices.ts index 5bfcb4a504c37..91c7ae74de9e8 100644 --- a/x-pack/plugins/cloud_security_posture/server/create_indices/latest_indices.ts +++ b/x-pack/plugins/cloud_security_posture/server/create_indices/latest_indices.ts @@ -7,7 +7,7 @@ import { FINDINGS_INDEX_NAME, - LATEST_FINDINGS_INDEX_PATTERN, + CDR_LATEST_NATIVE_MISCONFIGURATIONS_INDEX_PATTERN, LATEST_FINDINGS_INDEX_TEMPLATE_NAME, LATEST_FINDINGS_INDEX_DEFAULT_NS, VULNERABILITIES_INDEX_NAME, @@ -20,7 +20,7 @@ import { LatestIndexConfig } from './types'; export const latestIndexConfigs: LatestIndexConfig = { findings: { indexName: FINDINGS_INDEX_NAME, - indexPattern: LATEST_FINDINGS_INDEX_PATTERN, + indexPattern: CDR_LATEST_NATIVE_MISCONFIGURATIONS_INDEX_PATTERN, indexTemplateName: LATEST_FINDINGS_INDEX_TEMPLATE_NAME, indexDefaultName: LATEST_FINDINGS_INDEX_DEFAULT_NS, }, diff --git a/x-pack/plugins/cloud_security_posture/server/fleet_integration/fleet_integration.test.ts b/x-pack/plugins/cloud_security_posture/server/fleet_integration/fleet_integration.test.ts deleted file mode 100644 index 7853df051f0fa..0000000000000 --- a/x-pack/plugins/cloud_security_posture/server/fleet_integration/fleet_integration.test.ts +++ /dev/null @@ -1,87 +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 { createPackagePolicyServiceMock } from '@kbn/fleet-plugin/server/mocks'; -import { ListResult, PackagePolicy } from '@kbn/fleet-plugin/common'; -import { - isCspPackagePolicyInstalled, - onPackagePolicyPostCreateCallback, -} from './fleet_integration'; -import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; -import { createPackagePolicyMock } from '@kbn/fleet-plugin/common/mocks'; -import { CLOUD_SECURITY_POSTURE_PACKAGE_NAME } from '../../common/constants'; -import { SavedObjectsFindResponse } from '@kbn/core-saved-objects-api-server'; -import { savedObjectsClientMock } from '@kbn/core/server/mocks'; - -describe('is Csp package installed tests', () => { - const logger = loggingSystemMock.createLogger(); - const mockSoClient = savedObjectsClientMock.create(); - const packagePolicyService = createPackagePolicyServiceMock(); - - beforeEach(() => { - return jest.clearAllMocks(); - }); - it.each([ - ['cloud_security_posture-41308bcdaaf665761478bb6f0d55555', ['default']], - ['cloud_security_posture-41308bcdaaf665761478bb6f0d88888', ['foo']], - ])( - 'validate that all index pattern are available cross spaces', - async (id: string, namespaces: string[]) => { - const mockPackagePolicy = createPackagePolicyMock(); - mockPackagePolicy.package!.name = CLOUD_SECURITY_POSTURE_PACKAGE_NAME; - mockSoClient.find.mockResolvedValueOnce({ - saved_objects: [ - { - type: 'index-pattern', - id, - namespaces, - }, - ], - pit_id: undefined, - } as unknown as SavedObjectsFindResponse); - - await onPackagePolicyPostCreateCallback(logger, mockPackagePolicy, mockSoClient); - - expect(mockSoClient.updateObjectsSpaces).toHaveBeenCalled(); - expect(mockSoClient.updateObjectsSpaces).lastCalledWith( - [ - { - id, - type: 'index-pattern', - }, - ], - ['*'], - [] - ); - } - ); - it.each([ - [1, [createPackagePolicyMock()], true], - [0, [], false], - ])( - 'isCspPackagePolicyInstalled should return true when other packages exist', - async (total, items, expectedCspPolicyResponse) => { - packagePolicyService.list.mockImplementationOnce( - async (): Promise> => { - return { - items, - total, - page: 1, - perPage: 1, - }; - } - ); - - const isInstalled = await isCspPackagePolicyInstalled( - packagePolicyService, - mockSoClient, - logger - ); - expect(isInstalled).toEqual(expectedCspPolicyResponse); - } - ); -}); diff --git a/x-pack/plugins/cloud_security_posture/server/fleet_integration/fleet_integration.ts b/x-pack/plugins/cloud_security_posture/server/fleet_integration/fleet_integration.ts index a3d166cf69688..58527fd01bece 100644 --- a/x-pack/plugins/cloud_security_posture/server/fleet_integration/fleet_integration.ts +++ b/x-pack/plugins/cloud_security_posture/server/fleet_integration/fleet_integration.ts @@ -7,38 +7,7 @@ import type { Logger } from '@kbn/core/server'; import { SavedObjectsClientContract } from '@kbn/core/server'; import { PackagePolicyClient } from '@kbn/fleet-plugin/server'; -import { PackagePolicy } from '@kbn/fleet-plugin/common'; -import { DataViewSavedObjectAttrs } from '@kbn/data-views-plugin/common'; import { CSP_FLEET_PACKAGE_KUERY } from '../../common/utils/helpers'; -import { CLOUD_SECURITY_POSTURE_PACKAGE_NAME } from '../../common/constants'; - -export const onPackagePolicyPostCreateCallback = async ( - logger: Logger, - packagePolicy: PackagePolicy, - savedObjectsClient: SavedObjectsClientContract -): Promise => { - return addDataViewToAllSpaces(savedObjectsClient); -}; - -async function addDataViewToAllSpaces(savedObjectsClient: SavedObjectsClientContract) { - const cspmDataViews = await savedObjectsClient.find({ - type: 'index-pattern', - fields: ['title'], - search: CLOUD_SECURITY_POSTURE_PACKAGE_NAME + '*', - searchFields: ['title'], - perPage: 100, - }); - - await Promise.all( - cspmDataViews.saved_objects.map((dataView) => - savedObjectsClient.updateObjectsSpaces( - [{ id: dataView.id, type: 'index-pattern' }], - ['*'], - [] - ) - ) - ); -} export const isCspPackagePolicyInstalled = async ( packagePolicyClient: PackagePolicyClient, diff --git a/x-pack/plugins/cloud_security_posture/server/plugin.test.ts b/x-pack/plugins/cloud_security_posture/server/plugin.test.ts index 9b6d970640480..9707bc9864909 100644 --- a/x-pack/plugins/cloud_security_posture/server/plugin.test.ts +++ b/x-pack/plugins/cloud_security_posture/server/plugin.test.ts @@ -49,7 +49,6 @@ import { } from '@kbn/core/server'; import { securityMock } from '@kbn/security-plugin/server/mocks'; import { licensingMock } from '@kbn/licensing-plugin/server/mocks'; -import * as onPackagePolicyPostCreateCallback from './fleet_integration/fleet_integration'; const chance = new Chance(); @@ -151,58 +150,6 @@ describe('Cloud Security Posture Plugin', () => { expect(spy).toHaveBeenCalledTimes(0); }); - it('should initialize when new package is created', async () => { - const soClient = savedObjectsClientMock.create(); - const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - fleetMock.packageService.asInternalUser.getInstallation.mockImplementationOnce( - async (): Promise => { - return; - } - ); - - const onPackagePolicyPostCreateCallbackSpy = jest - .spyOn(onPackagePolicyPostCreateCallback, 'onPackagePolicyPostCreateCallback') - .mockResolvedValue(); - - const packageMock = createPackagePolicyMock(); - packageMock.package!.name = CLOUD_SECURITY_POSTURE_PACKAGE_NAME; - - const packagePolicyPostCreateCallbacks: PostPackagePolicyPostCreateCallback[] = []; - fleetMock.registerExternalCallback.mockImplementation((...args) => { - if (args[0] === 'packagePolicyPostCreate') { - packagePolicyPostCreateCallbacks.push(args[1]); - } - }); - - const context = coreMock.createPluginInitializerContext(); - plugin = new CspPlugin(context); - const spy = jest.spyOn(plugin, 'initialize').mockImplementation(); - - // Act - await plugin.start(coreMock.createStart(), mockPlugins); - await mockPlugins.fleet.fleetSetupCompleted(); - - // Assert - expect(onPackagePolicyPostCreateCallbackSpy).not.toHaveBeenCalled(); - expect(fleetMock.packageService.asInternalUser.getInstallation).toHaveBeenCalledTimes(1); - expect(spy).toHaveBeenCalledTimes(0); - - expect(packagePolicyPostCreateCallbacks.length).toBeGreaterThan(0); - - for (const cb of packagePolicyPostCreateCallbacks) { - await cb( - packageMock, - soClient, - esClient, - contextMock, - httpServerMock.createKibanaRequest() - ); - } - - expect(onPackagePolicyPostCreateCallbackSpy).toHaveBeenCalled(); - expect(spy).toHaveBeenCalledTimes(1); - }); - it('should not initialize when other package is created', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; diff --git a/x-pack/plugins/cloud_security_posture/server/plugin.ts b/x-pack/plugins/cloud_security_posture/server/plugin.ts index 561d1bcaa7efd..f3a0192149142 100755 --- a/x-pack/plugins/cloud_security_posture/server/plugin.ts +++ b/x-pack/plugins/cloud_security_posture/server/plugin.ts @@ -38,10 +38,7 @@ import { setupRoutes } from './routes/setup_routes'; import { cspBenchmarkRule, cspSettings } from './saved_objects'; import { initializeCspIndices } from './create_indices/create_indices'; import { initializeCspTransforms } from './create_transforms/create_transforms'; -import { - isCspPackagePolicyInstalled, - onPackagePolicyPostCreateCallback, -} from './fleet_integration/fleet_integration'; +import { isCspPackagePolicyInstalled } from './fleet_integration/fleet_integration'; import { CLOUD_SECURITY_POSTURE_PACKAGE_NAME } from '../common/constants'; import { removeFindingsStatsTask, @@ -168,8 +165,6 @@ export class CspPlugin ): Promise => { if (isCspPackage(packagePolicy.package?.name)) { await this.initialize(core, plugins.taskManager); - await onPackagePolicyPostCreateCallback(this.logger, packagePolicy, soClient); - return packagePolicy; } diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts index 31b80b880bcc9..63a9201b1f265 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts @@ -45,7 +45,7 @@ export const defineBulkActionCspBenchmarkRulesRoute = (router: CspRouter) => access: 'internal', path: CSP_BENCHMARK_RULES_BULK_ACTION_ROUTE_PATH, options: { - tags: ['access:cloud-security-posture-read'], + tags: ['access:cloud-security-posture-all'], }, }) .addVersion( diff --git a/x-pack/plugins/cloud_security_posture/server/saved_objects/data_views.ts b/x-pack/plugins/cloud_security_posture/server/saved_objects/data_views.ts index b18db2bb3a25a..8a9f44b3aec46 100644 --- a/x-pack/plugins/cloud_security_posture/server/saved_objects/data_views.ts +++ b/x-pack/plugins/cloud_security_posture/server/saved_objects/data_views.ts @@ -14,6 +14,7 @@ import { import { DataViewAttributes } from '@kbn/data-views-plugin/common'; import { SpacesServiceStart } from '@kbn/spaces-plugin/server'; import { DataViewsServerPluginStart } from '@kbn/data-views-plugin/server'; +import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; import { CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX, @@ -25,7 +26,6 @@ import { } from '../../common/constants'; const DATA_VIEW_TIME_FIELD = '@timestamp'; -const DEFAULT_SPACE_ID = 'default'; const getDataViewSafe = async ( soClient: ISavedObjectsRepository, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/mappings/mappings_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/mappings/mappings_logic.ts index d3db6837d0b59..8abf649049b0d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/mappings/mappings_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/mappings/mappings_logic.ts @@ -25,6 +25,6 @@ export const getMappings = async ({ indexName }: GetMappingsArgs) => { }; export const mappingsWithPropsApiLogic = (indexName: string) => - createApiLogic(['mappings_api_logic', indexName], getMappings); + createApiLogic(['mappings_api_logic_with_props', indexName], getMappings); export const MappingsApiLogic = createApiLogic(['mappings_api_logic'], getMappings); diff --git a/x-pack/plugins/fleet/common/constants/epm.ts b/x-pack/plugins/fleet/common/constants/epm.ts index adfbcb299238b..6509786f2c53e 100644 --- a/x-pack/plugins/fleet/common/constants/epm.ts +++ b/x-pack/plugins/fleet/common/constants/epm.ts @@ -93,6 +93,7 @@ export const agentAssetTypes = { export const dataTypes = { Logs: 'logs', Metrics: 'metrics', + Traces: 'traces', } as const; // currently identical but may be a subset or otherwise different some day diff --git a/x-pack/plugins/fleet/common/services/generate_new_agent_policy.test.ts b/x-pack/plugins/fleet/common/services/generate_new_agent_policy.test.ts index bc4a6b55f75ee..82bda9d6e28ae 100644 --- a/x-pack/plugins/fleet/common/services/generate_new_agent_policy.test.ts +++ b/x-pack/plugins/fleet/common/services/generate_new_agent_policy.test.ts @@ -15,7 +15,7 @@ describe('generateNewAgentPolicyWithDefaults', () => { name: '', description: '', namespace: 'default', - monitoring_enabled: ['logs', 'metrics'], + monitoring_enabled: ['logs', 'metrics', 'traces'], inactivity_timeout: 1209600, is_protected: false, }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/index.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/index.test.tsx index 729bbb3a903ed..ac7d0e9db77fc 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/index.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/index.test.tsx @@ -491,7 +491,7 @@ describe('When on the package policy create page', () => { expect(sendCreateAgentPolicy as jest.MockedFunction).toHaveBeenCalledWith( { description: '', - monitoring_enabled: ['logs', 'metrics'], + monitoring_enabled: ['logs', 'metrics', 'traces'], name: 'Agent policy 2', namespace: 'default', inactivity_timeout: 1209600, @@ -526,7 +526,7 @@ describe('When on the package policy create page', () => { expect(sendCreateAgentPolicy as jest.MockedFunction).toHaveBeenCalledWith( { description: '', - monitoring_enabled: ['logs', 'metrics'], + monitoring_enabled: ['logs', 'metrics', 'traces'], name: 'Agent policy 2', namespace: 'default', inactivity_timeout: 1209600, @@ -826,7 +826,7 @@ describe('When on the package policy create page', () => { expect(sendGetOneAgentPolicy).not.toHaveBeenCalled(); expect(sendCreateAgentPolicy).toHaveBeenCalledWith( expect.objectContaining({ - monitoring_enabled: ['logs', 'metrics'], + monitoring_enabled: ['logs', 'metrics', 'traces'], name: 'Agent policy 1', }), { withSysMonitoring: true } diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.test.tsx index 8e52ced483d72..6669f3dfa332f 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.test.tsx @@ -541,7 +541,7 @@ describe('edit package policy page', () => { expect(sendCreateAgentPolicy as jest.MockedFunction).toHaveBeenCalledWith( { description: '', - monitoring_enabled: ['logs', 'metrics'], + monitoring_enabled: ['logs', 'metrics', 'traces'], name: 'Agent policy 2', namespace: 'default', inactivity_timeout: 1209600, diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/category_facets.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/category_facets.tsx index 2276d2df1924a..031a972e30851 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/category_facets.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/category_facets.tsx @@ -89,6 +89,14 @@ export function CategoryFacets({ id={category.id} quantity={category.count} onClick={() => onCategoryChange(category)} + aria-label={i18n.translate('xpack.fleet.epmList.facetButton.ariaLabel', { + defaultMessage: + '{key}, {count} {count, plural, one { integration } other { integrations }}', + values: { + key: category.title, + count: category.count, + }, + })} > {category.title} diff --git a/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/install.ts b/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/install.ts index 6f1390f5e17cd..3ae1c4a6cffba 100644 --- a/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/install.ts @@ -12,7 +12,7 @@ import { appContextService } from '../../..'; import { getPackageSavedObjects } from '../../packages/get'; const INDEX_PATTERN_SAVED_OBJECT_TYPE = 'index-pattern'; -export const indexPatternTypes = Object.values(dataTypes); +export const indexPatternTypes = [dataTypes.Logs, dataTypes.Metrics]; export function getIndexPatternSavedObjects() { return indexPatternTypes.map((indexPatternType) => ({ diff --git a/x-pack/plugins/fleet/server/services/package_policy.ts b/x-pack/plugins/fleet/server/services/package_policy.ts index cc710db8d3dae..d9605880c1572 100644 --- a/x-pack/plugins/fleet/server/services/package_policy.ts +++ b/x-pack/plugins/fleet/server/services/package_policy.ts @@ -1045,6 +1045,8 @@ class PackagePolicyClientImpl implements PackagePolicyClient { error: Error | SavedObjectError; }> = []; + const secretStorageEnabled = await isSecretStorageEnabled(esClient, soClient); + await pMap(packagePolicyUpdates, async (packagePolicyUpdate) => { try { const id = packagePolicyUpdate.id; @@ -1076,7 +1078,7 @@ class PackagePolicyClientImpl implements PackagePolicyClient { if (pkgInfoAndAsset) { const { pkgInfo, assetsMap } = pkgInfoAndAsset; validatePackagePolicyOrThrow(packagePolicy, pkgInfo); - if (await isSecretStorageEnabled(esClient, soClient)) { + if (secretStorageEnabled) { const secretsRes = await extractAndUpdateSecrets({ oldPackagePolicy, packagePolicyUpdate: { ...restOfPackagePolicy, inputs }, diff --git a/x-pack/plugins/fleet/server/types/models/agent_policy.ts b/x-pack/plugins/fleet/server/types/models/agent_policy.ts index 43928b3737e21..ca5858dccb5c5 100644 --- a/x-pack/plugins/fleet/server/types/models/agent_policy.ts +++ b/x-pack/plugins/fleet/server/types/models/agent_policy.ts @@ -56,7 +56,11 @@ export const AgentPolicyBaseSchema = { }), monitoring_enabled: schema.maybe( schema.arrayOf( - schema.oneOf([schema.literal(dataTypes.Logs), schema.literal(dataTypes.Metrics)]) + schema.oneOf([ + schema.literal(dataTypes.Logs), + schema.literal(dataTypes.Metrics), + schema.literal(dataTypes.Traces), + ]) ) ), keep_monitoring_alive: schema.maybe(schema.boolean({ defaultValue: false })), diff --git a/x-pack/plugins/integration_assistant/__jest__/fixtures/categorization.ts b/x-pack/plugins/integration_assistant/__jest__/fixtures/categorization.ts index 75ef8069294b5..31c25bc0f8a24 100644 --- a/x-pack/plugins/integration_assistant/__jest__/fixtures/categorization.ts +++ b/x-pack/plugins/integration_assistant/__jest__/fixtures/categorization.ts @@ -57,6 +57,7 @@ export const categorizationExpectedResults = { field: 'event.type', value: ['change'], if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", + allow_duplicates: false, }, }, { @@ -64,6 +65,7 @@ export const categorizationExpectedResults = { field: 'event.category', value: ['database'], if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", + allow_duplicates: false, }, }, { @@ -89,69 +91,53 @@ export const categorizationExpectedResults = { export const categorizationInitialMockedResponse = [ { - append: { - field: 'event.type', - value: ['creation'], - if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", - }, + field: 'event.type', + value: ['creation'], + if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", }, { - append: { - field: 'event.category', - value: ['database'], - if: "ctx.mysql_enterprise.audit.general_data.sql_command == 'create_db'", - }, + field: 'event.category', + value: ['database'], + if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", }, ]; export const categorizationErrorMockedResponse = [ { - append: { - field: 'event.type', - value: ['creation'], - if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", - }, + field: 'event.type', + value: ['creation'], + if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", }, { - append: { - field: 'event.category', - value: ['database'], - if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", - }, + field: 'event.category', + value: ['database'], + if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", }, ]; export const categorizationInvalidMockedResponse = [ { - append: { - field: 'event.type', - value: ['change'], - if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", - }, + field: 'event.type', + value: ['change'], + if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", }, { - append: { - field: 'event.category', - value: ['database'], - if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", - }, + field: 'event.category', + value: ['database'], + if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", }, ]; export const categorizationReviewMockedResponse = [ { - append: { - field: 'event.type', - value: ['change'], - if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", - }, + field: 'event.type', + value: ['change'], + if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", }, { - append: { - field: 'event.category', - value: ['database'], - if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", - }, + field: 'event.category', + value: ['database'], + if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", }, ]; @@ -183,45 +169,39 @@ export const categorizationTestState = { packageName: 'testpackage', dataStreamName: 'testDataStream', errors: { test: 'testerror' }, + previousError: 'testprevious', + previousInvalidCategorization: 'testinvalid', pipelineResults: [{ test: 'testresult' }], finalized: false, reviewed: false, currentPipeline: { test: 'testpipeline' }, currentProcessors: [ { - append: { - field: 'event.type', - value: ['creation'], - if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", - }, + field: 'event.type', + value: ['creation'], + if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", }, { - append: { - field: 'event.category', - value: ['database'], - if: "ctx.mysql_enterprise.audit.general_data.sql_command == 'create_db'", - }, + field: 'event.category', + value: ['database'], + if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", }, ], - invalidCategorization: { test: 'testinvalid' }, + invalidCategorization: [{ test: 'testinvalid' }], initialPipeline: categorizationInitialPipeline, results: { test: 'testresults' }, }; export const categorizationMockProcessors = [ { - append: { - field: 'event.type', - value: ['creation'], - if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", - }, + field: 'event.type', + value: ['creation'], + if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", }, { - append: { - field: 'event.category', - value: ['database'], - if: "ctx.mysql_enterprise.audit.general_data.sql_command == 'create_db'", - }, + field: 'event.category', + value: ['database'], + if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", }, ]; @@ -240,13 +220,15 @@ export const categorizationExpectedHandlerResponse = { field: 'event.type', value: ['creation'], if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", + allow_duplicates: false, }, }, { append: { field: 'event.category', value: ['database'], - if: "ctx.mysql_enterprise.audit.general_data.sql_command == 'create_db'", + if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", + allow_duplicates: false, }, }, { @@ -270,18 +252,14 @@ export const categorizationExpectedHandlerResponse = { }, currentProcessors: [ { - append: { - field: 'event.type', - value: ['creation'], - if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", - }, + field: 'event.type', + value: ['creation'], + if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", }, { - append: { - field: 'event.category', - value: ['database'], - if: "ctx.mysql_enterprise.audit.general_data.sql_command == 'create_db'", - }, + field: 'event.category', + value: ['database'], + if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", }, ], reviewed: false, diff --git a/x-pack/plugins/integration_assistant/__jest__/fixtures/related.ts b/x-pack/plugins/integration_assistant/__jest__/fixtures/related.ts index 3a2b4100686dd..aa787c714248b 100644 --- a/x-pack/plugins/integration_assistant/__jest__/fixtures/related.ts +++ b/x-pack/plugins/integration_assistant/__jest__/fixtures/related.ts @@ -55,7 +55,7 @@ export const relatedExpectedResults = { { append: { field: 'related.ip', - value: ['{{{source.ip}}}'], + value: '{{{source.ip}}}', allow_duplicates: false, if: 'ctx.source?.ip != null', }, @@ -63,7 +63,7 @@ export const relatedExpectedResults = { { append: { field: 'related.ip', - value: ['{{{destination.ip}}}'], + value: '{{{destination.ip}}}', allow_duplicates: false, if: 'ctx.destination?.ip != null', }, @@ -91,58 +91,38 @@ export const relatedExpectedResults = { export const relatedInitialMockedResponse = [ { - append: { - field: 'related.ip', - value: ['{{{source.ip}?.split(":")[0]}}'], - allow_duplicates: false, - if: 'ctx.source?.ip != null', - }, + field: 'related.ip', + value_field: 'source.ip', + if: 'ctx.source?.ip != null', }, { - append: { - field: 'related.ip', - value: ['{{{destination.ip}}}'], - allow_duplicates: false, - if: 'ctx.destination?.ip != null', - }, + field: 'related.ip', + value_field: 'destination.ip', }, ]; export const relatedErrorMockedResponse = [ { - append: { - field: 'related.ip', - value: ['{{{source.ip}}}'], - allow_duplicates: false, - if: 'ctx.source?.ip != null', - }, + field: 'related.ip', + value_field: 'source.ip', }, { - append: { - field: 'related.ip', - value: ['{{{destination.ip}}}'], - allow_duplicates: false, - if: 'ctx.destination?.ip != null', - }, + field: 'related.ip', + value_field: 'destination.ip', + if: 'ctx.destination?.ip != null', }, ]; export const relatedReviewMockedResponse = [ { - append: { - field: 'related.ip', - value: ['{{{source.ip}}}'], - allow_duplicates: false, - if: 'ctx.source?.ip != null', - }, + field: 'related.ip', + value_field: 'source.ip', + if: 'ctx.source?.ip != null', }, { - append: { - field: 'related.ip', - value: ['{{{destination.ip}}}'], - allow_duplicates: false, - if: 'ctx.destination?.ip != null', - }, + field: 'related.ip', + value_field: 'destination.ip', + if: 'ctx.destination?.ip != null', }, ]; @@ -165,26 +145,21 @@ export const relatedTestState = { packageName: 'testpackage', dataStreamName: 'testDataStream', errors: { test: 'testerror' }, + previousError: 'testerror', pipelineResults: [{ test: 'testresult' }], finalized: false, reviewed: false, currentPipeline: { test: 'testpipeline' }, currentProcessors: [ { - append: { - field: 'related.ip', - value: ['{{{source.ip}?.split(":")[0]}}'], - allow_duplicates: false, - if: 'ctx.source?.ip != null', - }, + field: 'related.ip', + value_field: 'source.ip', + if: 'ctx.source?.ip != null', }, { - append: { - field: 'related.ip', - value: ['{{{destination.ip}}}'], - allow_duplicates: false, - if: 'ctx.destination?.ip != null', - }, + field: 'related.ip', + value_field: 'destination.ip', + if: 'ctx.destination?.ip != null', }, ], initialPipeline: relatedInitialPipeline, @@ -194,20 +169,13 @@ export const relatedTestState = { export const relatedMockProcessors = [ { - append: { - field: 'related.ip', - value: ['{{{source.ip}?.split(":")[0]}}'], - allow_duplicates: false, - if: 'ctx.source?.ip != null', - }, + field: 'related.user', + value_field: 'source.user.id', }, { - append: { - field: 'related.ip', - value: ['{{{destination.ip}}}'], - allow_duplicates: false, - if: 'ctx.destination?.ip != null', - }, + field: 'related.ip', + value_field: 'destination.ip', + if: 'ctx.destination?.ip != null', }, ]; @@ -223,16 +191,16 @@ export const relatedExpectedHandlerResponse = { }, { append: { - field: 'related.ip', - value: ['{{{source.ip}?.split(":")[0]}}'], + field: 'related.user', + value: '{{{source.user.id}}}', allow_duplicates: false, - if: 'ctx.source?.ip != null', + if: 'ctx.source?.user?.id != null', }, }, { append: { field: 'related.ip', - value: ['{{{destination.ip}}}'], + value: '{{{destination.ip}}}', allow_duplicates: false, if: 'ctx.destination?.ip != null', }, @@ -258,18 +226,13 @@ export const relatedExpectedHandlerResponse = { }, currentProcessors: [ { - append: { - field: 'event.type', - value: ['creation'], - if: "ctx.mysql_enterprise?.audit?.general_data?.sql_command == 'create_db'", - }, + field: 'related.ip', + value_field: 'source.ip', }, { - append: { - field: 'event.category', - value: ['database'], - if: "ctx.mysql_enterprise.audit.general_data.sql_command == 'create_db'", - }, + field: 'related.ip', + value_field: 'destination.ip', + if: 'ctx.destination?.ip != null', }, ], reviewed: false, diff --git a/x-pack/plugins/integration_assistant/server/graphs/categorization/categorization.ts b/x-pack/plugins/integration_assistant/server/graphs/categorization/categorization.ts index ed1a88c3a1cfd..7f6e083d7f83f 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/categorization/categorization.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/categorization/categorization.ts @@ -9,10 +9,11 @@ import type { ActionsClientSimpleChatModel, } from '@kbn/langchain/server/language_models'; import { JsonOutputParser } from '@langchain/core/output_parsers'; -import type { ESProcessorItem, Pipeline } from '../../../common'; -import type { CategorizationState } from '../../types'; +import type { Pipeline } from '../../../common'; +import type { CategorizationState, SimplifiedProcessors, SimplifiedProcessor } from '../../types'; import { combineProcessors } from '../../util/processors'; import { CATEGORIZATION_MAIN_PROMPT } from './prompts'; +import { CATEGORIZATION_EXAMPLE_PROCESSORS } from './constants'; export async function handleCategorization( state: CategorizationState, @@ -21,16 +22,20 @@ export async function handleCategorization( const categorizationMainPrompt = CATEGORIZATION_MAIN_PROMPT; const outputParser = new JsonOutputParser(); const categorizationMainGraph = categorizationMainPrompt.pipe(model).pipe(outputParser); - const currentProcessors = (await categorizationMainGraph.invoke({ pipeline_results: JSON.stringify(state.pipelineResults, null, 2), + example_processors: CATEGORIZATION_EXAMPLE_PROCESSORS, ex_answer: state?.exAnswer, ecs_categories: state?.ecsCategories, ecs_types: state?.ecsTypes, - })) as ESProcessorItem[]; + })) as SimplifiedProcessor[]; - const currentPipeline = combineProcessors(state.initialPipeline as Pipeline, currentProcessors); + const processors = { + type: 'categorization', + processors: currentProcessors, + } as SimplifiedProcessors; + const currentPipeline = combineProcessors(state.initialPipeline as Pipeline, processors); return { currentPipeline, currentProcessors, diff --git a/x-pack/plugins/integration_assistant/server/graphs/categorization/constants.ts b/x-pack/plugins/integration_assistant/server/graphs/categorization/constants.ts index aef92f0a2a78e..11b510bb09a93 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/categorization/constants.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/categorization/constants.ts @@ -173,70 +173,49 @@ export const ECS_EVENT_TYPES_PER_CATEGORY: { export const CATEGORIZATION_EXAMPLE_PROCESSORS = ` If condition that determines if ctx.checkpoint?.operation is not of a specific value: { - "append": { - "field": "event.category", - "value": "network", - "allow_duplicates": false, - "if": "ctx.checkpoint?.operation != 'Log In'" - } + "field": "event.category", + "value": ["network"], + "if": "ctx.checkpoint?.operation != 'Log In'" } If condition that determines if ctx.checkpoint?.operation is of a specific value: { - "append": { - "field": "event.category", - "value": "authentication", - "allow_duplicates": false, - "if": "ctx.checkpoint?.operation == 'Log In'" - } + "field": "event.category", + "value": ["authentication"], + "if": "ctx.checkpoint?.operation == 'Log In'" } Appending multiple values when either the value Accept or Allow is found in ctx.checkpoint?.rule_action: { - "append": { - "field": "event.type", - "value": [ - "allowed", - "connection" - ], - "allow_duplicates": false, - "if": "['Accept', 'Allow'].contains(ctx.checkpoint?.rule_action)" - } + "field": "event.type", + "value": ["allowed", "connection"], + "if": "['Accept', 'Allow'].contains(ctx.checkpoint?.rule_action)" } `; export const CATEGORIZATION_EXAMPLE_ANSWER = [ - { append: { field: 'event.type', value: ['access'] } }, { - append: { - field: 'event.type', - value: ['allowed', 'connection'], - allow_duplicates: false, - if: "['Accept', 'Allow'].contains(ctx.checkpoint?.rule_action)", - }, + field: 'event.type', + value: ['access'], }, { - append: { - field: 'event.category', - value: ['network'], - allow_duplicates: false, - if: "['Accept', 'Allow'].contains(ctx.checkpoint?.rule_action)", - }, + field: 'event.type', + value: ['allowed', 'connection'], + if: "['Accept', 'Allow'].contains(ctx.checkpoint?.rule_action)", }, { - append: { - field: 'event.type', - value: ['start'], - allow_duplicates: false, - if: "ctx.checkpoint?.operation == 'Log In'", - }, + field: 'event.category', + value: ['network'], + if: "['Accept', 'Allow'].contains(ctx.checkpoint?.rule_action)", }, { - append: { - field: 'event.category', - value: ['authentication'], - allow_duplicates: false, - if: "ctx.checkpoint?.operation == 'Log In'", - }, + field: 'event.type', + value: ['start'], + if: "ctx.checkpoint?.operation == 'Log In'", + }, + { + field: 'event.category', + value: ['authentication'], + if: "ctx.checkpoint?.operation == 'Log In'", }, ]; diff --git a/x-pack/plugins/integration_assistant/server/graphs/categorization/errors.ts b/x-pack/plugins/integration_assistant/server/graphs/categorization/errors.ts index d8cb7beedc9bf..e875754cb823d 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/categorization/errors.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/categorization/errors.ts @@ -9,8 +9,8 @@ import type { ActionsClientSimpleChatModel, } from '@kbn/langchain/server/language_models'; import { JsonOutputParser } from '@langchain/core/output_parsers'; -import type { ESProcessorItem, Pipeline } from '../../../common'; -import type { CategorizationState } from '../../types'; +import type { Pipeline } from '../../../common'; +import type { CategorizationState, SimplifiedProcessors, SimplifiedProcessor } from '../../types'; import { combineProcessors } from '../../util/processors'; import { CATEGORIZATION_ERROR_PROMPT } from './prompts'; @@ -29,9 +29,14 @@ export async function handleErrors( errors: JSON.stringify(state.errors, null, 2), package_name: state.packageName, data_stream_name: state.dataStreamName, - })) as ESProcessorItem[]; + })) as SimplifiedProcessor[]; - const currentPipeline = combineProcessors(state.initialPipeline as Pipeline, currentProcessors); + const processors = { + type: 'categorization', + processors: currentProcessors, + } as SimplifiedProcessors; + + const currentPipeline = combineProcessors(state.initialPipeline as Pipeline, processors); return { currentPipeline, diff --git a/x-pack/plugins/integration_assistant/server/graphs/categorization/graph.test.ts b/x-pack/plugins/integration_assistant/server/graphs/categorization/graph.test.ts index 4122d4540dbc0..8fc617120be66 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/categorization/graph.test.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/categorization/graph.test.ts @@ -19,6 +19,7 @@ import { testPipelineValidResult, testPipelineInvalidEcs, } from '../../../__jest__/fixtures/categorization'; +import type { SimplifiedProcessors } from '../../types'; import { mockedRequestWithPipeline } from '../../../__jest__/fixtures'; import { handleReview } from './review'; import { handleCategorization } from './categorization'; @@ -63,33 +64,61 @@ describe('runCategorizationGraph', () => { // We do not care about ES in these tests, the mock is just to prevent errors. // After this is triggered, the mock of TestPipeline will trigger the expected error, to route to error handler - (handleCategorization as jest.Mock).mockImplementation(async () => ({ - currentPipeline: categorizationInitialPipeline, - currentProcessors: await mockInvokeCategorization(), - reviewed: false, - finalized: false, - lastExecutedChain: 'categorization', - })); + (handleCategorization as jest.Mock).mockImplementation(async () => { + const currentProcessors = await mockInvokeCategorization(); + const processors = { + type: 'categorization', + processors: currentProcessors, + } as SimplifiedProcessors; + const currentPipeline = combineProcessors(categorizationInitialPipeline, processors); + return { + currentPipeline, + currentProcessors, + reviewed: false, + finalized: false, + lastExecutedChain: 'categorization', + }; + }); // Error pipeline resolves it, though the responce includes an invalid categorization - (handleErrors as jest.Mock).mockImplementation(async () => ({ - currentPipeline: categorizationInitialPipeline, - currentProcessors: await mockInvokeError(), - reviewed: false, - finalized: false, - lastExecutedChain: 'error', - })); + (handleErrors as jest.Mock).mockImplementation(async () => { + const currentProcessors = await mockInvokeError(); + const processors = { + type: 'categorization', + processors: currentProcessors, + } as SimplifiedProcessors; + const currentPipeline = combineProcessors(categorizationInitialPipeline, processors); + return { + currentPipeline, + currentProcessors, + reviewed: false, + finalized: false, + lastExecutedChain: 'error', + }; + }); // Invalid categorization is resolved and returned correctly, which routes it to a review - (handleInvalidCategorization as jest.Mock).mockImplementation(async () => ({ - currentPipeline: categorizationInitialPipeline, - currentProcessors: await mockInvokeInvalid(), - reviewed: false, - finalized: false, - lastExecutedChain: 'invalidCategorization', - })); + (handleInvalidCategorization as jest.Mock).mockImplementation(async () => { + const currentProcessors = await mockInvokeInvalid(); + const processors = { + type: 'categorization', + processors: currentProcessors, + } as SimplifiedProcessors; + const currentPipeline = combineProcessors(categorizationInitialPipeline, processors); + return { + currentPipeline, + currentProcessors, + reviewed: false, + finalized: false, + lastExecutedChain: 'invalidCategorization', + }; + }); // After the review it should route to modelOutput and finish. (handleReview as jest.Mock).mockImplementation(async () => { const currentProcessors = await mockInvokeReview(); - const currentPipeline = combineProcessors(categorizationInitialPipeline, currentProcessors); + const processors = { + type: 'categorization', + processors: currentProcessors, + } as SimplifiedProcessors; + const currentPipeline = combineProcessors(categorizationInitialPipeline, processors); return { currentProcessors, currentPipeline, diff --git a/x-pack/plugins/integration_assistant/server/graphs/categorization/graph.ts b/x-pack/plugins/integration_assistant/server/graphs/categorization/graph.ts index 6834fcf892a9e..fae09ecc32d87 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/categorization/graph.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/categorization/graph.ts @@ -71,6 +71,10 @@ const graphState: StateGraphArgs['channels'] = { value: (x: object, y?: object) => y ?? x, default: () => ({}), }, + previousError: { + value: (x: string, y?: string) => y ?? x, + default: () => '', + }, pipelineResults: { value: (x: object[], y?: object[]) => y ?? x, default: () => [{}], @@ -84,8 +88,12 @@ const graphState: StateGraphArgs['channels'] = { default: () => [], }, invalidCategorization: { - value: (x: object, y?: object) => y ?? x, - default: () => ({}), + value: (x: object[], y?: object[]) => y ?? x, + default: () => [], + }, + previousInvalidCategorization: { + value: (x: string, y?: string) => y ?? x, + default: () => '', }, initialPipeline: { value: (x: object, y?: object) => y ?? x, diff --git a/x-pack/plugins/integration_assistant/server/graphs/categorization/invalid.ts b/x-pack/plugins/integration_assistant/server/graphs/categorization/invalid.ts index 413694b594518..2ecbd5d34eaa4 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/categorization/invalid.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/categorization/invalid.ts @@ -9,8 +9,8 @@ import type { ActionsClientSimpleChatModel, } from '@kbn/langchain/server/language_models'; import { JsonOutputParser } from '@langchain/core/output_parsers'; -import type { ESProcessorItem, Pipeline } from '../../../common'; -import type { CategorizationState } from '../../types'; +import type { Pipeline } from '../../../common'; +import type { CategorizationState, SimplifiedProcessors, SimplifiedProcessor } from '../../types'; import { combineProcessors } from '../../util/processors'; import { ECS_EVENT_TYPES_PER_CATEGORY } from './constants'; import { CATEGORIZATION_VALIDATION_PROMPT } from './prompts'; @@ -29,9 +29,14 @@ export async function handleInvalidCategorization( invalid_categorization: JSON.stringify(state.invalidCategorization, null, 2), ex_answer: state.exAnswer, compatible_types: JSON.stringify(ECS_EVENT_TYPES_PER_CATEGORY, null, 2), - })) as ESProcessorItem[]; + })) as SimplifiedProcessor[]; - const currentPipeline = combineProcessors(state.initialPipeline as Pipeline, currentProcessors); + const processors = { + type: 'categorization', + processors: currentProcessors, + } as SimplifiedProcessors; + + const currentPipeline = combineProcessors(state.initialPipeline as Pipeline, processors); return { currentPipeline, diff --git a/x-pack/plugins/integration_assistant/server/graphs/categorization/prompts.ts b/x-pack/plugins/integration_assistant/server/graphs/categorization/prompts.ts index a03f373499aea..1d0e3aa0a861a 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/categorization/prompts.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/categorization/prompts.ts @@ -27,11 +27,14 @@ Relationship: Works alongside event.category, which acts as a subcategory. Allowed types and their descriptions: {ecs_types} + +{example_processors} + `, ], [ 'human', - `Please help me by providing all relevant append processors for any detected event.category and event.type combinations that would fit the below pipeline results as an array of JSON objects. + `Please help by providing all relevant processors objects for any detected event.category and event.type combinations that would fit the below pipeline results. {pipeline_results} @@ -39,19 +42,19 @@ Allowed types and their descriptions: Go through each of the pipeline results above step by step and do the following to add all relevant event.type and event.category combinations. 1. Try to understand what is unique about each pipeline result, and what sort of event.categorization and event.type combinations that fit best, and if there is any unique values for each result. -2. For for each combination of event.category and event.type that you find, add a new append processor to your array of JSON objects. -3. If only certain results are relevant to the event.category and event.type combination, add an if condition similar to the above example processors, that describes what value or field needs to be available for this categorization to take place. The if condition should be inside the processor object. +2. For for each combination of event.category and event.type that you find, add a new processor object to your response. +3. If only certain results are relevant to the event.category and event.type combination, add an if condition similar to the above example processors, that describes what value or field needs to be available for this categorization to take place. 4. Always check if the combination of event.category and event.type is common in the ecs context above. 5. Always make sure the value for event.category and event.type is strictly from the allowed categories and allowed types in the ecs context above. -6. The value argument for the append processor is an array of one or more types and categories. +6. The value argument for the append processor is an array of one or more of the allowed values for either event.type or event.category. You ALWAYS follow these guidelines when writing your response: -- You can add as many append processors you need to cover all the unique combinations that you detected. +- You can add as many processor objects as you need to cover all the unique combinations that was detected. - If conditions should always use a ? character when accessing nested fields, in case the field might not always be available, see example processors above. -- When an if condition is not needed the argument should not be used for the processor object. +- When an if condition is not needed the argument it should not be included in that specific object of your response. - When using a range based if condition like > 0, you first need to check that the field is not null, for example: ctx.somefield?.production != null && ctx.somefield?.production > 0 -- Do not respond with anything except the array of processors as a valid JSON objects enclosed with 3 backticks (\`), see example response below. +- Do not respond with anything except the array of processors as valid JSON objects enclosed with 3 backticks (\`), see example response below. Example response format: @@ -78,6 +81,12 @@ Here is some context that you can reference for your task, read it carefully as {compatibility_matrix} + +{previous_error} + + +{previous_invalid_categorization} + `, ], [ @@ -93,15 +102,14 @@ For each pipeline result you review step by step, remember the below steps: 1. Check if each of the pipeline results have at least one event.category and event.type added to them. If not then try to correlate the results with the current processors and see if either a new append processor should be added to the list with a matching if condition, or if any of the if conditions should be modified as they are not matching that is in the results. 2. If the results have at least one event.category and event.type value, see if more of them could match, if so it could be added to the relevant append processor which added the initial values. 3. When adding more values to event.type and event.category please keep in mind the compatibility_matrix in the context to make sure only compatible event.type , event.category pairs that are compatible are created. -4. Ensure that all append processors has allow_duplicates: false, as seen in the example response. +4. If previous errors or invalid categorization above is not empty, do not add any processors that would cause any of the same errors again. If you are unsure about a specific object then do not add it to the response. You ALWAYS follow these guidelines when writing your response: -- You can use as many append processors as you need to add all relevant ECS categories and types combinations. +- You can use as many processor objects as you need to add all relevant ECS categories and types combinations. - If conditions should always use a ? character when accessing nested fields, in case the field might not always be available, see example processors above. - When an if condition is not needed the argument should not be used for the processor object. -- If not updates are needed you respond with the initially provided current processors. -- Each append processor needs to have the allow_duplicates: false argument, as shown in the below example response. +- If updates are needed you respond with the initially provided array of processors. - Do not respond with anything except updated array of processors as a valid JSON object enclosed with 3 backticks (\`), see example response below. @@ -120,6 +128,7 @@ export const CATEGORIZATION_VALIDATION_PROMPT = ChatPromptTemplate.fromMessages( [ 'system', `You are a helpful, expert assistant on Elasticsearch Ingest Pipelines, focusing on resolving errors and issues with append processors used for categorization. + Here is some context that you can reference for your task, read it carefully as you will get questions about it later: @@ -169,14 +178,15 @@ Here is some context that you can reference for your task, read it carefully as {current_processors} - -{errors} - `, ], [ 'human', - `Please go through each error above, carefully review the provided current processors, and resolve the most likely cause to the supplied error by returning an updated version of the current_processors. + `Please go through each of the below errors, carefully review the provided current processors, and resolve the most likely cause to the supplied error by returning an updated version of the current_processors. + + +{errors} + Follow these steps to help resolve the current ingest pipeline issues: 1. Try to fix all related errors before responding. diff --git a/x-pack/plugins/integration_assistant/server/graphs/categorization/review.ts b/x-pack/plugins/integration_assistant/server/graphs/categorization/review.ts index 12b3880737237..7986b4d6c2423 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/categorization/review.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/categorization/review.ts @@ -10,9 +10,8 @@ import type { } from '@kbn/langchain/server/language_models'; import { JsonOutputParser } from '@langchain/core/output_parsers'; import { CATEGORIZATION_REVIEW_PROMPT } from './prompts'; - -import type { ESProcessorItem, Pipeline } from '../../../common'; -import type { CategorizationState } from '../../types'; +import type { Pipeline } from '../../../common'; +import type { CategorizationState, SimplifiedProcessors, SimplifiedProcessor } from '../../types'; import { combineProcessors } from '../../util/processors'; import { ECS_EVENT_TYPES_PER_CATEGORY } from './constants'; @@ -27,12 +26,19 @@ export async function handleReview( const currentProcessors = (await categorizationReview.invoke({ current_processors: JSON.stringify(state.currentProcessors, null, 2), pipeline_results: JSON.stringify(state.pipelineResults, null, 2), + previous_invalid_categorization: state.previousInvalidCategorization, + previous_error: state.previousError, ex_answer: state?.exAnswer, package_name: state?.packageName, compatibility_matrix: JSON.stringify(ECS_EVENT_TYPES_PER_CATEGORY, null, 2), - })) as ESProcessorItem[]; + })) as SimplifiedProcessor[]; + + const processors = { + type: 'categorization', + processors: currentProcessors, + } as SimplifiedProcessors; - const currentPipeline = combineProcessors(state.initialPipeline as Pipeline, currentProcessors); + const currentPipeline = combineProcessors(state.initialPipeline as Pipeline, processors); return { currentPipeline, diff --git a/x-pack/plugins/integration_assistant/server/graphs/categorization/validate.ts b/x-pack/plugins/integration_assistant/server/graphs/categorization/validate.ts index 40e37cd3b0363..af3846edbac34 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/categorization/validate.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/categorization/validate.ts @@ -23,11 +23,16 @@ interface CategorizationError { } export function handleCategorizationValidation(state: CategorizationState): { + previousInvalidCategorization: string; invalidCategorization: CategorizationError[]; lastExecutedChain: string; } { + let previousInvalidCategorization = ''; const errors: CategorizationError[] = []; const pipelineResults = state.pipelineResults as PipelineResult[]; + if (Object.keys(state.invalidCategorization).length > 0) { + previousInvalidCategorization = JSON.stringify(state.invalidCategorization, null, 2); + } // Loops through the pipeline results to find invalid categories and types for (const doc of pipelineResults) { @@ -62,6 +67,7 @@ export function handleCategorizationValidation(state: CategorizationState): { } return { + previousInvalidCategorization, invalidCategorization: errors, lastExecutedChain: 'handleCategorizationValidation', }; diff --git a/x-pack/plugins/integration_assistant/server/graphs/ecs/pipeline.ts b/x-pack/plugins/integration_assistant/server/graphs/ecs/pipeline.ts index c4ad10f47a9f2..96e41fee021a2 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/ecs/pipeline.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/ecs/pipeline.ts @@ -44,7 +44,7 @@ function generateProcessor( date: { field: currentPath, target_field: ecsField.target, - formats: ecsField.date_formats, + formats: convertIfIsoDate(ecsField.date_formats), if: currentPath.replace(/\./g, '?.'), }, }; @@ -59,6 +59,19 @@ function generateProcessor( }; } +// While some custom date formats might use the 'T' representation of time widely used in ISO8601, this function only appends the 'ISO8601' format to the date processor as a fallback. +// This is because many vendors tend to use multiple versions representing seconds, milli, nano etc, and the format returned by the LLM usually hits most but not all. +// Since log samples can be inconclusive we add the ISO8601 format as a fallback to ensure the date processor can handle all of the combinations of values. +function convertIfIsoDate(date: string[]): string[] { + if (date.some((d) => d.includes('T'))) { + if (date.some((d) => d === 'ISO8601')) { + return date; + } + return [...date, 'ISO8601']; + } + return date; +} + function getSampleValue(key: string, samples: Record): unknown { const keyList = key.split('.'); let value: any = samples; diff --git a/x-pack/plugins/integration_assistant/server/graphs/related/constants.ts b/x-pack/plugins/integration_assistant/server/graphs/related/constants.ts index 61cc877667659..0484557746d2a 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/related/constants.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/related/constants.ts @@ -4,56 +4,73 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -export const RELATED_ECS_FIELDS = { - 'related.hash': { +export const RELATED_ECS_FIELDS = [ + { + field: 'related.hash', type: 'keyword', description: 'All the hashes seen in the docs', note: 'this field should contain an array of values', }, - 'related.hosts': { + { + field: 'related.hosts', type: 'keyword', description: 'All hostnames or other host identifiers seen in the docs', note: 'this field should contain an array of values', }, - 'related.ip': { + { + field: 'related.ip', type: 'keyword', description: 'All of the IPs seen in the docs', note: 'this field should contain an array of values', }, - 'related.user': { + { + field: 'related.user', type: 'keyword', description: 'All the user names or other user identifiers seen in the docs', note: 'this field should contain an array of values', }, -}; +]; export const RELATED_EXAMPLE_ANSWER = [ { - append: { - field: 'related.ip', - value: ['{{{source.ip}}}'], - allow_duplicates: 'false', - }, + field: 'related.ip', + value_field: 'source.ip', + }, + { + field: 'related.user', + value_field: 'server.user.name', }, { - append: { - field: 'related.user', - value: ['{{{server.user.name}}}'], - allow_duplicates: 'false', - }, + field: 'related.hosts', + value_field: 'client.domain', + }, + { + field: 'related.hash', + value_field: 'file.hash.sha1', + }, + { + field: 'related.hash', + value_field: 'file.hash.sha256', + }, +]; + +export const COMMON_ERRORS = [ + { + error: 'dynamic getter [java.lang.String, ] not found', + reason: + 'The error is caused when an if condition is trying to access a stringified object, and the field is not available in the current context.', + action: 'Remove the relevant processor object from the list of processors in your response.', }, { - append: { - field: 'related.hosts', - value: ['{{{client.domain}}}'], - allow_duplicates: 'false', - }, + error: 'illegal_argument_exception: unexpected character', + reason: 'The error is caused when one or more if conditions uses an illegal character.', + action: + "Check which illegal character is used and remove it. Complex field names can be written inside square brackets for example like ctx['field.name'] != null, If this is not possible then remove the whole processor from your response", }, { - append: { - field: 'related.hash', - value: ['{{{file.hash.sha1}}}'], - allow_duplicates: 'false', - }, + error: 'Illegal list shortcut value [value]', + reason: 'The field or value_field is trying to access a path which is currently an array.', + action: + 'The field or value cannot be accessed because it is an array, remove the current processor from your response. If this was your only processor in the response then return an empty JSON object {}', }, ]; diff --git a/x-pack/plugins/integration_assistant/server/graphs/related/errors.ts b/x-pack/plugins/integration_assistant/server/graphs/related/errors.ts index 025422008c4dc..b40e638751ee0 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/related/errors.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/related/errors.ts @@ -9,10 +9,11 @@ import type { ActionsClientSimpleChatModel, } from '@kbn/langchain/server/language_models'; import { JsonOutputParser } from '@langchain/core/output_parsers'; -import type { ESProcessorItem, Pipeline } from '../../../common'; -import type { RelatedState } from '../../types'; +import type { Pipeline } from '../../../common'; +import type { RelatedState, SimplifiedProcessors, SimplifiedProcessor } from '../../types'; import { combineProcessors } from '../../util/processors'; import { RELATED_ERROR_PROMPT } from './prompts'; +import { COMMON_ERRORS } from './constants'; export async function handleErrors( state: RelatedState, @@ -24,13 +25,20 @@ export async function handleErrors( const currentProcessors = (await relatedErrorGraph.invoke({ current_processors: JSON.stringify(state.currentProcessors, null, 2), + common_errors: JSON.stringify(COMMON_ERRORS, null, 2), ex_answer: state.exAnswer, errors: JSON.stringify(state.errors, null, 2), package_name: state.packageName, data_stream_name: state.dataStreamName, - })) as ESProcessorItem[]; + })) as SimplifiedProcessor[]; + + const processors = { + type: 'related', + processors: currentProcessors, + } as SimplifiedProcessors; + + const currentPipeline = combineProcessors(state.initialPipeline as Pipeline, processors); - const currentPipeline = combineProcessors(state.initialPipeline as Pipeline, currentProcessors); return { currentPipeline, currentProcessors, diff --git a/x-pack/plugins/integration_assistant/server/graphs/related/graph.test.ts b/x-pack/plugins/integration_assistant/server/graphs/related/graph.test.ts index 40989e9733800..a07a715a179e1 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/related/graph.test.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/related/graph.test.ts @@ -17,6 +17,7 @@ import { testPipelineError, testPipelineValidResult, } from '../../../__jest__/fixtures/related'; +import type { SimplifiedProcessors } from '../../types'; import { mockedRequestWithPipeline } from '../../../__jest__/fixtures'; import { handleReview } from './review'; import { handleRelated } from './related'; @@ -54,25 +55,45 @@ describe('runRelatedGraph', () => { const mockInvokeReview = jest.fn().mockResolvedValue(relatedReviewMockedResponse); // After this is triggered, the mock of TestPipeline will trigger the expected error, to route to error handler - (handleRelated as jest.Mock).mockImplementation(async () => ({ - currentPipeline: relatedInitialPipeline, - currentProcessors: await mockInvokeRelated(), - reviewed: false, - finalized: false, - lastExecutedChain: 'related', - })); + (handleRelated as jest.Mock).mockImplementation(async () => { + const currentProcessors = await mockInvokeRelated(); + const processors = { + type: 'related', + processors: currentProcessors, + } as SimplifiedProcessors; + const currentPipeline = combineProcessors(relatedInitialPipeline, processors); + return { + currentPipeline, + currentProcessors, + reviewed: false, + finalized: false, + lastExecutedChain: 'related', + }; + }); // Error pipeline returns the correct response to trigger a review. - (handleErrors as jest.Mock).mockImplementation(async () => ({ - currentPipeline: relatedInitialPipeline, - currentProcessors: await mockInvokeError(), - reviewed: false, - finalized: false, - lastExecutedChain: 'error', - })); + (handleErrors as jest.Mock).mockImplementation(async () => { + const currentProcessors = await mockInvokeError(); + const processors = { + type: 'related', + processors: currentProcessors, + } as SimplifiedProcessors; + const currentPipeline = combineProcessors(relatedInitialPipeline, processors); + return { + currentPipeline, + currentProcessors, + reviewed: false, + finalized: false, + lastExecutedChain: 'error', + }; + }); // After the review it should route to modelOutput and finish. (handleReview as jest.Mock).mockImplementation(async () => { const currentProcessors = await mockInvokeReview(); - const currentPipeline = combineProcessors(relatedInitialPipeline, currentProcessors); + const processors = { + type: 'related', + processors: currentProcessors, + } as SimplifiedProcessors; + const currentPipeline = combineProcessors(relatedInitialPipeline, processors); return { currentProcessors, currentPipeline, diff --git a/x-pack/plugins/integration_assistant/server/graphs/related/graph.ts b/x-pack/plugins/integration_assistant/server/graphs/related/graph.ts index 9b50c05889402..bd387b7177f75 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/related/graph.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/related/graph.ts @@ -65,6 +65,10 @@ const graphState: StateGraphArgs['channels'] = { value: (x: object, y?: object) => y ?? x, default: () => ({}), }, + previousError: { + value: (x: string, y?: string) => y ?? x, + default: () => '', + }, pipelineResults: { value: (x: object[], y?: object[]) => y ?? x, default: () => [], diff --git a/x-pack/plugins/integration_assistant/server/graphs/related/prompts.ts b/x-pack/plugins/integration_assistant/server/graphs/related/prompts.ts index a954c284013d4..87947eb8763af 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/related/prompts.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/related/prompts.ts @@ -9,45 +9,42 @@ import { ChatPromptTemplate } from '@langchain/core/prompts'; export const RELATED_MAIN_PROMPT = ChatPromptTemplate.fromMessages([ [ 'system', - `You are a helpful, expert assistant on Elasticsearch Ingest Pipelines, focusing on providing append processors that can be used to enrich samples with all relevant related.ip, related.hash, related.user and related.host fields. - Here are some context for you to reference for your task, read it carefully as you will get questions about it later: - - - {ecs} - - `, + `You are a helpful, expert assistant on Elasticsearch Ingest Pipelines, focusing on providing append processors that enriches the current pipeline results. +Here are some context for you to reference for your task, read it carefully as you will get questions about it later: + + +{ecs} + +`, ], [ 'human', - `Please help me by providing all relevant append processors for any detected related.ip, related.hash, related.user and related.host fields that would fit the below pipeline results as an array of JSON objects. - - - {pipeline_results} - - - Go through each of the pipeline results above step by step and do the following to add all relevant related.ip, related.hash, related.user and related.host fields. - 1. Try to understand what is unique about each pipeline result, and what sort of related.ip, related.hash, related.user and related.host fields that fit best, and if there is any unique values for each result. - 2. For each of related.ip, related.hash, related.user and related.host fields that you find, add a new append processor to your array of JSON objects. - 3. If only certain results are relevant to the related.ip, related.hash, related.user and related.host fields, add an if condition similar to the above example processors, that describes what value or field needs to be available for this categorization to take place. The if condition should be inside the processor object. - 4. Always check if the related.ip, related.hash, related.user and related.host fields are common in the ecs context above. - 5. The value argument for the append processor shall consist of one field. - - You ALWAYS follow these guidelines when writing your response: - - - You can add as many append processors you need to cover all the fields that you detected. - - If conditions should always use a ? character when accessing nested fields, in case the field might not always be available, see example processors above. - - When an if condition is not needed the argument should not be used for the processor object. - - The if condition must be located within the processor object. - - Do not respond with anything except the array of processors as a valid JSON objects enclosed with 3 backticks (\`), see example response below. - - - Example response format: - - A: Please find the Related processors below: - \`\`\`json - {ex_answer} - \`\`\` - `, + `Please help me by providing all relevant append processors for any detected related.ip, related.hash, related.user and related.host fields that would fit the below pipeline results. + + +{pipeline_results} + + +For each pipeline result you find matching values that would fit any of the related fields perform the follow steps: +1. Identify which related field the value would fit in. +2. Create a new processor object with the field value set to the correct related.field, and the value_field set to the full path of the field that contains the value which we want to append. +3. Always check if the related.ip, related.hash, related.user and related.host fields are common in the ecs context above. +4. The value_field argument in your response consist of only one value. + +You ALWAYS follow these guidelines when writing your response: + +- You can use as many processor objects as needed to map all relevant pipeline result fields to any of the ECS related fields. +- If no relevant fields or values are found that could be mapped confidently to any of the related fields, then respond with an empty array [] as valid JSON enclosed with 3 backticks (\`). +- Do not respond with anything except the array of processors as a valid JSON objects enclosed with 3 backticks (\`), see example response below. + + +Example response format: + +A: Please find the Related processors below: +\`\`\`json +{ex_answer} +\`\`\` +`, ], ['ai', 'Please find the Related processors below:'], ]); @@ -56,41 +53,44 @@ export const RELATED_ERROR_PROMPT = ChatPromptTemplate.fromMessages([ [ 'system', `You are a helpful, expert assistant on Elasticsearch Ingest Pipelines, focusing on resolving errors and issues with append processors used for related field categorization. - Here is some context that you can reference for your task, read it carefully as you will get questions about it later: - - - {current_processors} - - - {errors} - - `, +Here is some context that you can reference for your task, read it carefully as you will get questions about it later: + + +{current_processors} + + +{common_errors} + +`, ], [ 'human', - `Please go through each error above, carefully review the provided current processors, and resolve the most likely cause to the supplied error by returning an updated version of the current_processors. - - Follow these steps to help resolve the current ingest pipeline issues: - 1. Try to fix all related errors before responding. - 2. Apply all fixes to the provided array of current append processors. - 3. If you do not know how to fix an error, then continue to the next and return the complete updated array of current append processors. - - You ALWAYS follow these guidelines when writing your response: - - - When checking for the existance of multiple values in a single variable, use this format: "if": "['value1', 'value2'].contains(ctx.{package_name}?.{data_stream_name}?.field)" - - If conditions should never be in a format like "if": "true". If it exist in the current array of append processors, remove only the redundant if condition. - - If the error complains that it is a null point exception, always ensure the if conditions uses a ? when accessing nested fields. For example ctx.field1?.nestedfield1?.nestedfield2. - - Never use "split" in template values, only use the field name inside the triple brackets. If the error mentions "Improperly closed variable in query-template" then check each "value" field for any special characters and remove them. - - Do not respond with anything except the complete updated array of processors as a valid JSON object enclosed with 3 backticks (\`), see example response below. - + `Please go through each error below, carefully review the provided current processors, and resolve the most likely cause to the supplied error by returning an updated version of the current_processors. + + +{errors} + - Example response format: - - A: Please find the updated ECS related append processors below: - \`\`\`json - {ex_answer} - \`\`\` - `, +Follow these steps to help resolve the current ingest pipeline issues: +1. Check first if any of the errors are similar to the common errors provided above, if one is found follow the recommended action. +2. When multiple errors are involved, try to resolve them all one by one. +3. If you are unable to resolve the error, then the processor should be removed from the response. +4. Apply the relevant changes to the current processors and return the updated version. + +You ALWAYS follow these guidelines when writing your response: + +- Never use "split" in template values, only use the field name inside the triple brackets. If the error mentions "Improperly closed variable in query-template" then check each "value" field for any special characters and remove them. +- If solving an error means removing the last processor in the list, then return an empty array [] as valid JSON enclosed with 3 backticks (\`). +- Do not respond with anything except the complete updated array of processors as a valid JSON object enclosed with 3 backticks (\`), see example response below. + + +Example response format: + +A: Please find the updated ECS related append processors below: +\`\`\`json +{ex_answer} +\`\`\` +`, ], ['ai', 'Please find the updated ECS related append processors below:'], ]); @@ -100,44 +100,45 @@ export const RELATED_REVIEW_PROMPT = ChatPromptTemplate.fromMessages([ 'system', `You are a helpful, expert assistant on Elasticsearch Ingest Pipelines, focusing on adding improvements to the provided array of processors and reviewing the current results. - Here is some context that you can reference for your task, read it carefully as you will get questions about it later: - - - {current_processors} - - `, +Here is some context that you can reference for your task, read it carefully as you will get questions about it later: + + +{current_processors} + + +{previous_error} + +`, ], [ 'human', `Testing my current pipeline returned me with the below pipeline results: - - {pipeline_results} - - - Please review the pipeline results and the array of current processors, ensuring to identify all the related.ip , related.user , related.hash and related.host fields that would match each pipeline result document. If any related.ip , related.user , related.hash or related.host fields is missing from any of the pipeline results, add them by updating the array of current processors and return the whole updated array of processors. - - For each pipeline result you review step by step, remember the below steps: - 1. Check each of the pipeline results to see if the field/value matches related.ip , related.user , related.hash or related.host. If not then try to correlate the results with the current processors and see if either a new append processor should be added to the list with a matching if condition, or if any of the if conditions should be modified as they are not matching that is in the results. - 2. If the results have related.ip , related.user , related.hash or related.host value, see if more of them could match, if so it could be added to the relevant append processor which added the initial values. - 3. Ensure that all append processors has allow_duplicates: false, as seen in the example response. - - You ALWAYS follow these guidelines when writing your response: - - - You can use as many append processors as you need to add all relevant ECS categories and types combinations. - - If conditions should always use a ? character when accessing nested fields, in case the field might not always be available, see example processors above. - - When an if condition is not needed the argument should not be used for the processor object. - - If not updates are needed you respond with the initially provided current processors. - - Each append processor needs to have the allow_duplicates: false argument, as shown in the below example response. - - Do not respond with anything except updated array of processors as a valid JSON object enclosed with 3 backticks (\`), see example response below. - - - Example response format: - - A: Please find the updated ECS related append processors below: - \`\`\` - {ex_answer} - \`\`\` - `, + +{pipeline_results} + + +Please review the pipeline results and the array of current processors above, and identify any field with a value that would fit with either related.ip, related.hash, related.user or related.host fields. + +For each pipeline result you find matching values that would fit any of the related fields perform the follow steps: +1. Identify which related field the value would fit in. +2. Create a new processor object with the field value set to the correct related.field, and the value_field set to the full path of the field that contains the value which we want to append. +3. If previous errors above is not empty, do not add any processors that would cause any of the same errors again, if you are unsure, then remove the processor from the list. +4. If no updates are needed, then respond with the initially provided current processors. + +You ALWAYS follow these guidelines when writing your response: + +- You can use as many processor objects as needed to map all relevant pipeline result fields to any of the ECS related fields. +- If no updates are needed you respond with the initially provided current processors, if no processors are present you respond with an empty array [] as valid JSON enclosied with 3 backticks (\`). +- Do not respond with anything except updated array of processors as a valid JSON object enclosed with 3 backticks (\`), see example response below. + + +Example response format: + +A: Please find the updated ECS related append processors below: +\`\`\` +{ex_answer} +\`\`\` +`, ], ['ai', 'Please find the updated ECS related append processors below:'], ]); diff --git a/x-pack/plugins/integration_assistant/server/graphs/related/related.ts b/x-pack/plugins/integration_assistant/server/graphs/related/related.ts index 2c98381510d9b..af3b27790da97 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/related/related.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/related/related.ts @@ -9,8 +9,8 @@ import type { ActionsClientSimpleChatModel, } from '@kbn/langchain/server/language_models'; import { JsonOutputParser } from '@langchain/core/output_parsers'; -import type { ESProcessorItem, Pipeline } from '../../../common'; -import type { RelatedState } from '../../types'; +import type { Pipeline } from '../../../common'; +import type { RelatedState, SimplifiedProcessors, SimplifiedProcessor } from '../../types'; import { combineProcessors } from '../../util/processors'; import { RELATED_MAIN_PROMPT } from './prompts'; @@ -26,9 +26,14 @@ export async function handleRelated( pipeline_results: JSON.stringify(state.pipelineResults, null, 2), ex_answer: state.exAnswer, ecs: state.ecs, - })) as ESProcessorItem[]; + })) as SimplifiedProcessor[]; - const currentPipeline = combineProcessors(state.initialPipeline as Pipeline, currentProcessors); + const processors = { + type: 'related', + processors: currentProcessors, + } as SimplifiedProcessors; + + const currentPipeline = combineProcessors(state.initialPipeline as Pipeline, processors); return { currentPipeline, diff --git a/x-pack/plugins/integration_assistant/server/graphs/related/review.ts b/x-pack/plugins/integration_assistant/server/graphs/related/review.ts index 6c07079e18f48..31abb6ca5a60c 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/related/review.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/related/review.ts @@ -9,8 +9,8 @@ import type { ActionsClientSimpleChatModel, } from '@kbn/langchain/server/language_models'; import { JsonOutputParser } from '@langchain/core/output_parsers'; -import type { ESProcessorItem, Pipeline } from '../../../common'; -import type { RelatedState } from '../../types'; +import type { Pipeline } from '../../../common'; +import type { RelatedState, SimplifiedProcessors, SimplifiedProcessor } from '../../types'; import { combineProcessors } from '../../util/processors'; import { RELATED_REVIEW_PROMPT } from './prompts'; @@ -25,10 +25,16 @@ export async function handleReview( const currentProcessors = (await relatedReviewGraph.invoke({ current_processors: JSON.stringify(state.currentProcessors, null, 2), ex_answer: state.exAnswer, + previous_error: state.previousError, pipeline_results: JSON.stringify(state.pipelineResults, null, 2), - })) as ESProcessorItem[]; + })) as SimplifiedProcessor[]; - const currentPipeline = combineProcessors(state.initialPipeline as Pipeline, currentProcessors); + const processors = { + type: 'related', + processors: currentProcessors, + } as SimplifiedProcessors; + + const currentPipeline = combineProcessors(state.initialPipeline as Pipeline, processors); return { currentPipeline, diff --git a/x-pack/plugins/integration_assistant/server/templates/processors/append.yml.njk b/x-pack/plugins/integration_assistant/server/templates/processors/append.yml.njk new file mode 100644 index 0000000000000..5772951b51061 --- /dev/null +++ b/x-pack/plugins/integration_assistant/server/templates/processors/append.yml.njk @@ -0,0 +1,25 @@ +{% if processors.type == 'categorization' %} +{% for processor in processors.processors %} + - append: + field: {{ processor.field }} + value: {{ processor.value | dump }} + {% if processor.if %} + if: {{ processor.if | dump }} + {% endif %} + allow_duplicates: false +{% endfor %} +{% endif %} + +{% if processors.type == 'related' %} +{% for processor in processors.processors %} + - append: + field: {{ processor.field }} + value: {% raw %}'{{{{% endraw %}{{ processor.value_field }}{% raw %}}}}'{% endraw %} + {% if processor.if %} + if: {{ processor.if | dump }} + {% else %} + if: ctx.{{ processor.value_field | replace('.', '?.') }} != null + {% endif %} + allow_duplicates: false +{% endfor %} +{% endif %} \ No newline at end of file diff --git a/x-pack/plugins/integration_assistant/server/types.ts b/x-pack/plugins/integration_assistant/server/types.ts index 503c318648bad..f98686145690e 100644 --- a/x-pack/plugins/integration_assistant/server/types.ts +++ b/x-pack/plugins/integration_assistant/server/types.ts @@ -20,6 +20,18 @@ export interface IntegrationAssistantPluginStartDependencies { licensing: LicensingPluginStart; } +export interface SimplifiedProcessor { + if?: string; + field: string; + value_from?: string; + value?: string; +} + +export interface SimplifiedProcessors { + type: string; + processors: SimplifiedProcessor[]; +} + export interface CategorizationState { rawSamples: string[]; samples: string[]; @@ -31,12 +43,14 @@ export interface CategorizationState { packageName: string; dataStreamName: string; errors: object; + previousError: string; pipelineResults: object[]; finalized: boolean; reviewed: boolean; currentPipeline: object; currentProcessors: object[]; - invalidCategorization: object; + invalidCategorization: object[]; + previousInvalidCategorization: string; initialPipeline: object; results: object; } @@ -70,6 +84,7 @@ export interface RelatedState { packageName: string; dataStreamName: string; errors: object; + previousError: string; pipelineResults: object[]; finalized: boolean; reviewed: boolean; diff --git a/x-pack/plugins/integration_assistant/server/util/graph.ts b/x-pack/plugins/integration_assistant/server/util/graph.ts index 6149be42ce446..a4e8141eae408 100644 --- a/x-pack/plugins/integration_assistant/server/util/graph.ts +++ b/x-pack/plugins/integration_assistant/server/util/graph.ts @@ -12,9 +12,11 @@ export async function handleValidatePipeline( state: CategorizationState | RelatedState, client: IScopedClusterClient ): Promise | Partial> { + const previousError = JSON.stringify(state.errors, null, 2); const results = await testPipeline(state.rawSamples, state.currentPipeline, client); return { errors: results.errors, + previousError, pipelineResults: results.pipelineResults, lastExecutedChain: 'validate_pipeline', }; diff --git a/x-pack/plugins/integration_assistant/server/util/processors.ts b/x-pack/plugins/integration_assistant/server/util/processors.ts index 8c28a21b16b3c..bfd544ec1182d 100644 --- a/x-pack/plugins/integration_assistant/server/util/processors.ts +++ b/x-pack/plugins/integration_assistant/server/util/processors.ts @@ -5,24 +5,44 @@ * 2.0. */ -import type { ESProcessorItem, Pipeline } from '../../common'; +import { load } from 'js-yaml'; +import { join as joinPath } from 'path'; +import { Environment, FileSystemLoader } from 'nunjucks'; import { deepCopy } from './util'; +import type { ESProcessorItem, Pipeline } from '../../common'; +import type { SimplifiedProcessors } from '../types'; export function combineProcessors( initialPipeline: Pipeline, - processors: ESProcessorItem[] + processors: SimplifiedProcessors ): Pipeline { // Create a deep copy of the initialPipeline to avoid modifying the original input const currentPipeline = deepCopy(initialPipeline); - - // Add the new processors right before the last 2 removeprocessor in the initial pipeline. + if (Object.keys(processors?.processors).length === 0) { + return currentPipeline; + } + // Add the new processors right before the last 2 remove processor in the initial pipeline. // This is so all the processors if conditions are not accessing possibly removed fields. const currentProcessors = currentPipeline.processors; + const appendProcessors = createAppendProcessors(processors); const combinedProcessors = [ ...currentProcessors.slice(0, -2), - ...processors, + ...appendProcessors, ...currentProcessors.slice(-2), ]; currentPipeline.processors = combinedProcessors; return currentPipeline; } + +// The related and categorization graphs returns a simplified array of append processors. +// This function converts the simplified array to the full ESProcessorItem array. +function createAppendProcessors(processors: SimplifiedProcessors): ESProcessorItem[] { + const templatesPath = joinPath(__dirname, '../templates/processors'); + const env = new Environment(new FileSystemLoader(templatesPath), { + autoescape: false, + }); + const template = env.getTemplate('append.yml.njk'); + const renderedTemplate = template.render({ processors }); + const appendProcessors = load(renderedTemplate) as ESProcessorItem[]; + return appendProcessors; +} diff --git a/x-pack/plugins/lens/public/datasources/text_based/utils.test.ts b/x-pack/plugins/lens/public/datasources/text_based/utils.test.ts index a337ec4d040f3..b7cd0da76e50f 100644 --- a/x-pack/plugins/lens/public/datasources/text_based/utils.test.ts +++ b/x-pack/plugins/lens/public/datasources/text_based/utils.test.ts @@ -291,7 +291,7 @@ describe('Text based languages utils', () => { const expressionsMock = expressionsPluginMock.createStartContract(); const updatedState = await getStateFromAggregateQuery( state, - { esql: 'FROM my-fake-index-pattern | WHERE time <= ?end' }, + { esql: 'FROM my-fake-index-pattern | WHERE time <= ?t_end' }, { ...dataViewsMock, getIdsWithTitle: jest.fn().mockReturnValue( @@ -361,7 +361,7 @@ describe('Text based languages utils', () => { errors: [], index: '4', query: { - esql: 'FROM my-fake-index-pattern | WHERE time <= ?end', + esql: 'FROM my-fake-index-pattern | WHERE time <= ?t_end', }, timeField: 'time', }, diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/settings/custom_link/create_edit_custom_link_flyout/filters_section.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/settings/custom_link/create_edit_custom_link_flyout/filters_section.tsx index 24b458f9b9fd3..33361e5ebc23e 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/settings/custom_link/create_edit_custom_link_flyout/filters_section.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/settings/custom_link/create_edit_custom_link_flyout/filters_section.tsx @@ -76,49 +76,52 @@ export function FiltersSection({ const filterId = `filter-${idx}`; const selectOptions = getSelectOptions(filters, key); return ( - - - - // set value to empty string to reset value when new field is selected - onChangeFilter(e.target.value as FilterKey, '', idx) - } - isInvalid={!isEmpty(value) && (isEmpty(key) || key === DEFAULT_OPTION.value)} - /> - - - onChangeFilter(key, selectedValue as string, idx)} - defaultValue={value} - isInvalid={!isEmpty(key) && isEmpty(value)} - start={moment().subtract(24, 'h').toISOString()} - end={moment().toISOString()} - /> - - - onRemoveFilter(idx)} - disabled={!value && !key && filters.length === 1} - /> - - + + + + + // set value to empty string to reset value when new field is selected + onChangeFilter(e.target.value as FilterKey, '', idx) + } + isInvalid={!isEmpty(value) && (isEmpty(key) || key === DEFAULT_OPTION.value)} + /> + + + onChangeFilter(key, selectedValue as string, idx)} + defaultValue={value} + isInvalid={!isEmpty(key) && isEmpty(value)} + start={moment().subtract(24, 'h').toISOString()} + end={moment().toISOString()} + /> + + + onRemoveFilter(idx)} + disabled={!value && !key && filters.length === 1} + /> + + + + ); })} diff --git a/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients.ts b/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients.ts index 4ddd64fd0a3bc..6754d0b75dc6d 100644 --- a/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients.ts +++ b/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients.ts @@ -4,9 +4,11 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + import { ESSearchRequest, InferSearchResponseOf } from '@kbn/es-types'; import type { KibanaRequest } from '@kbn/core/server'; import { ElasticsearchClient } from '@kbn/core/server'; +import { entitiesAliasPattern, ENTITY_LATEST, ENTITY_HISTORY } from '@kbn/entities-schema'; import { unwrapEsResponse } from '@kbn/observability-plugin/common/utils/unwrap_es_response'; import { MsearchMultisearchBody, @@ -15,8 +17,14 @@ import { import { withApmSpan } from '../../../../utils/with_apm_span'; import { EntityType } from '../../../../routes/entities/types'; -const ENTITIES_LATEST_INDEX_NAME = `entities-${EntityType.SERVICE}-latest`; -const ENTITIES_HISTORY_INDEX_NAME = `entities-${EntityType.SERVICE}-history`; +const SERVICE_ENTITIES_LATEST_ALIAS = entitiesAliasPattern({ + type: EntityType.SERVICE, + dataset: ENTITY_LATEST, +}); +const SERVICE_ENTITIES_HISTORY_ALIAS = entitiesAliasPattern({ + type: EntityType.SERVICE, + dataset: ENTITY_HISTORY, +}); export function cancelEsRequestOnAbort>( promise: T, @@ -82,14 +90,14 @@ export async function createEntitiesESClient({ operationName: string, searchRequest: TSearchRequest ): Promise> { - return search(ENTITIES_LATEST_INDEX_NAME, operationName, searchRequest); + return search(SERVICE_ENTITIES_LATEST_ALIAS, operationName, searchRequest); }, searchHistory( operationName: string, searchRequest: TSearchRequest ): Promise> { - return search(ENTITIES_HISTORY_INDEX_NAME, operationName, searchRequest); + return search(SERVICE_ENTITIES_HISTORY_ALIAS, operationName, searchRequest); }, async msearch( @@ -99,7 +107,7 @@ export async function createEntitiesESClient({ .map((params) => { const searchParams: [MsearchMultisearchHeader, MsearchMultisearchBody] = [ { - index: [ENTITIES_LATEST_INDEX_NAME], + index: [SERVICE_ENTITIES_LATEST_ALIAS], ignore_unavailable: true, }, { diff --git a/x-pack/plugins/observability_solution/apm/server/routes/suggestions/get_suggestions_with_terms_aggregation.test.ts b/x-pack/plugins/observability_solution/apm/server/routes/suggestions/get_suggestions_with_terms_aggregation.test.ts new file mode 100644 index 0000000000000..3d5368133982c --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/server/routes/suggestions/get_suggestions_with_terms_aggregation.test.ts @@ -0,0 +1,97 @@ +/* + * 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 { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_event_client'; +import { getSuggestionsWithTermsAggregation } from './get_suggestions_with_terms_aggregation'; + +const mockSearch = jest.fn(); + +const apmEventClient: jest.Mocked = { + search: mockSearch, +} as any; + +describe('getSuggestionsWithTermsAggregation', () => { + const fieldValue = 'testFieldValue'; + const searchAggregatedTransactions = true; + const serviceName = 'testServiceName'; + const size = 10; + const start = 0; + const end = 1000; + + const defaultParams = { + fieldValue, + searchAggregatedTransactions, + serviceName, + apmEventClient, + size, + start, + end, + }; + + beforeEach(() => { + jest.clearAllMocks(); + mockSearch.mockResolvedValue({}); + }); + + it('should include wildcard query if testFieldName is provided', async () => { + const fieldName = 'testFieldName'; + + await getSuggestionsWithTermsAggregation({ + fieldName, + ...defaultParams, + }); + + expect(mockSearch).toHaveBeenCalledWith( + 'get_suggestions_with_terms_aggregation', + expectWildcardQueryPresenceInFilters({ fieldName, fieldValue, present: true }) + ); + }); + + it('should not include wildcard query if testFieldName is not provided', async () => { + const fieldName = ''; + + await getSuggestionsWithTermsAggregation({ + fieldName, + ...defaultParams, + }); + + expect(mockSearch).toHaveBeenCalledWith( + 'get_suggestions_with_terms_aggregation', + expectWildcardQueryPresenceInFilters({ fieldName, fieldValue, present: false }) + ); + }); +}); + +const expectWildcardQueryPresenceInFilters = (params: { + fieldName: string; + fieldValue: string; + present: boolean; +}) => { + const { fieldName, fieldValue, present } = params; + const wildcardQuery = createWildcardQueryMatcher(fieldName, fieldValue); + const expectation = present ? expect.arrayContaining : expect.not.arrayContaining; + + return expect.objectContaining({ + body: expect.objectContaining({ + query: expect.objectContaining({ + bool: expect.objectContaining({ + filter: expectation([expect.objectContaining(wildcardQuery)]), + }), + }), + }), + }); +}; + +const createWildcardQueryMatcher = (fieldName: string, fieldValue: string) => { + return { + wildcard: expect.objectContaining({ + [fieldName]: expect.objectContaining({ + value: `*${fieldValue}*`, + }), + }), + }; +}; diff --git a/x-pack/plugins/observability_solution/apm/server/routes/suggestions/get_suggestions_with_terms_aggregation.ts b/x-pack/plugins/observability_solution/apm/server/routes/suggestions/get_suggestions_with_terms_aggregation.ts index 2aac43482128d..9a2cea0ebf29d 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/suggestions/get_suggestions_with_terms_aggregation.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/suggestions/get_suggestions_with_terms_aggregation.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { rangeQuery, termQuery } from '@kbn/observability-plugin/server'; +import { rangeQuery, termQuery, wildcardQuery } from '@kbn/observability-plugin/server'; import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { getProcessorEventForTransactions } from '../../lib/helpers/transactions'; import { SERVICE_NAME } from '../../../common/es_fields/apm'; @@ -46,11 +46,7 @@ export async function getSuggestionsWithTermsAggregation({ filter: [ ...termQuery(SERVICE_NAME, serviceName), ...rangeQuery(start, end), - { - wildcard: { - [fieldName]: `*${fieldValue}*`, - }, - }, + ...(fieldName ? wildcardQuery(fieldName, fieldValue) : []), ], }, }, diff --git a/x-pack/plugins/observability_solution/apm/tsconfig.json b/x-pack/plugins/observability_solution/apm/tsconfig.json index ec8a63ea1fb65..b05447bc19e6c 100644 --- a/x-pack/plugins/observability_solution/apm/tsconfig.json +++ b/x-pack/plugins/observability_solution/apm/tsconfig.json @@ -126,7 +126,8 @@ "@kbn/react-hooks", "@kbn/server-route-repository-utils", "@kbn/core-analytics-browser", - "@kbn/apm-types" + "@kbn/apm-types", + "@kbn/entities-schema" ], "exclude": [ "target/**/*" diff --git a/x-pack/plugins/observability_solution/entity_manager/common/constants_entities.ts b/x-pack/plugins/observability_solution/entity_manager/common/constants_entities.ts index a3194339fac1f..c53847afbb548 100644 --- a/x-pack/plugins/observability_solution/entity_manager/common/constants_entities.ts +++ b/x-pack/plugins/observability_solution/entity_manager/common/constants_entities.ts @@ -5,11 +5,15 @@ * 2.0. */ +import { + ENTITY_BASE_PREFIX, + ENTITY_SCHEMA_VERSION_V1, + ENTITY_HISTORY, + ENTITY_LATEST, +} from '@kbn/entities-schema'; + // Base constants -export const ENTITY_BASE_PREFIX = 'entities'; -export const ENTITY_SCHEMA_VERSION_V1 = 'v1'; -export const ENTITY_INDEX_PREFIX = `.${ENTITY_BASE_PREFIX}` as const; -export const ENTITY_INDICES_PATTERN = `${ENTITY_INDEX_PREFIX}*` as const; +export const ENTITY_INTERNAL_INDICES_PATTERN = `.${ENTITY_BASE_PREFIX}*` as const; export const ENTITY_ENTITY_COMPONENT_TEMPLATE_V1 = `${ENTITY_BASE_PREFIX}_${ENTITY_SCHEMA_VERSION_V1}_entity` as const; @@ -17,24 +21,16 @@ export const ENTITY_EVENT_COMPONENT_TEMPLATE_V1 = `${ENTITY_BASE_PREFIX}_${ENTITY_SCHEMA_VERSION_V1}_event` as const; // History constants -export const ENTITY_HISTORY = 'history' as const; export const ENTITY_HISTORY_BASE_COMPONENT_TEMPLATE_V1 = `${ENTITY_BASE_PREFIX}_${ENTITY_SCHEMA_VERSION_V1}_${ENTITY_HISTORY}_base` as const; export const ENTITY_HISTORY_PREFIX_V1 = `${ENTITY_BASE_PREFIX}-${ENTITY_SCHEMA_VERSION_V1}-${ENTITY_HISTORY}` as const; -export const ENTITY_HISTORY_BACKFILL_PREFIX_V1 = - `${ENTITY_BASE_PREFIX}-${ENTITY_SCHEMA_VERSION_V1}-${ENTITY_HISTORY}-backfill` as const; -export const ENTITY_HISTORY_INDEX_PREFIX_V1 = - `${ENTITY_INDEX_PREFIX}.${ENTITY_SCHEMA_VERSION_V1}.${ENTITY_HISTORY}` as const; // Latest constants -export const ENTITY_LATEST = 'latest' as const; export const ENTITY_LATEST_BASE_COMPONENT_TEMPLATE_V1 = `${ENTITY_BASE_PREFIX}_${ENTITY_SCHEMA_VERSION_V1}_${ENTITY_LATEST}_base` as const; export const ENTITY_LATEST_PREFIX_V1 = `${ENTITY_BASE_PREFIX}-${ENTITY_SCHEMA_VERSION_V1}-${ENTITY_LATEST}` as const; -export const ENTITY_LATEST_INDEX_PREFIX_V1 = - `${ENTITY_INDEX_PREFIX}.${ENTITY_SCHEMA_VERSION_V1}.${ENTITY_LATEST}` as const; // Transform constants export const ENTITY_DEFAULT_HISTORY_FREQUENCY = '1m'; diff --git a/x-pack/plugins/observability_solution/entity_manager/common/helpers.ts b/x-pack/plugins/observability_solution/entity_manager/common/helpers.ts index 97a6317fee283..f18e8526c0c21 100644 --- a/x-pack/plugins/observability_solution/entity_manager/common/helpers.ts +++ b/x-pack/plugins/observability_solution/entity_manager/common/helpers.ts @@ -7,10 +7,10 @@ import { ENTITY_BASE_PREFIX, + ENTITY_SCHEMA_VERSION_V1, ENTITY_HISTORY, ENTITY_LATEST, - ENTITY_SCHEMA_VERSION_V1, -} from './constants_entities'; +} from '@kbn/entities-schema'; export const getEntityHistoryIndexTemplateV1 = (definitionId: string) => `${ENTITY_BASE_PREFIX}_${ENTITY_SCHEMA_VERSION_V1}_${ENTITY_HISTORY}_${definitionId}_index_template` as const; diff --git a/x-pack/plugins/observability_solution/entity_manager/server/lib/auth/privileges.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/auth/privileges.ts index 9de76ac7b4c5c..5ca3da77d7eba 100644 --- a/x-pack/plugins/observability_solution/entity_manager/server/lib/auth/privileges.ts +++ b/x-pack/plugins/observability_solution/entity_manager/server/lib/auth/privileges.ts @@ -6,7 +6,7 @@ */ import { ElasticsearchClient } from '@kbn/core/server'; -import { ENTITY_INDICES_PATTERN } from '../../../common/constants_entities'; +import { ENTITY_INTERNAL_INDICES_PATTERN } from '../../../common/constants_entities'; import { SO_ENTITY_DEFINITION_TYPE, SO_ENTITY_DISCOVERY_API_KEY_TYPE } from '../../saved_objects'; import { BUILT_IN_ALLOWED_INDICES } from '../entities/built_in/constants'; @@ -58,11 +58,11 @@ export const entityDefinitionRuntimePrivileges = { cluster: ['manage_transform', 'manage_ingest_pipelines', 'manage_index_templates'], index: [ { - names: [ENTITY_INDICES_PATTERN], + names: [ENTITY_INTERNAL_INDICES_PATTERN], privileges: ['create_index', 'index', 'create_doc', 'auto_configure', 'read'], }, { - names: [...BUILT_IN_ALLOWED_INDICES, ENTITY_INDICES_PATTERN], + names: [...BUILT_IN_ALLOWED_INDICES, ENTITY_INTERNAL_INDICES_PATTERN], privileges: ['read', 'view_index_metadata'], }, ], @@ -79,7 +79,7 @@ export const entityDefinitionDeletionPrivileges = { cluster: ['manage_transform', 'manage_ingest_pipelines', 'manage_index_templates'], index: [ { - names: [ENTITY_INDICES_PATTERN], + names: [ENTITY_INTERNAL_INDICES_PATTERN], privileges: ['delete_index'], }, ], diff --git a/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/helpers/generate_component_id.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/helpers/generate_component_id.ts index 1be53fc0af8c9..2aa3fb992c9ca 100644 --- a/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/helpers/generate_component_id.ts +++ b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/helpers/generate_component_id.ts @@ -5,40 +5,51 @@ * 2.0. */ -import { EntityDefinition } from '@kbn/entities-schema'; import { - ENTITY_HISTORY_BACKFILL_PREFIX_V1, - ENTITY_HISTORY_INDEX_PREFIX_V1, + ENTITY_HISTORY, + ENTITY_LATEST, + ENTITY_SCHEMA_VERSION_V1, + EntityDefinition, + entitiesIndexPattern, +} from '@kbn/entities-schema'; +import { ENTITY_HISTORY_PREFIX_V1, - ENTITY_LATEST_INDEX_PREFIX_V1, ENTITY_LATEST_PREFIX_V1, } from '../../../../common/constants_entities'; // History function generateHistoryId(definition: EntityDefinition) { - return `${ENTITY_HISTORY_PREFIX_V1}-${definition.id}`; + return `${ENTITY_HISTORY_PREFIX_V1}-${definition.id}` as const; } // History Backfill export function generateHistoryBackfillTransformId(definition: EntityDefinition) { - return `${ENTITY_HISTORY_BACKFILL_PREFIX_V1}-${definition.id}`; + return `${ENTITY_HISTORY_PREFIX_V1}-backfill-${definition.id}` as const; } export const generateHistoryTransformId = generateHistoryId; export const generateHistoryIngestPipelineId = generateHistoryId; export function generateHistoryIndexName(definition: EntityDefinition) { - return `${ENTITY_HISTORY_INDEX_PREFIX_V1}.${definition.id}`; + return entitiesIndexPattern({ + schemaVersion: ENTITY_SCHEMA_VERSION_V1, + dataset: ENTITY_HISTORY, + definitionId: definition.id, + }); } // Latest function generateLatestId(definition: EntityDefinition) { - return `${ENTITY_LATEST_PREFIX_V1}-${definition.id}`; + return `${ENTITY_LATEST_PREFIX_V1}-${definition.id}` as const; } export const generateLatestTransformId = generateLatestId; export const generateLatestIngestPipelineId = generateLatestId; export function generateLatestIndexName(definition: EntityDefinition) { - return `${ENTITY_LATEST_INDEX_PREFIX_V1}.${definition.id}`; + return entitiesIndexPattern({ + schemaVersion: ENTITY_SCHEMA_VERSION_V1, + dataset: ENTITY_LATEST, + definitionId: definition.id, + }); } diff --git a/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_history_processors.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_history_processors.ts index 36c3f32342477..0dd2bb0a8f465 100644 --- a/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_history_processors.ts +++ b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_history_processors.ts @@ -5,8 +5,7 @@ * 2.0. */ -import { EntityDefinition } from '@kbn/entities-schema'; -import { ENTITY_SCHEMA_VERSION_V1 } from '../../../../common/constants_entities'; +import { EntityDefinition, ENTITY_SCHEMA_VERSION_V1 } from '@kbn/entities-schema'; import { initializePathScript, cleanScript, diff --git a/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_latest_processors.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_latest_processors.ts index f5cd75d218e97..f1a45d297554e 100644 --- a/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_latest_processors.ts +++ b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/ingest_pipeline/generate_latest_processors.ts @@ -5,8 +5,7 @@ * 2.0. */ -import { EntityDefinition } from '@kbn/entities-schema'; -import { ENTITY_SCHEMA_VERSION_V1 } from '../../../../common/constants_entities'; +import { EntityDefinition, ENTITY_SCHEMA_VERSION_V1 } from '@kbn/entities-schema'; import { initializePathScript, cleanScript, diff --git a/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/templates/entities_history_template.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/templates/entities_history_template.ts index 03f3a3510f627..d6007e8287138 100644 --- a/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/templates/entities_history_template.ts +++ b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/templates/entities_history_template.ts @@ -6,15 +6,18 @@ */ import { IndicesPutIndexTemplateRequest } from '@elastic/elasticsearch/lib/api/types'; -import { EntityDefinition } from '@kbn/entities-schema'; +import { + ENTITY_HISTORY, + EntityDefinition, + entitiesIndexPattern, + entitiesAliasPattern, + ENTITY_SCHEMA_VERSION_V1, +} from '@kbn/entities-schema'; import { getEntityHistoryIndexTemplateV1 } from '../../../../common/helpers'; import { - ENTITY_BASE_PREFIX, ENTITY_ENTITY_COMPONENT_TEMPLATE_V1, ENTITY_EVENT_COMPONENT_TEMPLATE_V1, - ENTITY_HISTORY, ENTITY_HISTORY_BASE_COMPONENT_TEMPLATE_V1, - ENTITY_HISTORY_INDEX_PREFIX_V1, } from '../../../../common/constants_entities'; import { getCustomHistoryTemplateComponents } from '../../../templates/components/helpers'; @@ -36,11 +39,17 @@ export const getEntitiesHistoryIndexTemplateConfig = ( ENTITY_EVENT_COMPONENT_TEMPLATE_V1, ...getCustomHistoryTemplateComponents(definition.id), ], - index_patterns: [`${ENTITY_HISTORY_INDEX_PREFIX_V1}.${definition.id}.*`], + index_patterns: [ + `${entitiesIndexPattern({ + schemaVersion: ENTITY_SCHEMA_VERSION_V1, + dataset: ENTITY_HISTORY, + definitionId: definition.id, + })}.*`, + ], priority: 200, template: { aliases: { - [`${ENTITY_BASE_PREFIX}-${definition.type}-${ENTITY_HISTORY}`]: {}, + [entitiesAliasPattern({ type: definition.type, dataset: ENTITY_HISTORY })]: {}, }, mappings: { _meta: { diff --git a/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/templates/entities_latest_template.ts b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/templates/entities_latest_template.ts index 7b0093bb4b83f..e97be68e696d1 100644 --- a/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/templates/entities_latest_template.ts +++ b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/templates/entities_latest_template.ts @@ -6,15 +6,18 @@ */ import { IndicesPutIndexTemplateRequest } from '@elastic/elasticsearch/lib/api/types'; -import { EntityDefinition } from '@kbn/entities-schema'; +import { + ENTITY_LATEST, + ENTITY_SCHEMA_VERSION_V1, + EntityDefinition, + entitiesIndexPattern, + entitiesAliasPattern, +} from '@kbn/entities-schema'; import { getEntityLatestIndexTemplateV1 } from '../../../../common/helpers'; import { - ENTITY_BASE_PREFIX, ENTITY_ENTITY_COMPONENT_TEMPLATE_V1, ENTITY_EVENT_COMPONENT_TEMPLATE_V1, - ENTITY_LATEST, ENTITY_LATEST_BASE_COMPONENT_TEMPLATE_V1, - ENTITY_LATEST_INDEX_PREFIX_V1, } from '../../../../common/constants_entities'; import { getCustomLatestTemplateComponents } from '../../../templates/components/helpers'; @@ -36,11 +39,17 @@ export const getEntitiesLatestIndexTemplateConfig = ( ENTITY_EVENT_COMPONENT_TEMPLATE_V1, ...getCustomLatestTemplateComponents(definition.id), ], - index_patterns: [`${ENTITY_LATEST_INDEX_PREFIX_V1}.${definition.id}`], + index_patterns: [ + entitiesIndexPattern({ + schemaVersion: ENTITY_SCHEMA_VERSION_V1, + dataset: ENTITY_LATEST, + definitionId: definition.id, + }), + ], priority: 200, template: { aliases: { - [`${ENTITY_BASE_PREFIX}-${definition.type}-${ENTITY_LATEST}`]: {}, + [entitiesAliasPattern({ type: definition.type, dataset: ENTITY_LATEST })]: {}, }, mappings: { _meta: { diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/dashboards/dashboards.tsx b/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/dashboards/dashboards.tsx index 35f4e9fe8a690..2c7aaeafa6878 100644 --- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/dashboards/dashboards.tsx +++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/dashboards/dashboards.tsx @@ -29,7 +29,7 @@ import type { SerializableRecord } from '@kbn/utility-types'; import { ASSET_DETAILS_FLYOUT_LOCATOR_ID, ASSET_DETAILS_LOCATOR_ID, -} from '@kbn/observability-shared-plugin/public'; +} from '@kbn/observability-shared-plugin/common'; import { useLocation } from 'react-router-dom'; import { decode } from '@kbn/rison'; import { isEqual } from 'lodash'; diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/profiling/profiling_links.tsx b/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/profiling/profiling_links.tsx index d9619a9928660..5f0d3795f4743 100644 --- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/profiling/profiling_links.tsx +++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/profiling/profiling_links.tsx @@ -8,9 +8,11 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiFlexGroup, EuiFlexItem, EuiLink } from '@elastic/eui'; -import { FlamegraphLocator } from '@kbn/observability-shared-plugin/public/locators/profiling/flamegraph_locator'; -import { TopNFunctionsLocator } from '@kbn/observability-shared-plugin/public/locators/profiling/topn_functions_locator'; -import { StacktracesLocator } from '@kbn/observability-shared-plugin/public/locators/profiling/stacktraces_locator'; +import { + TopNFunctionsLocator, + StacktracesLocator, + FlamegraphLocator, +} from '@kbn/observability-shared-plugin/common'; import { HOST_NAME_FIELD } from '../../../../../common/constants'; const PROFILING_FEEDBACK_URL = 'https://ela.st/profiling-feedback'; diff --git a/x-pack/plugins/observability_solution/infra/public/components/logging/log_analysis_job_status/job_configuration_outdated_callout.tsx b/x-pack/plugins/observability_solution/infra/public/components/logging/log_analysis_job_status/job_configuration_outdated_callout.tsx index 877ac4a9e3b35..f3bfd2d7dc6fd 100644 --- a/x-pack/plugins/observability_solution/infra/public/components/logging/log_analysis_job_status/job_configuration_outdated_callout.tsx +++ b/x-pack/plugins/observability_solution/infra/public/components/logging/log_analysis_job_status/job_configuration_outdated_callout.tsx @@ -28,7 +28,7 @@ export const JobConfigurationOutdatedCallout: React.FC<{ > { + const { + services: { application }, + } = useKibanaContextForPlugin(); + + const advancedSettingsHref = useMemo( + () => getKibanaAdvancedSettingsHref(application), + [application] + ); + const changeIsIndexSelected = useCallback( (indexName: string, isSelected: boolean) => { onChangeSelectedIndices( @@ -67,7 +84,20 @@ export const AnalysisSetupIndicesForm: React.FunctionComponent<{ + + + ), + }} /> diff --git a/x-pack/plugins/observability_solution/infra/public/components/ml/anomaly_detection/job_setup_screen.tsx b/x-pack/plugins/observability_solution/infra/public/components/ml/anomaly_detection/job_setup_screen.tsx index 87f58129ebf8b..9543e84585c02 100644 --- a/x-pack/plugins/observability_solution/infra/public/components/ml/anomaly_detection/job_setup_screen.tsx +++ b/x-pack/plugins/observability_solution/infra/public/components/ml/anomaly_detection/job_setup_screen.tsx @@ -223,12 +223,12 @@ export const JobSetupScreen = (props: Props) => { /> {setupStatus.reasons.map((errorMessage, i) => ( - <> - + + {errorMessage} - + ))} ({ indices: indexPattern.split(','), - sourceId: logViewId, + sourceId, spaceId, timestampField, runtimeMappings, }), - [indexPattern, logViewId, spaceId, timestampField, runtimeMappings] + [indexPattern, sourceId, spaceId, timestampField, runtimeMappings] ); const logAnalysisModule = useLogAnalysisModule({ diff --git a/x-pack/plugins/observability_solution/infra/public/containers/logs/log_analysis/modules/log_entry_rate/use_log_entry_rate_module.tsx b/x-pack/plugins/observability_solution/infra/public/containers/logs/log_analysis/modules/log_entry_rate/use_log_entry_rate_module.tsx index a00d9f0017c31..fa3d13294a634 100644 --- a/x-pack/plugins/observability_solution/infra/public/containers/logs/log_analysis/modules/log_entry_rate/use_log_entry_rate_module.tsx +++ b/x-pack/plugins/observability_solution/infra/public/containers/logs/log_analysis/modules/log_entry_rate/use_log_entry_rate_module.tsx @@ -17,14 +17,14 @@ import { logEntryRateModule } from './module_descriptor'; export const useLogEntryRateModule = ({ indexPattern, - logViewId, + sourceId, spaceId, idFormat, timestampField, runtimeMappings, }: { indexPattern: string; - logViewId: string; + sourceId: string; spaceId: string; idFormat: IdFormat; timestampField: string; @@ -33,12 +33,12 @@ export const useLogEntryRateModule = ({ const sourceConfiguration: ModuleSourceConfiguration = useMemo( () => ({ indices: indexPattern.split(','), - sourceId: logViewId, + sourceId, spaceId, timestampField, runtimeMappings, }), - [indexPattern, logViewId, spaceId, timestampField, runtimeMappings] + [indexPattern, sourceId, spaceId, timestampField, runtimeMappings] ); const logAnalysisModule = useLogAnalysisModule({ diff --git a/x-pack/plugins/observability_solution/infra/public/pages/link_to/redirect_to_host_detail_via_ip.tsx b/x-pack/plugins/observability_solution/infra/public/pages/link_to/redirect_to_host_detail_via_ip.tsx index b80708c91c2cd..ca271b46146c8 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/link_to/redirect_to_host_detail_via_ip.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/link_to/redirect_to_host_detail_via_ip.tsx @@ -10,7 +10,7 @@ import { RouteComponentProps } from 'react-router-dom'; import { i18n } from '@kbn/i18n'; import type { SerializableRecord } from '@kbn/utility-types'; -import { ASSET_DETAILS_LOCATOR_ID } from '@kbn/observability-shared-plugin/public'; +import { ASSET_DETAILS_LOCATOR_ID } from '@kbn/observability-shared-plugin/common'; import { useHostIpToName } from './use_host_ip_to_name'; import { LoadingPage } from '../../components/loading_page'; import { Error } from '../error'; diff --git a/x-pack/plugins/observability_solution/infra/public/pages/link_to/redirect_to_inventory.tsx b/x-pack/plugins/observability_solution/infra/public/pages/link_to/redirect_to_inventory.tsx index c6d0bed51ed9c..5f24a855d01df 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/link_to/redirect_to_inventory.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/link_to/redirect_to_inventory.tsx @@ -9,7 +9,7 @@ import React, { useEffect } from 'react'; import { parse } from 'query-string'; import { RouteComponentProps } from 'react-router-dom'; import type { SerializableRecord } from '@kbn/utility-types'; -import { INVENTORY_LOCATOR_ID } from '@kbn/observability-shared-plugin/public'; +import { INVENTORY_LOCATOR_ID } from '@kbn/observability-shared-plugin/common'; import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; export const RedirectToInventory: React.FC = ({ location }) => { diff --git a/x-pack/plugins/observability_solution/infra/public/pages/link_to/redirect_to_node_detail.tsx b/x-pack/plugins/observability_solution/infra/public/pages/link_to/redirect_to_node_detail.tsx index 137cb04a90034..714be106fad3f 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/link_to/redirect_to_node_detail.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/link_to/redirect_to_node_detail.tsx @@ -9,7 +9,10 @@ import { useEffect } from 'react'; import { useLocation, useRouteMatch } from 'react-router-dom'; import rison from '@kbn/rison'; import type { InventoryItemType } from '@kbn/metrics-data-access-plugin/common'; -import { ASSET_DETAILS_LOCATOR_ID } from '@kbn/observability-shared-plugin/public'; +import { + ASSET_DETAILS_LOCATOR_ID, + type AssetDetailsLocatorParams, +} from '@kbn/observability-shared-plugin/common'; import type { SerializableRecord } from '@kbn/utility-types'; import { AssetDetailsUrlState } from '../../components/asset_details/types'; import { ASSET_DETAILS_URL_STATE_KEY } from '../../components/asset_details/constants'; @@ -66,7 +69,7 @@ export const RedirectToNodeDetail = () => { services: { share }, } = useKibanaContextForPlugin(); const location = useLocation(); - const baseLocator = share.url.locators.get(ASSET_DETAILS_LOCATOR_ID); + const baseLocator = share.url.locators.get(ASSET_DETAILS_LOCATOR_ID); useEffect(() => { const queryParams = new URLSearchParams(location.search); diff --git a/x-pack/plugins/observability_solution/infra/public/pages/link_to/use_node_details_redirect.ts b/x-pack/plugins/observability_solution/infra/public/pages/link_to/use_node_details_redirect.ts index aca6a7f4ae9f4..3ef1bd0a9c39d 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/link_to/use_node_details_redirect.ts +++ b/x-pack/plugins/observability_solution/infra/public/pages/link_to/use_node_details_redirect.ts @@ -13,7 +13,7 @@ import { getRouterLinkProps } from '@kbn/router-utils'; import { type AssetDetailsLocatorParams, ASSET_DETAILS_LOCATOR_ID, -} from '@kbn/observability-shared-plugin/public'; +} from '@kbn/observability-shared-plugin/common'; import { RouterLinkProps } from '@kbn/router-utils/src/get_router_link_props'; import type { AssetDetailsUrlState, RouteState } from '../../components/asset_details/types'; import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; diff --git a/x-pack/plugins/observability_solution/infra/public/pages/logs/log_entry_categories/page_providers.tsx b/x-pack/plugins/observability_solution/infra/public/pages/logs/log_entry_categories/page_providers.tsx index bd1ae5d9c8336..f7a749eb6a312 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/logs/log_entry_categories/page_providers.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/logs/log_entry_categories/page_providers.tsx @@ -6,26 +6,27 @@ */ import React, { FC, PropsWithChildren } from 'react'; -import { useLogViewContext } from '@kbn/logs-shared-plugin/public'; +import { useLogSourcesContext } from '@kbn/logs-data-access-plugin/public'; import { logEntryCategoriesJobType } from '../../../../common/log_analysis'; -import { InlineLogViewSplashPage } from '../../../components/logging/inline_log_view_splash_page'; import { LogAnalysisSetupFlyoutStateProvider } from '../../../components/logging/log_analysis_setup/setup_flyout'; import { SourceLoadingPage } from '../../../components/source_loading_page'; import { LogEntryCategoriesModuleProvider } from '../../../containers/logs/log_analysis/modules/log_entry_categories'; import { useActiveKibanaSpace } from '../../../hooks/use_kibana_space'; -import { ConnectedLogViewErrorPage } from '../shared/page_log_view_error'; +import { LogSourceErrorPage } from '../shared/page_log_view_error'; import { useLogMlJobIdFormatsShimContext } from '../shared/use_log_ml_job_id_formats_shim'; +const TIMESTAMP_FIELD = '@timestamp'; +const DEFAULT_MODULE_SOURCE_CONFIGURATION_ID = 'default'; // NOTE: Left in for legacy reasons, this used to refer to a log view ID (legacy). + export const LogEntryCategoriesPageProviders: FC> = ({ children }) => { const { - hasFailedLoading, - isLoading, + logSources, + isLoadingLogSources, isUninitialized, - resolvedLogView, - logViewReference, - isPersistedLogView, - revertToDefaultLogView, - } = useLogViewContext(); + hasFailedLoadingLogSources, + logSourcesError, + combinedIndices, + } = useLogSourcesContext(); const { space } = useActiveKibanaSpace(); const { idFormats, isLoadingLogAnalysisIdFormats, hasFailedLoadingLogAnalysisIdFormats } = useLogMlJobIdFormatsShimContext(); @@ -35,24 +36,24 @@ export const LogEntryCategoriesPageProviders: FC> = ( // React concurrent mode and Suspense in order to handle that more gracefully. if (space == null) { return null; - } else if (!isPersistedLogView) { - return ; - } else if (hasFailedLoading || hasFailedLoadingLogAnalysisIdFormats) { - return ; - } else if (isLoading || isUninitialized || isLoadingLogAnalysisIdFormats || !idFormats) { + } else if (hasFailedLoadingLogSources || hasFailedLoadingLogAnalysisIdFormats) { + return ; + } else if ( + isLoadingLogSources || + isUninitialized || + isLoadingLogAnalysisIdFormats || + !idFormats + ) { return ; - } else if (resolvedLogView != null) { - if (logViewReference.type === 'log-view-inline') { - throw new Error('Logs ML features only support persisted Log View references'); - } + } else if (logSources.length > 0) { return ( {children} diff --git a/x-pack/plugins/observability_solution/infra/public/pages/logs/log_entry_rate/page_providers.tsx b/x-pack/plugins/observability_solution/infra/public/pages/logs/log_entry_rate/page_providers.tsx index d2cf0f3e613ee..a57eac0a16cd8 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/logs/log_entry_rate/page_providers.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/logs/log_entry_rate/page_providers.tsx @@ -6,29 +6,29 @@ */ import React, { FC, PropsWithChildren } from 'react'; -import { useLogViewContext } from '@kbn/logs-shared-plugin/public'; +import { useLogSourcesContext } from '@kbn/logs-data-access-plugin/public'; import { logEntryCategoriesJobType, logEntryRateJobType } from '../../../../common/log_analysis'; -import { InlineLogViewSplashPage } from '../../../components/logging/inline_log_view_splash_page'; import { LogAnalysisSetupFlyoutStateProvider } from '../../../components/logging/log_analysis_setup/setup_flyout'; import { SourceLoadingPage } from '../../../components/source_loading_page'; import { LogEntryCategoriesModuleProvider } from '../../../containers/logs/log_analysis/modules/log_entry_categories'; import { LogEntryRateModuleProvider } from '../../../containers/logs/log_analysis/modules/log_entry_rate'; import { LogEntryFlyoutProvider } from '../../../containers/logs/log_flyout'; import { useActiveKibanaSpace } from '../../../hooks/use_kibana_space'; -import { ConnectedLogViewErrorPage } from '../shared/page_log_view_error'; +import { LogSourceErrorPage } from '../shared/page_log_view_error'; import { useLogMlJobIdFormatsShimContext } from '../shared/use_log_ml_job_id_formats_shim'; +const TIMESTAMP_FIELD = '@timestamp'; +const DEFAULT_MODULE_SOURCE_CONFIGURATION_ID = 'default'; // NOTE: Left in for legacy reasons, this used to refer to a log view ID (legacy). + export const LogEntryRatePageProviders: FC> = ({ children }) => { const { - hasFailedLoading, - isLoading, + logSources, + isLoadingLogSources, isUninitialized, - logViewReference, - resolvedLogView, - isPersistedLogView, - revertToDefaultLogView, - } = useLogViewContext(); - + hasFailedLoadingLogSources, + logSourcesError, + combinedIndices, + } = useLogSourcesContext(); const { space } = useActiveKibanaSpace(); const { idFormats, isLoadingLogAnalysisIdFormats, hasFailedLoadingLogAnalysisIdFormats } = @@ -39,33 +39,33 @@ export const LogEntryRatePageProviders: FC> = ({ chil // React concurrent mode and Suspense in order to handle that more gracefully. if (space == null) { return null; - } else if (!isPersistedLogView) { - return ; - } else if (isLoading || isUninitialized || isLoadingLogAnalysisIdFormats || !idFormats) { + } else if ( + isLoadingLogSources || + isUninitialized || + isLoadingLogAnalysisIdFormats || + !idFormats + ) { return ; - } else if (hasFailedLoading || hasFailedLoadingLogAnalysisIdFormats) { - return ; - } else if (resolvedLogView != null) { - if (logViewReference.type === 'log-view-inline') { - throw new Error('Logs ML features only support persisted Log Views'); - } + } else if (hasFailedLoadingLogSources || hasFailedLoadingLogAnalysisIdFormats) { + return ; + } else if (logSources.length > 0) { return ( {children} diff --git a/x-pack/plugins/observability_solution/infra/public/pages/logs/page_providers.tsx b/x-pack/plugins/observability_solution/infra/public/pages/logs/page_providers.tsx index db4f00a8ab2b2..a0cd7f8639b24 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/logs/page_providers.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/logs/page_providers.tsx @@ -12,6 +12,7 @@ import { updateContextInUrl as createUpdateContextInUrl, listenForUrlChanges as createListenForUrlChanges, } from '@kbn/logs-shared-plugin/public'; +import { LogSourcesProvider } from '@kbn/logs-data-access-plugin/public'; import { LogAnalysisCapabilitiesProvider } from '../../containers/logs/log_analysis'; import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; import { useKbnUrlStateStorageFromRouterContext } from '../../containers/kbn_url_state_context'; @@ -21,6 +22,7 @@ export const LogsPageProviders: FC> = ({ children }) services: { notifications: { toasts: toastsService }, logsShared, + logsDataAccess, }, } = useKibanaContextForPlugin(); @@ -43,7 +45,9 @@ export const LogsPageProviders: FC> = ({ children }) updateContextInUrl={updateContextInUrl} listenForUrlChanges={listenForUrlChanges} > - {children} + + {children} + ); }; diff --git a/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/kibana_advanced_setting_configuration_panel.tsx b/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/kibana_advanced_setting_configuration_panel.tsx index 1d7d4ad997407..49636e4171f2f 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/kibana_advanced_setting_configuration_panel.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/kibana_advanced_setting_configuration_panel.tsx @@ -7,12 +7,12 @@ import { EuiDescribedFormGroup, EuiFieldText, EuiFormRow } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import React, { useEffect, useMemo, useState } from 'react'; +import React, { useMemo } from 'react'; import { useTrackPageview } from '@kbn/observability-shared-plugin/public'; import { LogSourcesKibanaAdvancedSettingReference } from '@kbn/logs-shared-plugin/common'; import { ApplicationStart } from '@kbn/core-application-browser'; import { EuiLink } from '@elastic/eui'; -import { useTrackedPromise } from '../../../hooks/use_tracked_promise'; +import { useLogSourcesContext } from '@kbn/logs-data-access-plugin/public'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; import { FormElement } from './form_elements'; import { getFormRowProps } from './form_field_props'; @@ -33,7 +33,7 @@ export const KibanaAdvancedSettingConfigurationPanel: React.FC<{ >; }> = ({ isLoading, isReadOnly, advancedSettingFormElement }) => { const { - services: { application, logsDataAccess }, + services: { application }, } = useKibanaContextForPlugin(); useTrackPageview({ app: 'infra_logs', path: 'log_source_configuration_kibana_advanced_setting' }); @@ -48,31 +48,7 @@ export const KibanaAdvancedSettingConfigurationPanel: React.FC<{ [application] ); - const [logSourcesSettingValue, setLogSourcesSettingValue] = useState( - undefined - ); - - const [getLogSourcesRequest, getLogSources] = useTrackedPromise( - { - cancelPreviousOn: 'resolution', - createPromise: async () => { - return await logsDataAccess.services.logSourcesService.getLogSources(); - }, - onResolve: (response) => { - setLogSourcesSettingValue(response.map((logSource) => logSource.indexPattern).join(',')); - }, - }, - [] - ); - - const isLoadingLogSourcesSetting = useMemo( - () => getLogSourcesRequest.state === 'pending', - [getLogSourcesRequest.state] - ); - - useEffect(() => { - getLogSources(); - }, [getLogSources]); + const { isLoadingLogSources, combinedIndices } = useLogSourcesContext(); return ( <> @@ -125,9 +101,9 @@ export const KibanaAdvancedSettingConfigurationPanel: React.FC<{ data-test-subj="logSourcesSettingInput" fullWidth disabled={isLoading} - isLoading={isLoadingLogSourcesSetting} + isLoading={isLoadingLogSources} readOnly={true} - value={logSourcesSettingValue} + value={combinedIndices} isInvalid={false} /> diff --git a/x-pack/plugins/observability_solution/infra/public/pages/logs/shared/page_log_view_error.tsx b/x-pack/plugins/observability_solution/infra/public/pages/logs/shared/page_log_view_error.tsx index 2ecb9efb7003c..64a307f1bdd6c 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/logs/shared/page_log_view_error.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/logs/shared/page_log_view_error.tsx @@ -21,7 +21,7 @@ import { LogsPageTemplate } from './page_template'; export const LogViewErrorPage: React.FC<{ errors: Error[]; - onRetry: () => void; + onRetry?: () => void; }> = ({ errors, onRetry }) => { const settingsLinkProps = useLinkProps({ app: 'logs', pathname: '/settings' }); @@ -54,29 +54,33 @@ export const LogViewErrorPage: React.FC<{ ))} } - actions={[ - - - , - - - , - ]} + actions={ + onRetry + ? [ + + + , + + + , + ] + : undefined + } /> ); diff --git a/x-pack/plugins/observability_solution/logs_data_access/public/hooks/use_log_sources.ts b/x-pack/plugins/observability_solution/logs_data_access/public/hooks/use_log_sources.ts new file mode 100644 index 0000000000000..ff463867a7a77 --- /dev/null +++ b/x-pack/plugins/observability_solution/logs_data_access/public/hooks/use_log_sources.ts @@ -0,0 +1,51 @@ +/* + * 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 createContainer from 'constate'; +import { useTrackedPromise } from '@kbn/use-tracked-promise'; +import { useState, useEffect, useMemo } from 'react'; +import { LogSource, LogSourcesService } from '../../common/services/log_sources_service/types'; + +export const useLogSources = ({ logSourcesService }: { logSourcesService: LogSourcesService }) => { + const [logSources, setLogSources] = useState([]); + const [logSourcesError, setLogSourcesError] = useState(undefined); + const [requestState, getLogSources] = useTrackedPromise( + { + cancelPreviousOn: 'resolution', + createPromise: async () => { + return await logSourcesService.getLogSources(); + }, + onResolve: (response) => { + setLogSources(response); + setLogSourcesError(undefined); + }, + onReject: (response) => { + setLogSourcesError(response as Error); + }, + }, + [] + ); + + useEffect(() => { + getLogSources(); + }, [getLogSources]); + + const combinedIndices = useMemo(() => { + return logSources.map((logSource) => logSource.indexPattern).join(','); + }, [logSources]); + + return { + isUninitialized: requestState.state === 'uninitialized', + isLoadingLogSources: requestState.state === 'pending', + hasFailedLoadingLogSources: logSourcesError !== undefined, + logSourcesError, + logSources, + combinedIndices, + }; +}; + +export const [LogSourcesProvider, useLogSourcesContext] = createContainer(useLogSources); diff --git a/x-pack/plugins/observability_solution/logs_data_access/public/index.ts b/x-pack/plugins/observability_solution/logs_data_access/public/index.ts index bdb45d3d0a490..cc09500ef0a84 100644 --- a/x-pack/plugins/observability_solution/logs_data_access/public/index.ts +++ b/x-pack/plugins/observability_solution/logs_data_access/public/index.ts @@ -15,6 +15,7 @@ import { export type { LogsDataAccessPluginSetup, LogsDataAccessPluginStart }; import { LogsDataAccessPluginSetupDeps, LogsDataAccessPluginStartDeps } from './types'; +export { LogSourcesProvider, useLogSourcesContext } from './hooks/use_log_sources'; export const plugin: PluginInitializer< LogsDataAccessPluginSetup, diff --git a/x-pack/plugins/observability_solution/logs_data_access/tsconfig.json b/x-pack/plugins/observability_solution/logs_data_access/tsconfig.json index 45c96d862d9ff..fb2457edd993f 100644 --- a/x-pack/plugins/observability_solution/logs_data_access/tsconfig.json +++ b/x-pack/plugins/observability_solution/logs_data_access/tsconfig.json @@ -21,6 +21,7 @@ "@kbn/core-ui-settings-browser", "@kbn/logging", "@kbn/core-saved-objects-api-server", - "@kbn/es-query" + "@kbn/es-query", + "@kbn/use-tracked-promise" ] } diff --git a/x-pack/plugins/observability_solution/observability/public/pages/annotations/annotations_list_chart.tsx b/x-pack/plugins/observability_solution/observability/public/pages/annotations/annotations_list_chart.tsx index 71103299f0fe8..9a80528a0e703 100644 --- a/x-pack/plugins/observability_solution/observability/public/pages/annotations/annotations_list_chart.tsx +++ b/x-pack/plugins/observability_solution/observability/public/pages/annotations/annotations_list_chart.tsx @@ -25,6 +25,7 @@ import { i18n } from '@kbn/i18n'; import { parse } from '@kbn/datemath'; import { TooltipValue } from '@elastic/charts/dist/specs'; import moment from 'moment'; +import { useChartThemes } from '../../hooks/use_chart_themes'; import { AnnotationsPermissions } from '../../components/annotations/hooks/use_annotation_permissions'; import { createAnnotationPortal } from './create_annotation_btn'; import { useAnnotations } from '../../components/annotations/use_annotations'; @@ -76,6 +77,8 @@ export function AnnotationsListChart({ { x: domain.max, y: 1 }, ]; + const { baseTheme } = useChartThemes(); + return ( <> @@ -113,6 +116,7 @@ export function AnnotationsListChart({ onBrushEnd={brushEndListener} onAnnotationClick={onAnnotationClick} xDomain={domain} + baseTheme={baseTheme} theme={{ chartMargins: { top: 50, diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.ts index 1da487e5a17cd..39f3de40450e7 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.ts @@ -23,11 +23,7 @@ export function useCustomCardsForCategory( const history = useHistory(); const location = useLocation(); const { - services: { - application, - http, - context: { isServerless }, - }, + services: { application, http }, } = useKibana(); const getUrlForApp = application?.getUrlForApp; @@ -132,7 +128,7 @@ export function useCustomCardsForCategory( integration: '', }, toFeaturedCard('docker'), - isServerless ? toFeaturedCard('prometheus') : otelCard, + otelCard, { id: 'azure-virtual', type: 'virtual', @@ -213,7 +209,7 @@ export function useCustomCardsForCategory( version: '', integration: '', }, - isServerless ? toFeaturedCard('nginx') : otelCard, + otelCard, { id: 'azure-logs-virtual', type: 'virtual', diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/kubernetes.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/kubernetes.tsx index 41162c70d9f19..8e1af954736c1 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/kubernetes.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/kubernetes.tsx @@ -19,7 +19,7 @@ export const KubernetesPage = () => ( headlineCopy={i18n.translate( 'xpack.observability_onboarding.experimentalOnboardingFlow.customHeader.kubernetes.text', { - defaultMessage: 'Setting up Kubernetes with Elastic Agent', + defaultMessage: 'Monitor your Kubernetes Cluster with standalone Elastic Agent', } )} captionCopy={i18n.translate( diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/auto_detect/auto_detect_panel.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/auto_detect/auto_detect_panel.tsx index f4a859c2d3b9f..155333c4a1806 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/auto_detect/auto_detect_panel.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/auto_detect/auto_detect_panel.tsx @@ -57,7 +57,7 @@ export const AutoDetectPanel: FunctionComponent = () => { { title: i18n.translate( 'xpack.observability_onboarding.autoDetectPanel.runTheCommandOnLabel', - { defaultMessage: 'Run the command on your host' } + { defaultMessage: 'Install standalone Elastic Agent on your host' } ), status: status === 'notStarted' ? 'current' : 'complete', children: command ? ( diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/index.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/index.tsx index 75f1376b35f7c..b3573e4cb2f1c 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/index.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/index.tsx @@ -41,7 +41,7 @@ export const KubernetesPanel: React.FC = () => { title: i18n.translate( 'xpack.observability_onboarding.experimentalOnboardingFlow.kubernetes.installStepTitle', { - defaultMessage: 'Install Elastic Agent on your Kubernetes cluster', + defaultMessage: 'Install standalone Elastic Agent on your Kubernetes cluster', } ), children: ( diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/otel_logs/index.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/otel_logs/index.tsx index e1081caab7e85..f3f0766b999d4 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/otel_logs/index.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/otel_logs/index.tsx @@ -71,12 +71,8 @@ export const OtelLogsPanel: React.FC = () => { }, } = useKibana(); - const AGENT_CDN_BASE_URL = isServerless - ? 'snapshots.elastic.co/8.15.0-bc431a00/downloads/beats/elastic-agent' - : 'artifacts.elastic.co/downloads/beats/elastic-agent'; - // TODO change once otel flow is shown on serverless - // const agentVersion = isServerless ? setup?.elasticAgentVersion : stackVersion; - const agentVersion = isServerless ? '8.15.0-SNAPSHOT' : stackVersion; + const AGENT_CDN_BASE_URL = 'artifacts.elastic.co/downloads/beats/elastic-agent'; + const agentVersion = isServerless ? setup?.elasticAgentVersion : stackVersion; const allDatasetsLocator = share.url.locators.get(ALL_DATASETS_LOCATOR_ID); diff --git a/x-pack/plugins/observability_solution/observability_shared/common/index.ts b/x-pack/plugins/observability_solution/observability_shared/common/index.ts index ea6e587d875d4..a2c97a630c4a5 100644 --- a/x-pack/plugins/observability_solution/observability_shared/common/index.ts +++ b/x-pack/plugins/observability_solution/observability_shared/common/index.ts @@ -147,3 +147,39 @@ export { getInspectResponse } from './utils/get_inspect_response'; export const LOGS_ONBOARDING_FEEDBACK_LINK = 'https://ela.st/logs-onboarding-feedback'; export const LOGS_EXPLORER_FEEDBACK_LINK = 'https://ela.st/explorer-feedback'; + +export type { + ServiceOverviewParams, + ServiceOverviewLocator, + TransactionDetailsByNameParams, + TransactionDetailsByNameLocator, + AssetDetailsFlyoutLocator, + AssetDetailsFlyoutLocatorParams, + AssetDetailsLocator, + AssetDetailsLocatorParams, + HostsLocator, + HostsLocatorParams, + InventoryLocator, + InventoryLocatorParams, + FlamegraphLocatorParams, + FlamegraphLocator, + StacktracesLocatorParams, + StacktracesLocator, + TopNFunctionsLocatorParams, + TopNFunctionsLocator, +} from './locators'; + +export { + ServiceOverviewLocatorDefinition, + TransactionDetailsByNameLocatorDefinition, + ASSET_DETAILS_FLYOUT_LOCATOR_ID, + AssetDetailsFlyoutLocatorDefinition, + ASSET_DETAILS_LOCATOR_ID, + AssetDetailsLocatorDefinition, + HostsLocatorDefinition, + INVENTORY_LOCATOR_ID, + InventoryLocatorDefinition, + FlamegraphLocatorDefinition, + StacktracesLocatorDefinition, + TopNFunctionsLocatorDefinition, +} from './locators'; diff --git a/x-pack/plugins/observability_solution/observability_shared/public/locators/apm/service_overview_locator.ts b/x-pack/plugins/observability_solution/observability_shared/common/locators/apm/service_overview_locator.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_shared/public/locators/apm/service_overview_locator.ts rename to x-pack/plugins/observability_solution/observability_shared/common/locators/apm/service_overview_locator.ts diff --git a/x-pack/plugins/observability_solution/observability_shared/public/locators/apm/transaction_details_by_name_locator.ts b/x-pack/plugins/observability_solution/observability_shared/common/locators/apm/transaction_details_by_name_locator.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_shared/public/locators/apm/transaction_details_by_name_locator.ts rename to x-pack/plugins/observability_solution/observability_shared/common/locators/apm/transaction_details_by_name_locator.ts diff --git a/x-pack/plugins/observability_solution/observability_shared/common/locators/index.ts b/x-pack/plugins/observability_solution/observability_shared/common/locators/index.ts new file mode 100644 index 0000000000000..f8f8ae7bbb433 --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_shared/common/locators/index.ts @@ -0,0 +1,16 @@ +/* + * 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 * from './apm/service_overview_locator'; +export * from './apm/transaction_details_by_name_locator'; +export * from './infra/asset_details_flyout_locator'; +export * from './infra/asset_details_locator'; +export * from './infra/hosts_locator'; +export * from './infra/inventory_locator'; +export * from './profiling/flamegraph_locator'; +export * from './profiling/stacktraces_locator'; +export * from './profiling/topn_functions_locator'; diff --git a/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_flyout_locator.ts b/x-pack/plugins/observability_solution/observability_shared/common/locators/infra/asset_details_flyout_locator.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_flyout_locator.ts rename to x-pack/plugins/observability_solution/observability_shared/common/locators/infra/asset_details_flyout_locator.ts diff --git a/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_locator.ts b/x-pack/plugins/observability_solution/observability_shared/common/locators/infra/asset_details_locator.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_locator.ts rename to x-pack/plugins/observability_solution/observability_shared/common/locators/infra/asset_details_locator.ts diff --git a/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/hosts_locator.ts b/x-pack/plugins/observability_solution/observability_shared/common/locators/infra/hosts_locator.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_shared/public/locators/infra/hosts_locator.ts rename to x-pack/plugins/observability_solution/observability_shared/common/locators/infra/hosts_locator.ts diff --git a/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/inventory_locator.ts b/x-pack/plugins/observability_solution/observability_shared/common/locators/infra/inventory_locator.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_shared/public/locators/infra/inventory_locator.ts rename to x-pack/plugins/observability_solution/observability_shared/common/locators/infra/inventory_locator.ts diff --git a/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/locators.test.ts b/x-pack/plugins/observability_solution/observability_shared/common/locators/infra/locators.test.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_shared/public/locators/infra/locators.test.ts rename to x-pack/plugins/observability_solution/observability_shared/common/locators/infra/locators.test.ts diff --git a/x-pack/plugins/observability_solution/observability_shared/public/locators/profiling/flamegraph_locator.ts b/x-pack/plugins/observability_solution/observability_shared/common/locators/profiling/flamegraph_locator.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_shared/public/locators/profiling/flamegraph_locator.ts rename to x-pack/plugins/observability_solution/observability_shared/common/locators/profiling/flamegraph_locator.ts diff --git a/x-pack/plugins/observability_solution/observability_shared/public/locators/profiling/stacktraces_locator.ts b/x-pack/plugins/observability_solution/observability_shared/common/locators/profiling/stacktraces_locator.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_shared/public/locators/profiling/stacktraces_locator.ts rename to x-pack/plugins/observability_solution/observability_shared/common/locators/profiling/stacktraces_locator.ts diff --git a/x-pack/plugins/observability_solution/observability_shared/public/locators/profiling/topn_functions_locator.ts b/x-pack/plugins/observability_solution/observability_shared/common/locators/profiling/topn_functions_locator.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_shared/public/locators/profiling/topn_functions_locator.ts rename to x-pack/plugins/observability_solution/observability_shared/common/locators/profiling/topn_functions_locator.ts diff --git a/x-pack/plugins/observability_solution/observability_shared/public/index.ts b/x-pack/plugins/observability_solution/observability_shared/public/index.ts index a06f086d6588d..b1d8f97425e3f 100644 --- a/x-pack/plugins/observability_solution/observability_shared/public/index.ts +++ b/x-pack/plugins/observability_solution/observability_shared/public/index.ts @@ -102,9 +102,3 @@ export { } from './components/feature_feedback_button/feature_feedback_button'; export { BottomBarActions } from './components/bottom_bar_actions/bottom_bar_actions'; export { FieldValueSelection, FieldValueSuggestions } from './components'; -export { ASSET_DETAILS_FLYOUT_LOCATOR_ID } from './locators/infra/asset_details_flyout_locator'; -export { INVENTORY_LOCATOR_ID } from './locators/infra/inventory_locator'; -export { - ASSET_DETAILS_LOCATOR_ID, - type AssetDetailsLocatorParams, -} from './locators/infra/asset_details_locator'; diff --git a/x-pack/plugins/observability_solution/observability_shared/public/plugin.ts b/x-pack/plugins/observability_solution/observability_shared/public/plugin.ts index 94c7d11ad7f69..8773ace90c71f 100644 --- a/x-pack/plugins/observability_solution/observability_shared/public/plugin.ts +++ b/x-pack/plugins/observability_solution/observability_shared/public/plugin.ts @@ -20,39 +20,26 @@ import { createLazyObservabilityPageTemplate } from './components/page_template' import { createNavigationRegistry } from './components/page_template/helpers/navigation_registry'; import { registerProfilingComponent } from './components/profiling/helpers/component_registry'; import { - type AssetDetailsFlyoutLocator, AssetDetailsFlyoutLocatorDefinition, -} from './locators/infra/asset_details_flyout_locator'; -import { - type AssetDetailsLocator, AssetDetailsLocatorDefinition, -} from './locators/infra/asset_details_locator'; -import { type HostsLocator, HostsLocatorDefinition } from './locators/infra/hosts_locator'; -import { - type InventoryLocator, + HostsLocatorDefinition, InventoryLocatorDefinition, -} from './locators/infra/inventory_locator'; -import { - type FlamegraphLocator, FlamegraphLocatorDefinition, -} from './locators/profiling/flamegraph_locator'; -import { - type StacktracesLocator, StacktracesLocatorDefinition, -} from './locators/profiling/stacktraces_locator'; -import { - type TopNFunctionsLocator, TopNFunctionsLocatorDefinition, -} from './locators/profiling/topn_functions_locator'; -import { - type ServiceOverviewLocator, ServiceOverviewLocatorDefinition, -} from './locators/apm/service_overview_locator'; -import { updateGlobalNavigation } from './services/update_global_navigation'; -import { - type TransactionDetailsByNameLocator, TransactionDetailsByNameLocatorDefinition, -} from './locators/apm/transaction_details_by_name_locator'; + type AssetDetailsFlyoutLocator, + type AssetDetailsLocator, + type InventoryLocator, + type HostsLocator, + type FlamegraphLocator, + type StacktracesLocator, + type TopNFunctionsLocator, + type ServiceOverviewLocator, + type TransactionDetailsByNameLocator, +} from '../common'; +import { updateGlobalNavigation } from './services/update_global_navigation'; export interface ObservabilitySharedSetup { share: SharePluginSetup; } diff --git a/x-pack/plugins/osquery/cypress/tasks/login.ts b/x-pack/plugins/osquery/cypress/tasks/login.ts index 38d71318d01f9..9dad4966b0fc5 100644 --- a/x-pack/plugins/osquery/cypress/tasks/login.ts +++ b/x-pack/plugins/osquery/cypress/tasks/login.ts @@ -15,6 +15,7 @@ export const initializeDataViews = () => { onBeforeLoad: (win) => disableNewFeaturesTours(win), }); cy.getBySel('globalLoadingIndicator').should('exist'); - cy.getBySel('globalLoadingIndicator').should('not.exist'); + // In serverless the app sometimes takes a long time to load with this check causing flakiness. + cy.getBySel('globalLoadingIndicator', { timeout: 1.5 * 60 * 1000 }).should('not.exist'); cy.getBySel('manage-alert-detection-rules').should('exist'); }; diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_outcome.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_outcome.ts index d5d656f3bb385..87ec80d1ac292 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_outcome.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff_outcome.ts @@ -83,9 +83,9 @@ export const determineOrderAgnosticDiffOutcome = ( * NOTE: uses order agnostic comparison for nested array fields (e.g. `index`) */ export const determineDiffOutcomeForDataSource = ( - baseVersion: RuleDataSource | MissingVersion, - currentVersion: RuleDataSource, - targetVersion: RuleDataSource + baseVersion: RuleDataSource | undefined | MissingVersion, + currentVersion: RuleDataSource | undefined, + targetVersion: RuleDataSource | undefined ): ThreeWayDiffOutcome => { const isBaseVersionMissing = baseVersion === MissingVersion; @@ -151,7 +151,7 @@ export const determineIfValueCanUpdate = (diffCase: ThreeWayDiffOutcome): boolea ); }; -const isIndexPatternDataSourceType = ( - version: RuleDataSource +export const isIndexPatternDataSourceType = ( + version: RuleDataSource | undefined ): version is Extract => - version.type === DataSourceType.index_patterns; + version !== undefined && version.type === DataSourceType.index_patterns; diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index cc38eefffe5f2..2e8035cef2e0c 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -42,16 +42,6 @@ export const allowedExperimentalValues = Object.freeze({ */ socTrendsEnabled: false, - /** - * Enables the automated response actions in rule + alerts - */ - responseActionsEnabled: true, - - /** - * Enables the automated endpoint response action in rule + alerts - */ - endpointResponseActionsEnabled: true, - /** * Enables the `upload` endpoint response action (v8.9) */ @@ -96,7 +86,7 @@ export const allowedExperimentalValues = Object.freeze({ /** * Enables scan response action on Endpoint */ - responseActionScanEnabled: false, + responseActionScanEnabled: true, /** * Enables new notes @@ -232,7 +222,7 @@ export const allowedExperimentalValues = Object.freeze({ /** * Adds a new option to filter descendants of a process for Management / Event Filters */ - filterProcessDescendantsForEventFiltersEnabled: false, + filterProcessDescendantsForEventFiltersEnabled: true, /** * Enables the new data ingestion hub diff --git a/x-pack/plugins/security_solution/docs/testing/test_plans/detection_response/prebuilt_rules/upgrade_review_algorithms.md b/x-pack/plugins/security_solution/docs/testing/test_plans/detection_response/prebuilt_rules/upgrade_review_algorithms.md index e73b976d0b44e..26b01da200903 100644 --- a/x-pack/plugins/security_solution/docs/testing/test_plans/detection_response/prebuilt_rules/upgrade_review_algorithms.md +++ b/x-pack/plugins/security_solution/docs/testing/test_plans/detection_response/prebuilt_rules/upgrade_review_algorithms.md @@ -24,14 +24,18 @@ Status: `in progress`. - [**Scenario: `ABB` - Rule field is any type**](#scenario-abb---rule-field-is-any-type) - [Rule field has an update and a custom value that are NOT the same - `ABC`](#rule-field-has-an-update-and-a-custom-value-that-are-not-the-same---abc) - [**Scenario: `ABC` - Rule field is a number or single line string**](#scenario-abc---rule-field-is-a-number-or-single-line-string) - - [**Scenario: `ABC` - Rule field is a mergable multi line string**](#scenario-abc---rule-field-is-a-mergable-multi-line-string) - - [**Scenario: `ABC` - Rule field is a non-mergable multi line string**](#scenario-abc---rule-field-is-a-non-mergable-multi-line-string) + - [**Scenario: `ABC` - Rule field is a mergeable multi line string**](#scenario-abc---rule-field-is-a-mergeable-multi-line-string) + - [**Scenario: `ABC` - Rule field is a non-mergeable multi line string**](#scenario-abc---rule-field-is-a-non-mergeable-multi-line-string) - [**Scenario: `ABC` - Rule field is an array of scalar values**](#scenario-abc---rule-field-is-an-array-of-scalar-values) + - [**Scenario: `ABC` - Rule field is a solvable `data_source` object**](#scenario-abc---rule-field-is-a-solvable-data_source-object) + - [**Scenario: `ABC` - Rule field is a non-solvable `data_source` object**](#scenario-abc---rule-field-is-a-non-solvable-data_source-object) - [Rule field has an update and a custom value that are the same and the rule base version doesn't exist - `-AA`](#rule-field-has-an-update-and-a-custom-value-that-are-the-same-and-the-rule-base-version-doesnt-exist----aa) - [**Scenario: `-AA` - Rule field is any type**](#scenario--aa---rule-field-is-any-type) - - [Rule field has an update and a custom value that are NOT the same and the rule base version doesn't exist - `-BC`](#rule-field-has-an-update-and-a-custom-value-that-are-not-the-same-and-the-rule-base-version-doesnt-exist----bc) - - [**Scenario: `-BC` - Rule field is a number or single line string**](#scenario--bc---rule-field-is-a-number-or-single-line-string) - - [**Scenario: `-BC` - Rule field is an array of scalar values**](#scenario--bc---rule-field-is-an-array-of-scalar-values) + - [Rule field has an update and a custom value that are NOT the same and the rule base version doesn't exist - `-AB`](#rule-field-has-an-update-and-a-custom-value-that-are-not-the-same-and-the-rule-base-version-doesnt-exist----ab) + - [**Scenario: `-AB` - Rule field is a number or single line string**](#scenario--ab---rule-field-is-a-number-or-single-line-string) + - [**Scenario: `-AB` - Rule field is an array of scalar values**](#scenario--ab---rule-field-is-an-array-of-scalar-values) + - [**Scenario: `-AB` - Rule field is a solvable `data_source` object**](#scenario--ab---rule-field-is-a-solvable-data_source-object) + - [**Scenario: `-AB` - Rule field is a non-solvable `data_source` object**](#scenario--ab---rule-field-is-a-non-solvable-data_source-object) ## Useful information @@ -52,6 +56,9 @@ Status: `in progress`. - **Merged version**: Also labeled as `merged_version`. This is the version of the rule that we determine via the various algorithms. It could contain a mix of all the rule versions on a per-field basis to create a singluar version of the rule containing all relevant updates and user changes to display to the user. +- **Grouped fields** + - `data_source`: an object that contains a `type` field with a value of `data_view_id` or `index_patterns` and another field that's either `data_view_id` of type string OR `index_patterns` of type string array + ### Assumptions - All scenarios will contain at least 1 prebuilt rule installed in Kibana. @@ -63,7 +70,7 @@ Status: `in progress`. #### **Scenario: `AAA` - Rule field is any type** -**Automation**: 4 integration tests with mock rules + a set of unit tests for each algorithm +**Automation**: 6 integration tests with mock rules + a set of unit tests for each algorithm ```Gherkin Given field is not customized by the user (current version == base version) @@ -73,18 +80,20 @@ And field should not be returned from the `upgrade/_review` API end And field should not be shown in the upgrade preview UI Examples: -| algorithm | field_name | base_version | current_version | target_version | merged_version | -| single line string | name | "A" | "A" | "A" | "A" | -| multi line string | description | "My description.\nThis is a second line." | "My description.\nThis is a second line." | "My description.\nThis is a second line." | "My description.\nThis is a second line." | -| number | risk_score | 1 | 1 | 1 | 1 | -| array of scalars | tags | ["one", "two", "three"] | ["one", "three", "two"] | ["three", "one", "two"] | ["one", "three", "two"] | +| algorithm | field_name | base_version | current_version | target_version | merged_version | +| single line string | name | "A" | "A" | "A" | "A" | +| multi line string | description | "My description.\nThis is a second line." | "My description.\nThis is a second line." | "My description.\nThis is a second line." | "My description.\nThis is a second line." | +| number | risk_score | 1 | 1 | 1 | 1 | +| array of scalars | tags | ["one", "two", "three"] | ["one", "three", "two"] | ["three", "one", "two"] | ["one", "three", "two"] | +| data_source | data_source | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | +| data_source | data_source | {type: "data_view", "data_view_id": "A"} | {type: "data_view", "data_view_id": "A"} | {type: "data_view", "data_view_id": "A"} | {type: "data_view", "data_view_id": "A"} | ``` ### Rule field doesn't have an update but has a custom value - `ABA` #### **Scenario: `ABA` - Rule field is any type** -**Automation**: 3 integration tests with mock rules + a set of unit tests for each algorithm +**Automation**: 6 integration tests with mock rules + a set of unit tests for each algorithm ```Gherkin Given field is customized by the user (current version != base version) @@ -94,18 +103,20 @@ And field should be returned from the `upgrade/_review` API endpoin And field should be shown in the upgrade preview UI Examples: -| algorithm | field_name | base_version | current_version | target_version | merged_version | -| single line string | name | "A" | "B" | "A" | "B" | -| multi line string | description | "My description.\nThis is a second line." | "My GREAT description.\nThis is a second line." | "My description.\nThis is a second line." | "My GREAT description.\nThis is a second line." | -| number | risk_score | 1 | 2 | 1 | 2 | -| array of scalars | tags | ["one", "two", "three"] | ["one", "two", "four"] | ["one", "two", "three"] | ["one", "two", "four"] | +| algorithm | field_name | base_version | current_version | target_version | merged_version | +| single line string | name | "A" | "B" | "A" | "B" | +| multi line string | description | "My description.\nThis is a second line." | "My GREAT description.\nThis is a second line." | "My description.\nThis is a second line." | "My GREAT description.\nThis is a second line." | +| number | risk_score | 1 | 2 | 1 | 2 | +| array of scalars | tags | ["one", "two", "three"] | ["one", "two", "four"] | ["one", "two", "three"] | ["one", "two", "four"] | +| data_source | data_source | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "data_view", "data_view_id": "A"} | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "data_view", "data_view_id": "A"} | +| data_source | data_source | {type: "data_view", "data_view_id": "A"} | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "data_view", "data_view_id": "A"} | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | ``` ### Rule field has an update and doesn't have a custom value - `AAB` #### **Scenario: `AAB` - Rule field is any type** -**Automation**: 3 integration tests with mock rules + a set of unit tests for each algorithm +**Automation**: 6 integration tests with mock rules + a set of unit tests for each algorithm ```Gherkin Given field is not customized by the user (current version == base version) @@ -115,18 +126,20 @@ And field should be returned from the `upgrade/_review` API endpoin And field should be shown in the upgrade preview UI Examples: -| algorithm | field_name | base_version | current_version | target_version | merged_version | -| single line string | name | "A" | "A" | "B" | "B" | -| multi line string | description | "My description.\nThis is a second line." | "My description.\nThis is a second line." | "My GREAT description.\nThis is a second line." | "My GREAT description.\nThis is a second line." | -| number | risk_score | 1 | 1 | 2 | 2 | -| array of scalars | tags | ["one", "two", "three"] | ["one", "two", "three"] | ["one", "two", "four"] | ["one", "two", "four"] | +| algorithm | field_name | base_version | current_version | target_version | merged_version | +| single line string | name | "A" | "A" | "B" | "B" | +| multi line string | description | "My description.\nThis is a second line." | "My description.\nThis is a second line." | "My GREAT description.\nThis is a second line." | "My GREAT description.\nThis is a second line." | +| number | risk_score | 1 | 1 | 2 | 2 | +| array of scalars | tags | ["one", "two", "three"] | ["one", "two", "three"] | ["one", "two", "four"] | ["one", "two", "four"] | +| data_source | data_source | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "data_view", "data_view_id": "A"} | {type: "data_view", "data_view_id": "A"} | +| data_source | data_source | {type: "data_view", "data_view_id": "A"} | {type: "data_view", "data_view_id": "A"} | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | ``` ### Rule field has an update and a custom value that are the same - `ABB` #### **Scenario: `ABB` - Rule field is any type** -**Automation**: 3 integration tests with mock rules + a set of unit tests for each algorithm +**Automation**: 6 integration tests with mock rules + a set of unit tests for each algorithm ```Gherkin Given field is customized by the user (current version != base version) @@ -137,11 +150,13 @@ And field should be returned from the `upgrade/_review` API endpoin And field should be shown in the upgrade preview UI Examples: -| algorithm | field_name | base_version | current_version | target_version | merged_version | -| single line string | name | "A" | "B" | "B" | "B" | -| multi line string | description | "My description.\nThis is a second line." | "My GREAT description.\nThis is a second line." | "My GREAT description.\nThis is a second line." | "My GREAT description.\nThis is a second line." | -| number | risk_score | 1 | 2 | 2 | 2 | -| array of scalars | tags | ["one", "two", "three"] | ["one", "two", "four"] | ["one", "two", "four"] | ["one", "two", "four"] | +| algorithm | field_name | base_version | current_version | target_version | merged_version | +| single line string | name | "A" | "B" | "B" | "B" | +| multi line string | description | "My description.\nThis is a second line." | "My GREAT description.\nThis is a second line." | "My GREAT description.\nThis is a second line." | "My GREAT description.\nThis is a second line." | +| number | risk_score | 1 | 2 | 2 | 2 | +| array of scalars | tags | ["one", "two", "three"] | ["one", "two", "four"] | ["one", "two", "four"] | ["one", "two", "four"] | +| data_source | data_source | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "data_view", "data_view_id": "A"} | {type: "data_view", "data_view_id": "A"} | {type: "data_view", "data_view_id": "A"} | +| data_source | data_source | {type: "data_view", "data_view_id": "A"} | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | ``` ### Rule field has an update and a custom value that are NOT the same - `ABC` @@ -164,7 +179,7 @@ Examples: | number | risk_score | 1 | 2 | 3 | 2 | ``` -#### **Scenario: `ABC` - Rule field is a mergable multi line string** +#### **Scenario: `ABC` - Rule field is a mergeable multi line string** **Automation**: 2 integration tests with mock rules + a set of unit tests for the algorithms @@ -172,7 +187,7 @@ Examples: Given field is customized by the user (current version != base version) And field is updated by Elastic in this upgrade (target version != base version) And customized field is different than the Elastic update in this upgrade (current version != target version) -And the 3-way diff of fields are determined to be mergable +And the 3-way diff of fields are determined to be mergeable Then for field the diff algorithm should output a merged version as the merged one with a solvable conflict And field should be returned from the `upgrade/_review` API endpoint And field should be shown in the upgrade preview UI @@ -182,7 +197,7 @@ Examples: | multi line string | description | "My description.\nThis is a second line." | "My GREAT description.\nThis is a second line." | "My description.\nThis is a second line, now longer." | "My GREAT description.\nThis is a second line, now longer." | ``` -#### **Scenario: `ABC` - Rule field is a non-mergable multi line string** +#### **Scenario: `ABC` - Rule field is a non-mergeable multi line string** **Automation**: 2 integration tests with mock rules + a set of unit tests for the algorithms @@ -190,7 +205,7 @@ Examples: Given field is customized by the user (current version != base version) And field is updated by Elastic in this upgrade (target version != base version) And customized field is different than the Elastic update in this upgrade (current version != target version) -And the 3-way diff of fields are determined to be unmergable +And the 3-way diff of fields are determined to be unmergeable Then for field the diff algorithm should output the current version as the merged one with a non-solvable conflict And field should be returned from the `upgrade/_review` API endpoint And field should be shown in the upgrade preview UI @@ -225,11 +240,55 @@ Examples: | array of scalars | index | ["logs-*"] | ["logs-*", "Logs-*"] | ["logs-*", "new-*"] | ["logs-*", "Logs-*", "new-*"] | ``` +#### **Scenario: `ABC` - Rule field is a solvable `data_source` object** + +**Automation**: 2 integration tests with mock rules + a set of unit tests for the algorithm + +```Gherkin +Given data_source field is customized by the user (current version != base version) +And data_source field is updated by Elastic in this upgrade (target version != base version) +And customized data_source field is different than the Elastic update in this upgrade (current version != target version) +And both current version and target version are of type "index_patterns" in data_source +Then for data_source field the diff algorithm should output a custom merged version with a solvable conflict +And arrays should be deduplicated before comparison +And arrays should be compared sensitive of case +And arrays should be compared agnostic of order +And data_source field should be returned from the `upgrade/_review` API endpoint +And data_source field should be shown in the upgrade preview UI + +Examples: +| algorithm | base_version | current_version | target_version | merged_version | +| data_source | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "index_patterns", "index_patterns": ["two", "one", "four"]} | {type: "index_patterns", "index_patterns": ["one", "two", "five"]} | {type: "index_patterns", "index_patterns": ["one", "two", "four", "five"]} | +| data_source | {type: "data_view", "data_view_id": "A"} | {type: "index_patterns", "index_patterns": ["one", "one", "two", "three"]} | {type: "index_patterns", "index_patterns": ["one", "two", "five"]} | {type: "index_patterns", "index_patterns": ["one", "two", "three", "five"]} | +``` + +#### **Scenario: `ABC` - Rule field is a non-solvable `data_source` object** + +**Automation**: 6 integration tests with mock rules + a set of unit tests for the algorithm + +```Gherkin +Given data_source field is customized by the user (current version != base version) +And data_source field is updated by Elastic in this upgrade (target version != base version) +And customized data_source field is different than the Elastic update in this upgrade (current version != target version) +Then for data_source field the diff algorithm should output the current version as the merged version with a non-solvable conflict +And data_source field should be returned from the `upgrade/_review` API endpoint +And data_source field should be shown in the upgrade preview UI + +Examples: +| algorithm | base_version | current_version | target_version | merged_version | +| data_source | {type: "data_view", "data_view_id": "A"} | {type: "data_view", "data_view_id": "B"} | {type: "data_view", "data_view_id": "C"} | {type: "data_view", "data_view_id": "B"} | +| data_source | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "data_view", "data_view_id": "A"} | {type: "data_view", "data_view_id": "B"} | {type: "data_view", "data_view_id": "A"} | +| data_source | {type: "data_view", "data_view_id": "A"} | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "data_view", "data_view_id": "B"} | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | +| data_source | {type: "data_view", "data_view_id": "A"} | {type: "data_view", "data_view_id": "B"} | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "data_view", "data_view_id": "B"} | +| data_source | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "index_patterns", "index_patterns": ["one", "two", "four"]} | {type: "data_view", "data_view_id": "C"} | {type: "index_patterns", "index_patterns": ["one", "two", "four"]} | +| data_source | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "data_view", "data_view_id": "A"} | {type: "index_patterns", "index_patterns": ["one", "two", "five"]} | {type: "data_view", "data_view_id": "A"} | +``` + ### Rule field has an update and a custom value that are the same and the rule base version doesn't exist - `-AA` #### **Scenario: `-AA` - Rule field is any type** -**Automation**: 3 integration tests with mock rules + a set of unit tests for each algorithm +**Automation**: 5 integration tests with mock rules + a set of unit tests for each algorithm ```Gherkin Given at least 1 installed prebuilt rule has a new version available @@ -240,18 +299,20 @@ And field should not be returned from the `upgrade/_review` API end And field should not be shown in the upgrade preview UI Examples: -| algorithm | field_name | base_version | current_version | target_version | merged_version | -| single line string | name | N/A | "A" | "A" | "A" | -| multi line string | description | N/A | "My description.\nThis is a second line." | "My description.\nThis is a second line." | "My description.\nThis is a second line." | -| number | risk_score | N/A | 1 | 1 | 1 | -| array of scalars | tags | N/A | ["one", "three", "two"] | ["three", "one", "two"] | ["one", "three", "two"] | +| algorithm | field_name | base_version | current_version | target_version | merged_version | +| single line string | name | N/A | "A" | "A" | "A" | +| multi line string | description | N/A | "My description.\nThis is a second line." | "My description.\nThis is a second line." | "My description.\nThis is a second line." | +| number | risk_score | N/A | 1 | 1 | 1 | +| array of scalars | tags | N/A | ["one", "three", "two"] | ["three", "one", "two"] | ["one", "three", "two"] | +| data_source | data_source | N/A | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | +| data_source | data_source | N/A | {type: "data_view", "data_view_id": "A"} | {type: "data_view", "data_view_id": "A"} | {type: "data_view", "data_view_id": "A"} | ``` -### Rule field has an update and a custom value that are NOT the same and the rule base version doesn't exist - `-BC` +### Rule field has an update and a custom value that are NOT the same and the rule base version doesn't exist - `-AB` -#### **Scenario: `-BC` - Rule field is a number or single line string** +#### **Scenario: `-AB` - Rule field is a number or single line string** -**Automation**: 2 integration tests with mock rules + a set of unit tests for the algorithms +**Automation**: 4 integration tests with mock rules + a set of unit tests for the algorithms ```Gherkin Given at least 1 installed prebuilt rule has a new version available @@ -266,15 +327,16 @@ Examples: | single line string | name | N/A | "B" | "C" | "C" | | multi line string | description | N/A | "My description.\nThis is a second line." | "My GREAT description.\nThis is a second line." | "My GREAT description.\nThis is a second line." | | number | risk_score | N/A | 2 | 3 | 3 | +| data_source | data_source | N/A | {type: "data_view", "data_view_id": "A"} | {type: "data_view", "data_view_id": "B"} | {type: "data_view", "data_view_id": "B"} | ``` -#### **Scenario: `-BC` - Rule field is an array of scalar values** +#### **Scenario: `-AB` - Rule field is an array of scalar values** **Automation**: 1 integration test with mock rules + a set of unit tests for the algorithm ```Gherkin -Given field is customized by the user (current version != base version) -And field is updated by Elastic in this upgrade (target version != base version) +Given at least 1 installed prebuilt rule has a new version available +And the base version of the rule cannot be determined And customized field is different than the Elastic update in this upgrade (current version != target version) Then for field the diff algorithm should output a custom merged version with a solvable conflict And arrays should be deduplicated before comparison @@ -288,3 +350,43 @@ Examples: | algorithm | field_name | base_version | current_version | target_version | merged_version | | array of scalars | tags | N/A | ["one", "two", "four"] | ["one", "two", "five"] | ["one", "two", "four", "five"] | ``` + +#### **Scenario: `-AB` - Rule field is a solvable `data_source` object** + +**Automation**: 1 integration test with mock rules + a set of unit tests for the algorithm + +```Gherkin +Given at least 1 installed prebuilt rule has a new version available +And the base version of the rule cannot be determined +And customized data_source field is different than the Elastic update in this upgrade (current version != target version) +And current version and target version are both array fields in data_source +Then for data_source field the diff algorithm should output a custom merged version with a solvable conflict +And arrays should be deduplicated before comparison +And arrays should be compared sensitive of case +And arrays should be compared agnostic of order +And data_source field should be returned from the `upgrade/_review` API endpoint +And data_source field should be shown in the upgrade preview UI + +Examples: +| algorithm | base_version | current_version | target_version | merged_version | +| data_source | N/A | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "index_patterns", "index_patterns": ["one", "two", "four"]} | {type: "index_patterns", "index_patterns": ["one", "two", "three", "four"]} | + +``` + +#### **Scenario: `-AB` - Rule field is a non-solvable `data_source` object** + +**Automation**: 1 integration test with mock rules + a set of unit tests for the algorithm + +```Gherkin +Given at least 1 installed prebuilt rule has a new version available +And the base version of the rule cannot be determined +And customized data_source field is different than the Elastic update in this upgrade (current version != target version) +And current version and target version are not both array fields in data_source +Then for data_source field the diff algorithm should output the target version as the merged version with a solvable conflict +And data_source field should be returned from the `upgrade/_review` API endpoint +And data_source field should be shown in the upgrade preview UI + +Examples: +| algorithm | base_version | current_version | target_version | merged_version | +| data_source | N/A | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "data_view", "data_view_id": "A"} | {type: "data_view", "data_view_id": "A"} | +``` diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/osquery_tab.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/osquery_tab.tsx deleted file mode 100644 index be2bcddfca3e6..0000000000000 --- a/x-pack/plugins/security_solution/public/common/components/event_details/osquery_tab.tsx +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { EuiTabbedContentTab } from '@elastic/eui'; -import { EuiNotificationBadge, EuiSpacer } from '@elastic/eui'; -import React from 'react'; -import styled from 'styled-components'; -import type { Ecs } from '@kbn/cases-plugin/common'; -import type { SearchHit } from '../../../../common/search_strategy'; -import type { - ExpandedEventFieldsObject, - RawEventData, -} from '../../../../common/types/response_actions'; -import { expandDottedObject } from '../../../../common/utils/expand_dotted'; -import { useIsExperimentalFeatureEnabled } from '../../hooks/use_experimental_features'; -import { useKibana } from '../../lib/kibana'; -import { EventsViewType } from './event_details'; -import * as i18n from './translations'; -import { ResponseActionTypesEnum } from '../../../../common/api/detection_engine/model/rule_response_actions'; - -const TabContentWrapper = styled.div` - height: 100%; - position: relative; -`; - -// TODO: MOVE TO FLYOUT FOLDER - https://github.com/elastic/security-team/issues/7462 -export const useOsqueryTab = ({ - rawEventData, - ecsData, -}: { - rawEventData?: SearchHit | undefined; - ecsData?: Ecs | null; -}): EuiTabbedContentTab | undefined => { - const { - services: { osquery }, - } = useKibana(); - const responseActionsEnabled = useIsExperimentalFeatureEnabled('responseActionsEnabled'); - const endpointResponseActionsEnabled = useIsExperimentalFeatureEnabled( - 'endpointResponseActionsEnabled' - ); - - const expandedEventFieldsObject = rawEventData - ? (expandDottedObject((rawEventData as RawEventData).fields) as ExpandedEventFieldsObject) - : undefined; - - const responseActions = - expandedEventFieldsObject?.kibana?.alert?.rule?.parameters?.[0].response_actions; - - const shouldEarlyReturn = - !rawEventData || - !responseActionsEnabled || - endpointResponseActionsEnabled || - !ecsData || - !responseActions?.length; - - const alertId = rawEventData?._id ?? ''; - - const { OsqueryResults, fetchAllLiveQueries } = osquery; - - const { data: actionsData } = fetchAllLiveQueries({ - kuery: `alert_ids: ( ${alertId} )`, - alertId, - skip: shouldEarlyReturn, - }); - - if (shouldEarlyReturn) { - return; - } - - const osqueryResponseActions = responseActions.filter( - (responseAction) => responseAction.action_type_id === ResponseActionTypesEnum['.osquery'] - ); - - if (!osqueryResponseActions?.length) { - return; - } - - const actionItems = actionsData?.data.items || []; - - const ruleName = expandedEventFieldsObject?.kibana?.alert?.rule?.name?.[0]; - - const content = ( - - - - - ); - - return { - id: EventsViewType.osqueryView, - 'data-test-subj': 'osqueryViewTab', - name: i18n.OSQUERY_VIEW, - append: ( - - {actionItems.length} - - ), - content, - }; -}; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/response_actions_view.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/response_actions_view.tsx index 4f6bbac5df419..33760b7ab4242 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/response_actions_view.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/response_actions_view.tsx @@ -23,8 +23,6 @@ import { useGetAutomatedActionList } from '../../../management/hooks/response_ac import { EventsViewType } from './event_details'; import * as i18n from './translations'; -import { useIsExperimentalFeatureEnabled } from '../../hooks/use_experimental_features'; - const TabContentWrapper = styled.div` height: 100%; position: relative; @@ -75,14 +73,13 @@ export const useResponseActionsView = ({ }), [] ); - const responseActionsEnabled = useIsExperimentalFeatureEnabled('endpointResponseActionsEnabled'); const expandedEventFieldsObject = rawEventData ? (expandDottedObject((rawEventData as RawEventData).fields) as ExpandedEventFieldsObject) : undefined; const responseActions = expandedEventFieldsObject?.kibana?.alert?.rule?.parameters?.[0].response_actions; - const shouldEarlyReturn = !rawEventData || !responseActionsEnabled; + const shouldEarlyReturn = !rawEventData; const alertId = rawEventData?._id ?? ''; const [isLive, setIsLive] = useState(false); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/step_rule_actions/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/step_rule_actions/index.tsx index ebf6b1bf0930c..b555054a75e0c 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/step_rule_actions/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/step_rule_actions/index.tsx @@ -18,7 +18,6 @@ import { UseArray } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; import type { Type } from '@kbn/securitysolution-io-ts-alerting-types'; import type { RuleObjectId } from '../../../../../common/api/detection_engine/model/rule_schema'; import { isQueryRule } from '../../../../../common/detection_engine/utils'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { ResponseActionsForm } from '../../../rule_response_actions/response_actions_form'; import type { RuleStepProps, @@ -85,8 +84,6 @@ const StepRuleActionsComponent: FC = ({ const { services: { application }, } = useKibana(); - const responseActionsEnabled = useIsExperimentalFeatureEnabled('responseActionsEnabled'); - const displayActionsOptions = useMemo( () => ( <> @@ -120,7 +117,7 @@ const StepRuleActionsComponent: FC = ({ {ruleId && } {displayActionsOptions} - {responseActionsEnabled && displayResponseActionsOptions} + {displayResponseActionsOptions} @@ -134,7 +131,6 @@ const StepRuleActionsComponent: FC = ({ application.capabilities.actions.show, displayActionsOptions, displayResponseActionsOptions, - responseActionsEnabled, ]); return ( diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_response_actions/get_supported_response_actions.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_response_actions/get_supported_response_actions.ts index 51b599028156d..95fc300a3fe57 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_response_actions/get_supported_response_actions.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_response_actions/get_supported_response_actions.ts @@ -24,12 +24,10 @@ interface EnabledFeatures { export const getSupportedResponseActions = ( actionTypes: ResponseActionType[], - enabledFeatures: EnabledFeatures, userPermissions: EnabledFeatures ): ResponseActionType[] => actionTypes.reduce((acc: ResponseActionType[], actionType) => { const isEndpointAction = actionType.id === ResponseActionTypesEnum['.endpoint']; - if (!enabledFeatures.endpoint && isEndpointAction) return acc; if (ResponseActionTypes.options.includes(actionType.id)) return [ ...acc, diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_response_actions/use_supported_response_action_types.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_response_actions/use_supported_response_action_types.tsx index aed3d0302f05c..5d6f7a01bf076 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_response_actions/use_supported_response_action_types.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_response_actions/use_supported_response_action_types.tsx @@ -7,7 +7,6 @@ import { useEffect, useMemo, useState } from 'react'; import { useUserPrivileges } from '../../common/components/user_privileges'; -import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features'; import type { ResponseActionType } from './get_supported_response_actions'; import { getSupportedResponseActions, responseActionTypes } from './get_supported_response_actions'; @@ -16,15 +15,8 @@ export const useSupportedResponseActionTypes = () => { ResponseActionType[] | undefined >(); - const isEndpointEnabled = useIsExperimentalFeatureEnabled('endpointResponseActionsEnabled'); const { canIsolateHost, canKillProcess, canSuspendProcess } = useUserPrivileges().endpointPrivileges; - const enabledFeatures = useMemo( - () => ({ - endpoint: isEndpointEnabled, - }), - [isEndpointEnabled] - ); const userHasPermissionsToExecute = useMemo( () => ({ @@ -36,11 +28,10 @@ export const useSupportedResponseActionTypes = () => { useEffect(() => { const supportedTypes = getSupportedResponseActions( responseActionTypes, - enabledFeatures, userHasPermissionsToExecute ); setSupportedResponseActionTypes(supportedTypes); - }, [isEndpointEnabled, enabledFeatures, userHasPermissionsToExecute]); + }, [userHasPermissionsToExecute]); return supportedResponseActionTypes; }; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/response_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/response_details.test.tsx index e8be41c601844..9b11ccbb516ba 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/response_details.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/response_details.test.tsx @@ -12,7 +12,6 @@ import { DocumentDetailsContext } from '../../shared/context'; import { rawEventData, TestProviders } from '../../../../common/mock'; import { RESPONSE_DETAILS_TEST_ID } from './test_ids'; import { ResponseDetails } from './response_details'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; jest.mock('../../../../common/hooks/use_experimental_features'); jest.mock('../../../../common/lib/kibana', () => { @@ -98,19 +97,6 @@ const renderResponseDetails = (contextValue: DocumentDetailsContext) => ); describe('', () => { - let featureFlags: { endpointResponseActionsEnabled: boolean; responseActionsEnabled: boolean }; - - beforeEach(() => { - featureFlags = { endpointResponseActionsEnabled: true, responseActionsEnabled: true }; - - const useIsExperimentalFeatureEnabledMock = (feature: keyof typeof featureFlags) => - featureFlags[feature]; - - (useIsExperimentalFeatureEnabled as jest.Mock).mockImplementation( - useIsExperimentalFeatureEnabledMock - ); - }); - it('should render the view with response actions', () => { const wrapper = renderResponseDetails(contextWithResponseActions); @@ -120,17 +106,6 @@ describe('', () => { // TODO mock osquery results }); - it('should render the view with osquery only', () => { - featureFlags.responseActionsEnabled = true; - featureFlags.endpointResponseActionsEnabled = false; - - const wrapper = renderResponseDetails(contextWithResponseActions); - - expect(wrapper.getByTestId(RESPONSE_DETAILS_TEST_ID)).toBeInTheDocument(); - expect(wrapper.queryByTestId('responseActionsViewWrapper')).not.toBeInTheDocument(); - expect(wrapper.getByTestId('osqueryViewWrapper')).toBeInTheDocument(); - }); - it('should render the empty information', () => { const wrapper = renderResponseDetails(defaultContextValue); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/response_details.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/response_details.tsx index c240799639166..5081bdad9c17f 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/response_details.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/response_details.tsx @@ -11,8 +11,6 @@ import styled from 'styled-components'; import { FormattedMessage } from '@kbn/i18n-react'; import { RESPONSE_DETAILS_TEST_ID } from './test_ids'; import { useDocumentDetailsContext } from '../../shared/context'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; -import { useOsqueryTab } from '../../../../common/components/event_details/osquery_tab'; import { useResponseActionsView } from '../../../../common/components/event_details/response_actions_view'; const ExtendedFlyoutWrapper = styled.div` @@ -25,18 +23,11 @@ const ExtendedFlyoutWrapper = styled.div` */ export const ResponseDetails: React.FC = () => { const { searchHit, dataAsNestedObject, isPreview } = useDocumentDetailsContext(); - const endpointResponseActionsEnabled = useIsExperimentalFeatureEnabled( - 'endpointResponseActionsEnabled' - ); const responseActionsView = useResponseActionsView({ rawEventData: searchHit, ecsData: dataAsNestedObject, }); - const osqueryView = useOsqueryTab({ - rawEventData: searchHit, - ecsData: dataAsNestedObject, - }); return (
@@ -57,9 +48,7 @@ export const ResponseDetails: React.FC = () => { - - {endpointResponseActionsEnabled ? responseActionsView?.content : osqueryView?.content} - + {responseActionsView?.content} )}
diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_filters.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_filters.tsx index f403ba6f6aacd..b950c3f343e18 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_filters.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_filters.tsx @@ -55,9 +55,6 @@ export const ActionsLogFilters = memo( 'data-test-subj'?: string; }) => { const getTestId = useTestIdGenerator(dataTestSubj); - const responseActionsEnabled = useIsExperimentalFeatureEnabled( - 'endpointResponseActionsEnabled' - ); const isSentinelOneV1Enabled = useIsExperimentalFeatureEnabled( 'responseActionsSentinelOneV1Enabled' @@ -86,26 +83,24 @@ export const ActionsLogFilters = memo( onChangeFilterOptions={onChangeStatusesFilter} data-test-subj={dataTestSubj} /> - {isSentinelOneV1Enabled - ? responseActionsEnabled && ( - - ) - : responseActionsEnabled && ( - - )} + {isSentinelOneV1Enabled ? ( + + ) : ( + + )} ); }, [ @@ -116,7 +111,6 @@ export const ActionsLogFilters = memo( dataTestSubj, onChangeCommandsFilter, onChangeStatusesFilter, - responseActionsEnabled, onChangeAgentTypesFilter, onChangeTypeFilter, ]); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_role_rbac.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_role_rbac.cy.ts index 6a3e7d16040c4..f0dc0c1a5891d 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_role_rbac.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_role_rbac.cy.ts @@ -48,6 +48,7 @@ describe('When defining a kibana role for Endpoint security access', { tags: '@e 'Process Operations Perform process-related response actions in the response console.Process Operations sub-feature privilegeAllNone', 'File Operations Perform file-related response actions in the response console.File Operations sub-feature privilegeAllNone', 'Execute Operations Perform script execution response actions in the response console.Execute Operations sub-feature privilegeAllNone', + 'Scan Operations Perform folder scan response actions in the response console.Scan Operations sub-feature privilegeAllNone', ]); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_role_rbac.feature_flag.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_role_rbac.feature_flag.cy.ts deleted file mode 100644 index e7c98df4e735f..0000000000000 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_role_rbac.feature_flag.cy.ts +++ /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 { closeAllToasts } from '../tasks/toasts'; -import { login, ROLE } from '../tasks/login'; -import { loadPage } from '../tasks/common'; - -describe( - 'When defining a kibana role for Endpoint security access', - { - env: { - ftrConfig: { - kbnServerArgs: [ - `--xpack.securitySolution.enableExperimental=${JSON.stringify([ - 'responseActionScanEnabled', - ])}`, - ], - }, - }, - tags: '@ess', - }, - () => { - const getAllSubFeatureRows = (): Cypress.Chainable> => { - return cy - .get('#featurePrivilegeControls_siem') - .findByTestSubj('mutexSubFeaturePrivilegeControl') - .closest('.euiFlexGroup'); - }; - - beforeEach(() => { - login(ROLE.system_indices_superuser); - loadPage('/app/management/security/roles/edit'); - closeAllToasts(); - cy.getByTestSubj('addSpacePrivilegeButton').click(); - cy.getByTestSubj('featureCategoryButton_securitySolution').closest('button').click(); - cy.get('.featurePrivilegeName:contains("Security")').closest('button').click(); - }); - - it('should display RBAC entries with expected controls', () => { - getAllSubFeatureRows() - .then(($subFeatures) => { - const featureRows: string[] = []; - $subFeatures.each((_, $subFeature) => { - featureRows.push($subFeature.textContent ?? ''); - }); - - return featureRows; - }) - .should('deep.equal', [ - 'Endpoint List Displays all hosts running Elastic Defend and their relevant integration details.Endpoint List sub-feature privilegeAllReadNone', - 'Trusted Applications Helps mitigate conflicts with other software, usually other antivirus or endpoint security applications.Trusted Applications sub-feature privilegeAllReadNone', - 'Host Isolation Exceptions Add specific IP addresses that isolated hosts are still allowed to communicate with, even when isolated from the rest of the network.Host Isolation Exceptions sub-feature privilegeAllReadNone', - 'Blocklist Extend Elastic Defend’s protection against malicious processes and protect against potentially harmful applications.Blocklist sub-feature privilegeAllReadNone', - 'Event Filters Filter out endpoint events that you do not need or want stored in Elasticsearch.Event Filters sub-feature privilegeAllReadNone', - 'Elastic Defend Policy Management Access the Elastic Defend integration policy to configure protections, event collection, and advanced policy features.Elastic Defend Policy Management sub-feature privilegeAllReadNone', - 'Response Actions History Access the history of response actions performed on endpoints.Response Actions History sub-feature privilegeAllReadNone', - 'Host Isolation Perform the "isolate" and "release" response actions.Host Isolation sub-feature privilegeAllNone', - 'Process Operations Perform process-related response actions in the response console.Process Operations sub-feature privilegeAllNone', - 'File Operations Perform file-related response actions in the response console.File Operations sub-feature privilegeAllNone', - 'Execute Operations Perform script execution response actions in the response console.Execute Operations sub-feature privilegeAllNone', - 'Scan Operations Perform folder scan response actions in the response console.Scan Operations sub-feature privilegeAllNone', - ]); - }); - } -); diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form.test.tsx b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form.test.tsx index 7dc11f828187a..47aca9f9ab597 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form.test.tsx @@ -550,7 +550,7 @@ describe('Event filter form', () => { it('should not show warning text when unique fields are added', async () => { formProps.item.entries = [ { - field: 'event.category', + field: 'event.action', operator: 'included', type: 'match', value: 'some value', @@ -573,13 +573,13 @@ describe('Event filter form', () => { it('should not show warning text when field values are not added', async () => { formProps.item.entries = [ { - field: 'event.category', + field: 'event.action', operator: 'included', type: 'match', value: '', }, { - field: 'event.category', + field: 'event.action', operator: 'excluded', type: 'match', value: '', @@ -596,13 +596,13 @@ describe('Event filter form', () => { it('should show warning text when duplicate fields are added with values', async () => { formProps.item.entries = [ { - field: 'event.category', + field: 'event.action', operator: 'included', type: 'match', value: 'some value', }, { - field: 'event.category', + field: 'event.action', operator: 'excluded', type: 'match', value: 'some other value', diff --git a/x-pack/plugins/security_solution/scripts/beat_docs/build.js b/x-pack/plugins/security_solution/scripts/beat_docs/build.js index 15c8ce3d642c8..db766e6f738a6 100644 --- a/x-pack/plugins/security_solution/scripts/beat_docs/build.js +++ b/x-pack/plugins/security_solution/scripts/beat_docs/build.js @@ -15,10 +15,6 @@ const yaml = require('js-yaml'); const https = require('https'); // eslint-disable-next-line import/no-extraneous-dependencies const { get, isArray, isEmpty, isNumber, isString, pick } = require('lodash'); -// eslint-disable-next-line import/no-extraneous-dependencies -const Q = require('q'); -// eslint-disable-next-line import/no-extraneous-dependencies -const rimraf = require('rimraf'); const { resolve } = require('path'); // eslint-disable-next-line import/no-extraneous-dependencies const tar = require('tar'); @@ -57,26 +53,31 @@ const beats = [ const download = async (url, filepath) => { const fileStream = fs.createWriteStream(filepath); - const deferred = Q.defer(); + let resolve; + let reject; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); fileStream .on('open', function () { https.get(url, function (res) { res.on('error', function (err) { - deferred.reject(err); + reject(err); }); res.pipe(fileStream); }); }) .on('error', function (err) { - deferred.reject(err); + reject(err); }) .on('finish', function () { - deferred.resolve(filepath); + resolve(filepath); }); - return deferred.promise; + return promise; }; const paramsToPick = ['category', 'description', 'example', 'name', 'type', 'format']; @@ -144,8 +145,8 @@ const manageZipFields = async (beat, filePath, beatFields) => { ); const eBeatFields = convertSchemaToHash(obj, beatFields); console.log('deleting files', beat.index); - rimraf.sync(`${beat.outputDir}/winlogbeat-${BEATS_VERSION}-windows-x86_64`); - rimraf.sync(beat.filePath); + fs.rmSync(`${beat.outputDir}/winlogbeat-${BEATS_VERSION}-windows-x86_64`, { recursive: true }); + fs.rmSync(beat.filePath, { recursive: true }); return eBeatFields; } catch (err) { @@ -176,8 +177,8 @@ const manageTarFields = async (beat, filePath, beatFields) => ); const ebeatFields = convertSchemaToHash(obj, beatFields); console.log('deleting files', beat.index); - rimraf.sync(beat.outputDir); - rimraf.sync(beat.filePath); + fs.rmSync(beat.outputDir, { recursive: true }); + fs.rmSync(beat.filePath, { recursive: true }); resolve(ebeatFields); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/data_source_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/data_source_diff_algorithm.test.ts index 6944cd137448a..6020738bd5e66 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/data_source_diff_algorithm.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/data_source_diff_algorithm.test.ts @@ -21,7 +21,7 @@ import { dataSourceDiffAlgorithm } from './data_source_diff_algorithm'; describe('dataSourceDiffAlgorithm', () => { describe('returns current_version as merged output if there is no update - scenario AAA', () => { it('if all versions are index patterns', () => { - const mockVersions: ThreeVersionsOf = { + const mockVersions: ThreeVersionsOf = { base_version: { type: DataSourceType.index_patterns, index_patterns: ['one', 'two', 'two', 'three'], @@ -49,7 +49,7 @@ describe('dataSourceDiffAlgorithm', () => { }); it('if all versions are data views', () => { - const mockVersions: ThreeVersionsOf = { + const mockVersions: ThreeVersionsOf = { base_version: { type: DataSourceType.data_view, data_view_id: '123' }, current_version: { type: DataSourceType.data_view, data_view_id: '123' }, target_version: { type: DataSourceType.data_view, data_view_id: '123' }, @@ -70,7 +70,7 @@ describe('dataSourceDiffAlgorithm', () => { describe('returns current_version as merged output if current_version is different and there is no update - scenario ABA', () => { it('if current version is different data type than base and target', () => { - const mockVersions: ThreeVersionsOf = { + const mockVersions: ThreeVersionsOf = { base_version: { type: DataSourceType.index_patterns, index_patterns: ['one', 'two', 'three'], @@ -95,7 +95,7 @@ describe('dataSourceDiffAlgorithm', () => { }); it('if all versions are same data type', () => { - const mockVersions: ThreeVersionsOf = { + const mockVersions: ThreeVersionsOf = { base_version: { type: DataSourceType.index_patterns, index_patterns: ['one', 'two', 'three'], @@ -121,11 +121,36 @@ describe('dataSourceDiffAlgorithm', () => { }) ); }); + + it('if current version is undefined', () => { + const mockVersions: ThreeVersionsOf = { + base_version: { + type: DataSourceType.index_patterns, + index_patterns: ['one', 'two', 'three'], + }, + current_version: undefined, + target_version: { + type: DataSourceType.index_patterns, + index_patterns: ['one', 'two', 'three'], + }, + }; + + const result = dataSourceDiffAlgorithm(mockVersions); + + expect(result).toEqual( + expect.objectContaining({ + merged_version: mockVersions.current_version, + diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NONE, + }) + ); + }); }); describe('returns target_version as merged output if current_version is the same and there is an update - scenario AAB', () => { it('if target version is different data type than base and current', () => { - const mockVersions: ThreeVersionsOf = { + const mockVersions: ThreeVersionsOf = { base_version: { type: DataSourceType.data_view, data_view_id: '123' }, current_version: { type: DataSourceType.data_view, data_view_id: '123' }, target_version: { @@ -147,7 +172,7 @@ describe('dataSourceDiffAlgorithm', () => { }); it('if all versions are same data type', () => { - const mockVersions: ThreeVersionsOf = { + const mockVersions: ThreeVersionsOf = { base_version: { type: DataSourceType.data_view, data_view_id: '123' }, current_version: { type: DataSourceType.data_view, data_view_id: '123' }, target_version: { type: DataSourceType.data_view, data_view_id: '456' }, @@ -168,7 +193,7 @@ describe('dataSourceDiffAlgorithm', () => { describe('returns current_version as merged output if current version is different but it matches the update - scenario ABB', () => { it('if all versions are index patterns', () => { - const mockVersions: ThreeVersionsOf = { + const mockVersions: ThreeVersionsOf = { base_version: { type: DataSourceType.index_patterns, index_patterns: ['one', 'two', 'three'], @@ -196,7 +221,7 @@ describe('dataSourceDiffAlgorithm', () => { }); it('if all versions are data views', () => { - const mockVersions: ThreeVersionsOf = { + const mockVersions: ThreeVersionsOf = { base_version: { type: DataSourceType.data_view, data_view_id: '123' }, current_version: { type: DataSourceType.data_view, data_view_id: '456' }, target_version: { type: DataSourceType.data_view, data_view_id: '456' }, @@ -217,7 +242,7 @@ describe('dataSourceDiffAlgorithm', () => { describe('returns current_version as merged output if all three versions are different - scenario ABC', () => { it('if all versions are index patterns', () => { - const mockVersions: ThreeVersionsOf = { + const mockVersions: ThreeVersionsOf = { base_version: { type: DataSourceType.index_patterns, index_patterns: ['one', 'two', 'three'], @@ -250,7 +275,7 @@ describe('dataSourceDiffAlgorithm', () => { }); it('if all versions are data views', () => { - const mockVersions: ThreeVersionsOf = { + const mockVersions: ThreeVersionsOf = { base_version: { type: DataSourceType.data_view, data_view_id: '123' }, current_version: { type: DataSourceType.data_view, data_view_id: '456' }, target_version: { type: DataSourceType.data_view, data_view_id: '789' }, @@ -269,7 +294,7 @@ describe('dataSourceDiffAlgorithm', () => { }); it('if base version is a data view and others are index patterns ', () => { - const mockVersions: ThreeVersionsOf = { + const mockVersions: ThreeVersionsOf = { base_version: { type: DataSourceType.data_view, data_view_id: '123' }, current_version: { type: DataSourceType.index_patterns, @@ -299,7 +324,7 @@ describe('dataSourceDiffAlgorithm', () => { }); it('if base version is a index patterns and other are data views', () => { - const mockVersions: ThreeVersionsOf = { + const mockVersions: ThreeVersionsOf = { base_version: { type: DataSourceType.index_patterns, index_patterns: ['one', 'three', 'four'], @@ -326,7 +351,7 @@ describe('dataSourceDiffAlgorithm', () => { }); it('if currrent version is a different data type', () => { - const mockVersions: ThreeVersionsOf = { + const mockVersions: ThreeVersionsOf = { base_version: { type: DataSourceType.data_view, data_view_id: '123' }, current_version: { type: DataSourceType.index_patterns, @@ -348,7 +373,7 @@ describe('dataSourceDiffAlgorithm', () => { }); it('if target version is a different data type', () => { - const mockVersions: ThreeVersionsOf = { + const mockVersions: ThreeVersionsOf = { base_version: { type: DataSourceType.index_patterns, index_patterns: ['one', 'two', 'three'], @@ -371,16 +396,11 @@ describe('dataSourceDiffAlgorithm', () => { }) ); }); - }); - describe('if base_version is missing', () => { - it('returns current_version as merged output if current_version and target_version are the same - scenario -AA', () => { - const mockVersions: ThreeVersionsOf = { - base_version: MissingVersion, - current_version: { - type: DataSourceType.index_patterns, - index_patterns: ['one', 'three', 'four'], - }, + it('if currrent version is undefined', () => { + const mockVersions: ThreeVersionsOf = { + base_version: { type: DataSourceType.data_view, data_view_id: '123' }, + current_version: undefined, target_version: { type: DataSourceType.index_patterns, index_patterns: ['one', 'three', 'four'], @@ -391,20 +411,23 @@ describe('dataSourceDiffAlgorithm', () => { expect(result).toEqual( expect.objectContaining({ - has_base_version: false, - base_version: undefined, merged_version: mockVersions.current_version, - diff_outcome: ThreeWayDiffOutcome.MissingBaseNoUpdate, + diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, merge_outcome: ThreeWayMergeOutcome.Current, - conflict: ThreeWayDiffConflict.NONE, + conflict: ThreeWayDiffConflict.NON_SOLVABLE, }) ); }); + }); - it('returns target_version as merged output if current_version and target_version are different - scenario -AB', () => { - const mockVersions: ThreeVersionsOf = { + describe('if base_version is missing', () => { + it('returns current_version as merged output if current_version and target_version are the same - scenario -AA', () => { + const mockVersions: ThreeVersionsOf = { base_version: MissingVersion, - current_version: { type: DataSourceType.data_view, data_view_id: '456' }, + current_version: { + type: DataSourceType.index_patterns, + index_patterns: ['one', 'three', 'four'], + }, target_version: { type: DataSourceType.index_patterns, index_patterns: ['one', 'three', 'four'], @@ -417,12 +440,62 @@ describe('dataSourceDiffAlgorithm', () => { expect.objectContaining({ has_base_version: false, base_version: undefined, - merged_version: mockVersions.target_version, - diff_outcome: ThreeWayDiffOutcome.MissingBaseCanUpdate, - merge_outcome: ThreeWayMergeOutcome.Target, - conflict: ThreeWayDiffConflict.SOLVABLE, + merged_version: mockVersions.current_version, + diff_outcome: ThreeWayDiffOutcome.MissingBaseNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NONE, }) ); }); + + describe('returns target_version as merged output if current_version and target_version are different - scenario -AB', () => { + it('if versions are different types', () => { + const mockVersions: ThreeVersionsOf = { + base_version: MissingVersion, + current_version: { type: DataSourceType.data_view, data_view_id: '456' }, + target_version: { + type: DataSourceType.index_patterns, + index_patterns: ['one', 'three', 'four'], + }, + }; + + const result = dataSourceDiffAlgorithm(mockVersions); + + expect(result).toEqual( + expect.objectContaining({ + has_base_version: false, + base_version: undefined, + merged_version: mockVersions.target_version, + diff_outcome: ThreeWayDiffOutcome.MissingBaseCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.SOLVABLE, + }) + ); + }); + + it('if current version is undefined', () => { + const mockVersions: ThreeVersionsOf = { + base_version: MissingVersion, + current_version: undefined, + target_version: { + type: DataSourceType.index_patterns, + index_patterns: ['one', 'three', 'four'], + }, + }; + + const result = dataSourceDiffAlgorithm(mockVersions); + + expect(result).toEqual( + expect.objectContaining({ + has_base_version: false, + base_version: undefined, + merged_version: mockVersions.target_version, + diff_outcome: ThreeWayDiffOutcome.MissingBaseCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.SOLVABLE, + }) + ); + }); + }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/data_source_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/data_source_diff_algorithm.ts index 2f7430ddd4718..86aa886592468 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/data_source_diff_algorithm.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/data_source_diff_algorithm.ts @@ -19,12 +19,16 @@ import { DataSourceType, ThreeWayDiffConflict, determineDiffOutcomeForDataSource, + isIndexPatternDataSourceType, } from '../../../../../../../../common/api/detection_engine/prebuilt_rules'; import { getDedupedDataSourceVersion, mergeDedupedArrays } from './helpers'; +/** + * Takes a type of `RuleDataSource | undefined` because the data source can be index patterns, a data view id, or neither in some cases + */ export const dataSourceDiffAlgorithm = ( - versions: ThreeVersionsOf -): ThreeWayDiff => { + versions: ThreeVersionsOf +): ThreeWayDiff => { const { base_version: baseVersion, current_version: currentVersion, @@ -60,14 +64,14 @@ export const dataSourceDiffAlgorithm = ( interface MergeResult { mergeOutcome: ThreeWayMergeOutcome; - mergedVersion: RuleDataSource; + mergedVersion: RuleDataSource | undefined; conflict: ThreeWayDiffConflict; } interface MergeArgs { baseVersion: RuleDataSource | undefined; - currentVersion: RuleDataSource; - targetVersion: RuleDataSource; + currentVersion: RuleDataSource | undefined; + targetVersion: RuleDataSource | undefined; diffOutcome: ThreeWayDiffOutcome; } @@ -78,8 +82,12 @@ const mergeVersions = ({ diffOutcome, }: MergeArgs): MergeResult => { const dedupedBaseVersion = baseVersion ? getDedupedDataSourceVersion(baseVersion) : baseVersion; - const dedupedCurrentVersion = getDedupedDataSourceVersion(currentVersion); - const dedupedTargetVersion = getDedupedDataSourceVersion(targetVersion); + const dedupedCurrentVersion = currentVersion + ? getDedupedDataSourceVersion(currentVersion) + : currentVersion; + const dedupedTargetVersion = targetVersion + ? getDedupedDataSourceVersion(targetVersion) + : targetVersion; switch (diffOutcome) { // Scenario -AA is treated as scenario AAA: @@ -103,8 +111,8 @@ const mergeVersions = ({ case ThreeWayDiffOutcome.CustomizedValueCanUpdate: { if ( - dedupedCurrentVersion.type === DataSourceType.index_patterns && - dedupedTargetVersion.type === DataSourceType.index_patterns + isIndexPatternDataSourceType(dedupedCurrentVersion) && + isIndexPatternDataSourceType(dedupedTargetVersion) ) { const baseVersionToMerge = dedupedBaseVersion && dedupedBaseVersion.type === DataSourceType.index_patterns diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts index 0a260bb990d0f..0aeab9cf8ccbf 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts @@ -38,6 +38,7 @@ import type { ThreeVersionsOf } from '../../../../../../../common/api/detection_ import { MissingVersion } from '../../../../../../../common/api/detection_engine/prebuilt_rules/model/diff/three_way_diff/three_way_diff'; import { calculateFieldsDiffFor } from './diff_calculation_helpers'; import { + dataSourceDiffAlgorithm, multiLineStringDiffAlgorithm, numberDiffAlgorithm, scalarArrayDiffAlgorithm, @@ -209,7 +210,7 @@ const calculateCustomQueryFieldsDiff = ( const customQueryFieldsDiffAlgorithms: FieldsDiffAlgorithmsFor = { type: simpleDiffAlgorithm, kql_query: simpleDiffAlgorithm, - data_source: simpleDiffAlgorithm, + data_source: dataSourceDiffAlgorithm, }; const calculateSavedQueryFieldsDiff = ( @@ -221,7 +222,7 @@ const calculateSavedQueryFieldsDiff = ( const savedQueryFieldsDiffAlgorithms: FieldsDiffAlgorithmsFor = { type: simpleDiffAlgorithm, kql_query: simpleDiffAlgorithm, - data_source: simpleDiffAlgorithm, + data_source: dataSourceDiffAlgorithm, }; const calculateEqlFieldsDiff = ( @@ -233,7 +234,7 @@ const calculateEqlFieldsDiff = ( const eqlFieldsDiffAlgorithms: FieldsDiffAlgorithmsFor = { type: simpleDiffAlgorithm, eql_query: simpleDiffAlgorithm, - data_source: simpleDiffAlgorithm, + data_source: dataSourceDiffAlgorithm, event_category_override: singleLineStringDiffAlgorithm, timestamp_field: singleLineStringDiffAlgorithm, tiebreaker_field: singleLineStringDiffAlgorithm, @@ -259,7 +260,7 @@ const calculateThreatMatchFieldsDiff = ( const threatMatchFieldsDiffAlgorithms: FieldsDiffAlgorithmsFor = { type: simpleDiffAlgorithm, kql_query: simpleDiffAlgorithm, - data_source: simpleDiffAlgorithm, + data_source: dataSourceDiffAlgorithm, threat_query: simpleDiffAlgorithm, threat_index: scalarArrayDiffAlgorithm, threat_mapping: simpleDiffAlgorithm, @@ -277,7 +278,7 @@ const calculateThresholdFieldsDiff = ( const thresholdFieldsDiffAlgorithms: FieldsDiffAlgorithmsFor = { type: simpleDiffAlgorithm, kql_query: simpleDiffAlgorithm, - data_source: simpleDiffAlgorithm, + data_source: dataSourceDiffAlgorithm, threshold: simpleDiffAlgorithm, }; @@ -303,7 +304,7 @@ const calculateNewTermsFieldsDiff = ( const newTermsFieldsDiffAlgorithms: FieldsDiffAlgorithmsFor = { type: simpleDiffAlgorithm, kql_query: simpleDiffAlgorithm, - data_source: simpleDiffAlgorithm, + data_source: dataSourceDiffAlgorithm, new_terms_fields: scalarArrayDiffAlgorithm, history_window_start: singleLineStringDiffAlgorithm, }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/create_rule/route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/create_rule/route.test.ts index 1402518103e64..7441aec8c8fa5 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/create_rule/route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/create_rule/route.test.ts @@ -172,10 +172,6 @@ describe('Create rule route', () => { }); }); describe('rule containing response actions', () => { - beforeEach(() => { - // @ts-expect-error We're writting to a read only property just for the purpose of the test - clients.config.experimentalFeatures.endpointResponseActionsEnabled = true; - }); const getResponseAction = (command: string = 'isolate', config?: object) => ({ action_type_id: '.endpoint', params: { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/update_rule/route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/update_rule/route.test.ts index 80db9f68a853b..87f42a014c1d2 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/update_rule/route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/update_rule/route.test.ts @@ -179,10 +179,6 @@ describe('Update rule route', () => { }); }); describe('rule containing response actions', () => { - beforeEach(() => { - // @ts-expect-error We're writting to a read only property just for the purpose of the test - clients.config.experimentalFeatures.endpointResponseActionsEnabled = true; - }); const getResponseAction = (command: string = 'isolate', config?: object) => ({ action_type_id: '.endpoint', params: { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/validate.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/validate.ts index dd77122ac4560..500db54acd867 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/validate.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/validate.ts @@ -64,9 +64,7 @@ export const validateResponseActionsPermissions = async ( ruleUpdate: RuleCreateProps | RuleUpdateProps, existingRule?: RuleAlertType | null ): Promise => { - const { experimentalFeatures } = await securitySolution.getConfig(); - - if (!experimentalFeatures.endpointResponseActionsEnabled || !isQueryRule(ruleUpdate.type)) { + if (!isQueryRule(ruleUpdate.type)) { return; } diff --git a/x-pack/plugins/security_solution_serverless/server/cloud_security/constants.ts b/x-pack/plugins/security_solution_serverless/server/cloud_security/constants.ts index 25504b1da2e64..cd5a6a79eed33 100644 --- a/x-pack/plugins/security_solution_serverless/server/cloud_security/constants.ts +++ b/x-pack/plugins/security_solution_serverless/server/cloud_security/constants.ts @@ -9,7 +9,7 @@ import { CNVM_POLICY_TEMPLATE, CSPM_POLICY_TEMPLATE, KSPM_POLICY_TEMPLATE, - LATEST_FINDINGS_INDEX_PATTERN, + CDR_LATEST_NATIVE_MISCONFIGURATIONS_INDEX_PATTERN, LATEST_VULNERABILITIES_INDEX_PATTERN, } from '@kbn/cloud-security-posture-plugin/common/constants'; import { INTEGRATION_PACKAGE_NAME } from '@kbn/cloud-defend-plugin/common/constants'; @@ -27,11 +27,11 @@ export const CLOUD_DEFEND = INTEGRATION_PACKAGE_NAME; export const METERING_CONFIGS = { [CSPM]: { - index: LATEST_FINDINGS_INDEX_PATTERN, + index: CDR_LATEST_NATIVE_MISCONFIGURATIONS_INDEX_PATTERN, assets_identifier: 'resource.id', }, [KSPM]: { - index: LATEST_FINDINGS_INDEX_PATTERN, + index: CDR_LATEST_NATIVE_MISCONFIGURATIONS_INDEX_PATTERN, assets_identifier: 'agent.id', }, [CNVM]: { diff --git a/x-pack/plugins/stack_alerts/README.md b/x-pack/plugins/stack_alerts/README.md index da97af05790ef..d213bbb757b0a 100644 --- a/x-pack/plugins/stack_alerts/README.md +++ b/x-pack/plugins/stack_alerts/README.md @@ -20,4 +20,4 @@ export interface IService { Each Stack RuleType is described in it's own README: -- index threshold: [`server/alert_types/index_threshold`](server/alert_types/index_threshold/README.md) +- index threshold: [`server/rule_types/index_threshold`](server/rule_types/index_threshold/README.md) diff --git a/x-pack/plugins/task_manager/server/config.test.ts b/x-pack/plugins/task_manager/server/config.test.ts index 81e9e24ea4586..0268d61c9b975 100644 --- a/x-pack/plugins/task_manager/server/config.test.ts +++ b/x-pack/plugins/task_manager/server/config.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { configSchema } from './config'; +import { configSchema, CLAIM_STRATEGY_DEFAULT, CLAIM_STRATEGY_MGET } from './config'; describe('config validation', () => { test('task manager defaults', () => { @@ -242,4 +242,14 @@ describe('config validation', () => { test('any claim strategy is valid', () => { configSchema.validate({ claim_strategy: 'anything!' }); }); + + test('default claim strategy defaults poll interval to 3000ms', () => { + const result = configSchema.validate({ claim_strategy: CLAIM_STRATEGY_DEFAULT }); + expect(result.poll_interval).toEqual(3000); + }); + + test('mget claim strategy defaults poll interval to 500ms', () => { + const result = configSchema.validate({ claim_strategy: CLAIM_STRATEGY_MGET }); + expect(result.poll_interval).toEqual(500); + }); }); diff --git a/x-pack/plugins/task_manager/server/config.ts b/x-pack/plugins/task_manager/server/config.ts index f0f4031a4c8ac..3e5da0df9be99 100644 --- a/x-pack/plugins/task_manager/server/config.ts +++ b/x-pack/plugins/task_manager/server/config.ts @@ -13,6 +13,7 @@ export const MAX_CAPACITY = 50; export const MIN_CAPACITY = 5; export const DEFAULT_MAX_WORKERS = 10; export const DEFAULT_POLL_INTERVAL = 3000; +export const MGET_DEFAULT_POLL_INTERVAL = 500; export const DEFAULT_VERSION_CONFLICT_THRESHOLD = 80; export const DEFAULT_MAX_EPHEMERAL_REQUEST_CAPACITY = MAX_WORKERS_LIMIT; @@ -133,10 +134,18 @@ export const configSchema = schema.object( default: taskExecutionFailureThresholdSchema, }), /* How often, in milliseconds, the task manager will look for more work. */ - poll_interval: schema.number({ - defaultValue: DEFAULT_POLL_INTERVAL, - min: 100, - }), + poll_interval: schema.conditional( + schema.siblingRef('claim_strategy'), + CLAIM_STRATEGY_MGET, + schema.number({ + defaultValue: MGET_DEFAULT_POLL_INTERVAL, + min: 100, + }), + schema.number({ + defaultValue: DEFAULT_POLL_INTERVAL, + min: 100, + }) + ), /* How many requests can Task Manager buffer before it rejects new requests. */ request_capacity: schema.number({ // a nice round contrived number, feel free to change as we learn how it behaves diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 87aeabd95b5e7..895daece4f8c1 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -104,7 +104,7 @@ "alertsUIShared.components.alertLifecycleStatusBadge.flappingLabel": "Bagotement", "alertsUIShared.components.alertLifecycleStatusBadge.recoveredLabel": "Récupéré", "alertsUIShared.components.alertLifecycleStatusBadge.untrackedLabel": "Non suivi", - "alertsUIShared.hooks.useAlertDataView.useAlertDataMessage": "Impossible de charger la vue des données de l'alerte", + "alertsUIShared.hooks.useAlertDataView.fetchErrorMessage": "Impossible de charger la vue des données de l'alerte", "alertsUIShared.hooks.useLoadRuleTypesQuery.unableToLoadRuleTypesMessage": "Impossible de charger les types de règles", "alertsUIShared.hooks.useRuleAADFields.errorMessage": "Impossible de charger les champs d'alerte par type de règle", "alertsUIShared.maintenanceWindowCallout.fetchError": "La vérification visant à déterminer si les fenêtres de maintenance sont actives a échoué", @@ -6914,7 +6914,6 @@ "unifiedDataTable.copyColumnValuesToClipboard.toastTitle": "Valeurs de la colonne \"{column}\" copiées dans le presse-papiers", "unifiedDataTable.copyEscapedValueWithFormulasToClipboardWarningText": "Les valeurs peuvent contenir des formules avec échappement.", "unifiedDataTable.copyFailedErrorText": "Impossible de copier dans le presse-papiers avec ce navigateur", - "unifiedDataTable.copyToClipboardJSON": "Copier les documents dans le presse-papiers (JSON)", "unifiedDataTable.copyValueToClipboard.toastTitle": "Copié dans le presse-papiers", "unifiedDataTable.grid.closePopover": "Fermer la fenêtre contextuelle", "unifiedDataTable.grid.copyCellValueButton": "Copier la valeur", @@ -13222,7 +13221,6 @@ "xpack.csp.findings.findingsFlyout.overviewTab.evidenceSourcesTitle": "Preuve", "xpack.csp.findings.findingsFlyout.overviewTab.frameworkSourcesTitle": "Sources du framework", "xpack.csp.findings.findingsFlyout.overviewTab.impactTitle": "Impact", - "xpack.csp.findings.findingsFlyout.overviewTab.indexTitle": "Index", "xpack.csp.findings.findingsFlyout.overviewTab.rationaleTitle": "Environnement", "xpack.csp.findings.findingsFlyout.overviewTab.remediationTitle": "Résolution", "xpack.csp.findings.findingsFlyout.overviewTab.ruleNameTitle": "Nom de règle", @@ -21352,7 +21350,6 @@ "xpack.infra.analysisSetup.endTimeAfterStartTimeErrorMessage": "L'heure de fin doit être ultérieure à l'heure de début.", "xpack.infra.analysisSetup.endTimeDefaultDescription": "Indéfiniment", "xpack.infra.analysisSetup.endTimeLabel": "Heure de fin", - "xpack.infra.analysisSetup.indicesSelectionDescription": "Par défaut, le Machine Learning analyse les messages de logs dans tous les index de logs configurés pour la source. Vous pouvez choisir de n'analyser qu'un sous-ensemble de noms d'index. Tous les noms d'index sélectionnés doivent correspondre à au moins un index avec des entrées de logs. Vous pouvez également choisir de n'inclure qu'un certain sous-ensemble d'ensembles de données. Notez que le filtre d'ensembles de données s'applique à tous les index sélectionnés.", "xpack.infra.analysisSetup.indicesSelectionIndexNotFound": "Aucun index ne correspond au modèle {index}", "xpack.infra.analysisSetup.indicesSelectionLabel": "Index", "xpack.infra.analysisSetup.indicesSelectionNetworkError": "Nous n'avons pas pu charger votre configuration d'index", @@ -42920,7 +42917,6 @@ "xpack.triggersActionsUI.updateApiKeyConfirmModal.failureMessage": "Impossible de mettre à jour {idsToUpdate, plural, one {la clé} other {les clés}} de l'API", "xpack.triggersActionsUI.updateApiKeyConfirmModal.title": "Mettre à jour la clé d'API", "xpack.triggersActionsUI.urlSyncedAlertsSearchBar.invalidQueryTitle": "Chaîne de requête non valide", - "xpack.triggersActionsUI.useAlertDataView.useAlertDataMessage": "Impossible de charger la vue des données de l'alerte", "xpack.triggersActionsUI.useRuleAADFields.errorMessage": "Impossible de charger les champs d'alerte par type de règle", "xpack.upgradeAssistant.app.deniedPrivilegeDescription": "Afin d'utiliser l'assistant de mise à niveau et de résoudre les problèmes de déclassement, vous devez disposer d'un accès permettant de gérer tous les espaces Kibana.", "xpack.upgradeAssistant.app.deniedPrivilegeTitle": "Rôle d'administrateur Kibana requis", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index ba156f910d1aa..a1d42691faeaa 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -104,7 +104,7 @@ "alertsUIShared.components.alertLifecycleStatusBadge.flappingLabel": "フラップ中", "alertsUIShared.components.alertLifecycleStatusBadge.recoveredLabel": "回復済み", "alertsUIShared.components.alertLifecycleStatusBadge.untrackedLabel": "未追跡", - "alertsUIShared.hooks.useAlertDataView.useAlertDataMessage": "アラートデータビューを読み込めません", + "alertsUIShared.hooks.useAlertDataView.fetchErrorMessage": "アラートデータビューを読み込めません", "alertsUIShared.hooks.useLoadRuleTypesQuery.unableToLoadRuleTypesMessage": "ルールタイプを読み込めません", "alertsUIShared.hooks.useRuleAADFields.errorMessage": "ルールタイプごとにアラートフィールドを読み込めません", "alertsUIShared.maintenanceWindowCallout.fetchError": "保守時間枠がアクティブであるかどうかを確認できませんでした", @@ -6893,7 +6893,6 @@ "unifiedDataTable.copyColumnValuesToClipboard.toastTitle": "\"{column}\"列の値がクリップボードにコピーされました", "unifiedDataTable.copyEscapedValueWithFormulasToClipboardWarningText": "値にはエスケープされた式を含めることができます。", "unifiedDataTable.copyFailedErrorText": "このブラウザーではクリップボードにコピーできません", - "unifiedDataTable.copyToClipboardJSON": "ドキュメントをクリップボードにコピー(JSON)", "unifiedDataTable.copyValueToClipboard.toastTitle": "クリップボードにコピーされました", "unifiedDataTable.grid.closePopover": "ポップオーバーを閉じる", "unifiedDataTable.grid.copyCellValueButton": "値をコピー", @@ -13182,7 +13181,6 @@ "xpack.csp.findings.findingsFlyout.overviewTab.evidenceSourcesTitle": "証拠", "xpack.csp.findings.findingsFlyout.overviewTab.frameworkSourcesTitle": "フレームワークソース", "xpack.csp.findings.findingsFlyout.overviewTab.impactTitle": "インパクト", - "xpack.csp.findings.findingsFlyout.overviewTab.indexTitle": "インデックス", "xpack.csp.findings.findingsFlyout.overviewTab.rationaleTitle": "根拠", "xpack.csp.findings.findingsFlyout.overviewTab.remediationTitle": "修正", "xpack.csp.findings.findingsFlyout.overviewTab.ruleNameTitle": "ルール名", @@ -21281,7 +21279,6 @@ "xpack.infra.analysisSetup.endTimeAfterStartTimeErrorMessage": "終了時刻は開始時刻よりも後でなければなりません。", "xpack.infra.analysisSetup.endTimeDefaultDescription": "永久", "xpack.infra.analysisSetup.endTimeLabel": "終了時刻", - "xpack.infra.analysisSetup.indicesSelectionDescription": "既定では、機械学習は、ソースに対して構成されたすべてのログインデックスにあるログメッセージを分析します。インデックス名のサブセットのみを分析することを選択できます。すべての選択したインデックス名は、ログエントリを含む1つ以上のインデックスと一致する必要があります。特定のデータセットのサブセットのみを含めることを選択できます。データセットフィルターはすべての選択したインデックスに適用されます。", "xpack.infra.analysisSetup.indicesSelectionIndexNotFound": "インデックスがパターン{index}と一致しません", "xpack.infra.analysisSetup.indicesSelectionLabel": "インデックス", "xpack.infra.analysisSetup.indicesSelectionNetworkError": "インデックス構成を読み込めませんでした", @@ -42779,7 +42776,6 @@ "xpack.triggersActionsUI.updateApiKeyConfirmModal.failureMessage": "API {idsToUpdate, plural, other {キー}}を更新できませんでした", "xpack.triggersActionsUI.updateApiKeyConfirmModal.title": "APIキーの更新", "xpack.triggersActionsUI.urlSyncedAlertsSearchBar.invalidQueryTitle": "無効なクエリ文字列", - "xpack.triggersActionsUI.useAlertDataView.useAlertDataMessage": "アラートデータビューを読み込めません", "xpack.triggersActionsUI.useRuleAADFields.errorMessage": "ルールタイプごとにアラートフィールドを読み込めません", "xpack.upgradeAssistant.app.deniedPrivilegeDescription": "アップグレードアシスタントを使用して、廃止予定の問題を解決するには、すべてのKibanaスペースを管理するためのアクセス権が必要です。", "xpack.upgradeAssistant.app.deniedPrivilegeTitle": "Kibana管理者ロールが必要です", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index f84eb91761f67..92befbf8b7614 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -104,7 +104,7 @@ "alertsUIShared.components.alertLifecycleStatusBadge.flappingLabel": "摆动", "alertsUIShared.components.alertLifecycleStatusBadge.recoveredLabel": "已恢复", "alertsUIShared.components.alertLifecycleStatusBadge.untrackedLabel": "已取消跟踪", - "alertsUIShared.hooks.useAlertDataView.useAlertDataMessage": "无法加载告警数据视图", + "alertsUIShared.hooks.useAlertDataView.fetchErrorMessage": "无法加载告警数据视图", "alertsUIShared.hooks.useLoadRuleTypesQuery.unableToLoadRuleTypesMessage": "无法加载规则类型", "alertsUIShared.hooks.useRuleAADFields.errorMessage": "无法按规则类型加载告警字段", "alertsUIShared.maintenanceWindowCallout.fetchError": "无法检查维护窗口是否处于活动状态", @@ -6926,7 +6926,6 @@ "unifiedDataTable.copyColumnValuesToClipboard.toastTitle": "“{column}”列的值已复制到剪贴板", "unifiedDataTable.copyEscapedValueWithFormulasToClipboardWarningText": "值可能包含已转义的公式。", "unifiedDataTable.copyFailedErrorText": "无法在此浏览器中复制到剪贴板", - "unifiedDataTable.copyToClipboardJSON": "将文档复制到剪贴板 (JSON)", "unifiedDataTable.copyValueToClipboard.toastTitle": "已复制到剪贴板", "unifiedDataTable.grid.closePopover": "关闭弹出框", "unifiedDataTable.grid.copyCellValueButton": "复制值", @@ -13242,7 +13241,6 @@ "xpack.csp.findings.findingsFlyout.overviewTab.evidenceSourcesTitle": "证据", "xpack.csp.findings.findingsFlyout.overviewTab.frameworkSourcesTitle": "框架源", "xpack.csp.findings.findingsFlyout.overviewTab.impactTitle": "影响", - "xpack.csp.findings.findingsFlyout.overviewTab.indexTitle": "索引", "xpack.csp.findings.findingsFlyout.overviewTab.rationaleTitle": "理由", "xpack.csp.findings.findingsFlyout.overviewTab.remediationTitle": "补救", "xpack.csp.findings.findingsFlyout.overviewTab.ruleNameTitle": "规则名称", @@ -21379,7 +21377,6 @@ "xpack.infra.analysisSetup.endTimeAfterStartTimeErrorMessage": "结束时间必须晚于开始时间。", "xpack.infra.analysisSetup.endTimeDefaultDescription": "无限期", "xpack.infra.analysisSetup.endTimeLabel": "结束时间", - "xpack.infra.analysisSetup.indicesSelectionDescription": "默认情况下,Machine Learning 分析为源配置的所有日志索引中的日志消息。可以选择仅分析一部分索引名称。每个选定索引名称必须至少匹配一个具有日志条目的索引。还可以选择仅包括数据集的某个子集。注意,数据集筛选应用于所有选定索引。", "xpack.infra.analysisSetup.indicesSelectionIndexNotFound": "没有索引匹配模式 {index}", "xpack.infra.analysisSetup.indicesSelectionLabel": "索引", "xpack.infra.analysisSetup.indicesSelectionNetworkError": "我们无法加载您的索引配置", @@ -42969,7 +42966,6 @@ "xpack.triggersActionsUI.updateApiKeyConfirmModal.failureMessage": "无法更新 API {idsToUpdate, plural, other {密钥}}", "xpack.triggersActionsUI.updateApiKeyConfirmModal.title": "更新 API 密钥", "xpack.triggersActionsUI.urlSyncedAlertsSearchBar.invalidQueryTitle": "字符串查询无效", - "xpack.triggersActionsUI.useAlertDataView.useAlertDataMessage": "无法加载告警数据视图", "xpack.triggersActionsUI.useRuleAADFields.errorMessage": "无法按规则类型加载告警字段", "xpack.upgradeAssistant.app.deniedPrivilegeDescription": "要使用升级助手并解决弃用问题,必须具有管理所有 Kibana 工作区的访问权限。", "xpack.upgradeAssistant.app.deniedPrivilegeTitle": "需要 Kibana 管理员角色", diff --git a/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_alert_data_view.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_alert_data_view.test.tsx deleted file mode 100644 index b12d0454b997c..0000000000000 --- a/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_alert_data_view.test.tsx +++ /dev/null @@ -1,135 +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 { AlertConsumers } from '@kbn/rule-data-utils'; -import { createStartServicesMock } from '../../common/lib/kibana/kibana_react.mock'; -import type { ValidFeatureId } from '@kbn/rule-data-utils'; -import { renderHook } from '@testing-library/react-hooks/dom'; -import { useAlertDataViews } from './use_alert_data_view'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import React from 'react'; -import { waitFor } from '@testing-library/react'; - -const mockUseKibanaReturnValue = createStartServicesMock(); - -jest.mock('@kbn/kibana-react-plugin/public', () => ({ - __esModule: true, - useKibana: jest.fn(() => ({ - services: mockUseKibanaReturnValue, - })), -})); - -jest.mock('../lib/rule_api/alert_index', () => ({ - fetchAlertIndexNames: jest.fn(), -})); - -const { fetchAlertIndexNames } = jest.requireMock('../lib/rule_api/alert_index'); - -jest.mock('../lib/rule_api/alert_fields', () => ({ - fetchAlertFields: jest.fn(), -})); -const { fetchAlertFields } = jest.requireMock('../lib/rule_api/alert_fields'); - -const queryClient = new QueryClient({ - defaultOptions: { - queries: { - retry: false, - cacheTime: 0, - }, - }, -}); -const wrapper = ({ children }: { children: Node }) => ( - {children} -); - -describe('useAlertDataView', () => { - const observabilityAlertFeatureIds: ValidFeatureId[] = [ - AlertConsumers.APM, - AlertConsumers.INFRASTRUCTURE, - AlertConsumers.LOGS, - AlertConsumers.UPTIME, - ]; - - beforeEach(() => { - fetchAlertIndexNames.mockResolvedValue([ - '.alerts-observability.uptime.alerts-*', - '.alerts-observability.metrics.alerts-*', - '.alerts-observability.logs.alerts-*', - '.alerts-observability.apm.alerts-*', - ]); - fetchAlertFields.mockResolvedValue([{ data: ' fields' }]); - }); - - afterEach(() => { - queryClient.clear(); - jest.clearAllMocks(); - }); - - it('initially is loading and does not have data', async () => { - const mockedAsyncDataView = { - loading: true, - dataview: undefined, - }; - - const { result } = renderHook(() => useAlertDataViews(observabilityAlertFeatureIds), { - wrapper, - }); - - await waitFor(() => expect(result.current).toEqual(mockedAsyncDataView)); - }); - - it('fetch index names + fields for the provided o11y featureIds', async () => { - renderHook(() => useAlertDataViews(observabilityAlertFeatureIds), { - wrapper, - }); - - await waitFor(() => expect(fetchAlertIndexNames).toHaveBeenCalledTimes(1)); - expect(fetchAlertFields).toHaveBeenCalledTimes(1); - }); - - it('only fetch index names for security featureId', async () => { - renderHook(() => useAlertDataViews([AlertConsumers.SIEM]), { - wrapper, - }); - - await waitFor(() => expect(fetchAlertIndexNames).toHaveBeenCalledTimes(1)); - expect(fetchAlertFields).toHaveBeenCalledTimes(0); - }); - - it('Do not fetch anything if security and o11y featureIds are mixed together', async () => { - const { result } = renderHook( - () => useAlertDataViews([AlertConsumers.SIEM, AlertConsumers.LOGS]), - { - wrapper, - } - ); - - await waitFor(() => - expect(result.current).toEqual({ - loading: false, - dataview: undefined, - }) - ); - expect(fetchAlertIndexNames).toHaveBeenCalledTimes(0); - expect(fetchAlertFields).toHaveBeenCalledTimes(0); - }); - - it('if fetch throws error return no data', async () => { - fetchAlertIndexNames.mockRejectedValue('error'); - - const { result } = renderHook(() => useAlertDataViews(observabilityAlertFeatureIds), { - wrapper, - }); - - await waitFor(() => - expect(result.current).toEqual({ - loading: false, - dataview: undefined, - }) - ); - }); -}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_alert_data_view.ts b/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_alert_data_view.ts deleted file mode 100644 index 322bab6c88301..0000000000000 --- a/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_alert_data_view.ts +++ /dev/null @@ -1,162 +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'; -import { DataView } from '@kbn/data-views-plugin/common'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; -import { AlertConsumers, ValidFeatureId } from '@kbn/rule-data-utils'; -import { useEffect, useMemo, useState } from 'react'; -import { useQuery } from '@tanstack/react-query'; -import { TriggersAndActionsUiServices } from '../..'; -import { fetchAlertIndexNames } from '../lib/rule_api/alert_index'; -import { fetchAlertFields } from '../lib/rule_api/alert_fields'; - -export interface UserAlertDataViews { - dataViews?: DataView[]; - loading: boolean; -} - -export function useAlertDataViews(featureIds: ValidFeatureId[]): UserAlertDataViews { - const { - http, - data: dataService, - notifications: { toasts }, - } = useKibana().services; - const [dataViews, setDataViews] = useState(undefined); - const features = featureIds.sort().join(','); - const isOnlySecurity = featureIds.length === 1 && featureIds.includes(AlertConsumers.SIEM); - - const hasSecurityAndO11yFeatureIds = - featureIds.length > 1 && featureIds.includes(AlertConsumers.SIEM); - - const hasNoSecuritySolution = - featureIds.length > 0 && !isOnlySecurity && !hasSecurityAndO11yFeatureIds; - - const queryIndexNameFn = () => { - return fetchAlertIndexNames({ http, features }); - }; - - const queryAlertFieldsFn = () => { - return fetchAlertFields({ http, featureIds }); - }; - - const onErrorFn = () => { - toasts.addDanger( - i18n.translate('xpack.triggersActionsUI.useAlertDataView.useAlertDataMessage', { - defaultMessage: 'Unable to load alert data view', - }) - ); - }; - - const { - data: indexNames, - isSuccess: isIndexNameSuccess, - isInitialLoading: isIndexNameInitialLoading, - isLoading: isIndexNameLoading, - } = useQuery({ - queryKey: ['loadAlertIndexNames', features], - queryFn: queryIndexNameFn, - onError: onErrorFn, - refetchOnWindowFocus: false, - enabled: featureIds.length > 0 && !hasSecurityAndO11yFeatureIds, - }); - - const { - data: alertFields, - isSuccess: isAlertFieldsSuccess, - isInitialLoading: isAlertFieldsInitialLoading, - isLoading: isAlertFieldsLoading, - } = useQuery({ - queryKey: ['loadAlertFields', features], - queryFn: queryAlertFieldsFn, - onError: onErrorFn, - refetchOnWindowFocus: false, - enabled: hasNoSecuritySolution, - }); - - useEffect(() => { - return () => { - dataViews?.map((dv) => { - dataService.dataViews.clearInstanceCache(dv.id); - }); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [dataViews]); - - // FUTURE ENGINEER this useEffect is for security solution user since - // we are using the user privilege to access the security alert index - useEffect(() => { - async function createDataView() { - const localDataview = await dataService.dataViews.create({ - title: (indexNames ?? []).join(','), - allowNoIndex: true, - }); - setDataViews([localDataview]); - } - - if (isOnlySecurity && isIndexNameSuccess) { - createDataView(); - } - }, [dataService.dataViews, indexNames, isIndexNameSuccess, isOnlySecurity]); - - // FUTURE ENGINEER this useEffect is for o11y and stack solution user since - // we are using the kibana user privilege to access the alert index - useEffect(() => { - if ( - indexNames && - alertFields && - !isOnlySecurity && - isAlertFieldsSuccess && - isIndexNameSuccess - ) { - setDataViews([ - { - title: (indexNames ?? []).join(','), - fieldFormatMap: {}, - fields: (alertFields ?? [])?.map((field) => { - return { - ...field, - ...(field.esTypes && field.esTypes.includes('flattened') ? { type: 'string' } : {}), - }; - }), - }, - ] as unknown as DataView[]); - } - }, [ - alertFields, - dataService.dataViews, - indexNames, - isIndexNameSuccess, - isOnlySecurity, - isAlertFieldsSuccess, - ]); - - return useMemo( - () => ({ - dataViews, - loading: - featureIds.length === 0 || hasSecurityAndO11yFeatureIds - ? false - : isOnlySecurity - ? isIndexNameInitialLoading || isIndexNameLoading - : isIndexNameInitialLoading || - isIndexNameLoading || - isAlertFieldsInitialLoading || - isAlertFieldsLoading, - }), - [ - dataViews, - featureIds.length, - hasSecurityAndO11yFeatureIds, - isOnlySecurity, - isIndexNameInitialLoading, - isIndexNameLoading, - isAlertFieldsInitialLoading, - isAlertFieldsLoading, - ] - ); -} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_search_bar/alerts_search_bar.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_search_bar/alerts_search_bar.tsx index 2f4f0492ad73a..3896e5d0e938a 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_search_bar/alerts_search_bar.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_search_bar/alerts_search_bar.tsx @@ -9,25 +9,26 @@ import React, { useCallback, useMemo, useState } from 'react'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { compareFilters, Query, TimeRange } from '@kbn/es-query'; import { SuggestionsAbstraction } from '@kbn/unified-search-plugin/public/typeahead/suggestions_component'; -import { AlertConsumers } from '@kbn/rule-data-utils'; +import { AlertConsumers, ValidFeatureId } from '@kbn/rule-data-utils'; import { EuiContextMenuPanelDescriptor, EuiContextMenuPanelItemDescriptor } from '@elastic/eui'; +import { useAlertsDataView } from '@kbn/alerts-ui-shared/src/common/hooks/use_alerts_data_view'; import { isQuickFiltersGroup, QuickFiltersMenuItem } from './quick_filters'; import { NO_INDEX_PATTERNS } from './constants'; import { SEARCH_BAR_PLACEHOLDER } from './translations'; import { AlertsSearchBarProps, QueryLanguageType } from './types'; -import { useAlertDataViews } from '../../hooks/use_alert_data_view'; import { TriggersAndActionsUiServices } from '../../..'; import { useRuleAADFields } from '../../hooks/use_rule_aad_fields'; import { useLoadRuleTypesQuery } from '../../hooks/use_load_rule_types_query'; const SA_ALERTS = { type: 'alerts', fields: {} } as SuggestionsAbstraction; +const EMPTY_FEATURE_IDS: ValidFeatureId[] = []; // TODO Share buildEsQuery to be used between AlertsSearchBar and AlertsStateTable component https://github.com/elastic/kibana/issues/144615 // Also TODO: Replace all references to this component with the one from alerts-ui-shared export function AlertsSearchBar({ appName, disableQueryLanguageSwitcher = false, - featureIds, + featureIds = EMPTY_FEATURE_IDS, ruleTypeId, query, filters, @@ -46,17 +47,32 @@ export function AlertsSearchBar({ ...props }: AlertsSearchBarProps) { const { + http, + dataViews: dataViewsService, + notifications: { toasts }, unifiedSearch: { ui: { SearchBar }, }, } = useKibana().services; const [queryLanguage, setQueryLanguage] = useState('kuery'); - const { dataViews, loading } = useAlertDataViews(featureIds ?? []); + const { dataView } = useAlertsDataView({ + featureIds, + http, + dataViewsService, + toasts, + }); const { aadFields, loading: fieldsLoading } = useRuleAADFields(ruleTypeId); - const indexPatterns = - ruleTypeId && aadFields?.length ? [{ title: ruleTypeId, fields: aadFields }] : dataViews; + const indexPatterns = useMemo(() => { + if (ruleTypeId && aadFields?.length) { + return [{ title: ruleTypeId, fields: aadFields }]; + } + if (dataView) { + return [dataView]; + } + return null; + }, [aadFields, dataView, ruleTypeId]); const ruleType = useLoadRuleTypesQuery({ filteredRuleTypes: ruleTypeId !== undefined ? [ruleTypeId] : [], @@ -157,7 +173,7 @@ export function AlertsSearchBar({ appName={appName} disableQueryLanguageSwitcher={disableQueryLanguageSwitcher} // @ts-expect-error - DataView fields prop and SearchBar indexPatterns props are overly broad - indexPatterns={loading || fieldsLoading ? NO_INDEX_PATTERNS : indexPatterns} + indexPatterns={!indexPatterns || fieldsLoading ? NO_INDEX_PATTERNS : indexPatterns} placeholder={placeholder} query={{ query: query ?? '', language: queryLanguage }} filters={filters} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.test.tsx index 09de049798a12..84b6be1a91560 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.test.tsx @@ -40,7 +40,7 @@ import { getMaintenanceWindowMockMap } from './maintenance_windows/index.mock'; import { AlertTableConfigRegistry } from '../../alert_table_config_registry'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { fetchAlertsFields } from '@kbn/alerts-ui-shared/src/common/apis/fetch_alerts_fields'; -import { useSearchAlertsQuery } from '@kbn/alerts-ui-shared/src/common/hooks'; +import { useSearchAlertsQuery } from '@kbn/alerts-ui-shared/src/common/hooks/use_search_alerts_query'; jest.mock('@kbn/kibana-utils-plugin/public'); jest.mock('@kbn/alerts-ui-shared/src/common/hooks/use_search_alerts_query'); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.tsx index 2ce8ed3e28e6e..c2b147f2821e8 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.tsx @@ -30,7 +30,7 @@ import type { SortCombinations, } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { QueryClientProvider } from '@tanstack/react-query'; -import { useSearchAlertsQuery } from '@kbn/alerts-ui-shared/src/common/hooks'; +import { useSearchAlertsQuery } from '@kbn/alerts-ui-shared/src/common/hooks/use_search_alerts_query'; import { DEFAULT_ALERTS_PAGE_SIZE } from '@kbn/alerts-ui-shared/src/common/constants'; import { AlertsQueryContext } from '@kbn/alerts-ui-shared/src/common/contexts/alerts_query_context'; import deepEqual from 'fast-deep-equal'; @@ -296,7 +296,7 @@ const AlertsTableStateWithQueryProvider = memo( storage, id, defaultColumns: columnConfigByClient, - browserFields: propBrowserFields, + alertsFields: propBrowserFields, }); const [queryParams, setQueryParams] = useState({ diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_columns/use_columns.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_columns/use_columns.test.tsx index 97d7ba7c2545e..ced47444f3a8f 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_columns/use_columns.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_columns/use_columns.test.tsx @@ -116,8 +116,9 @@ describe('useColumns', () => { ]; beforeEach(() => { - setItemStorageMock.mockClear(); + jest.clearAllMocks(); storage = { current: new Storage(mockStorage) }; + queryClient.clear(); }); test('onColumnResize', async () => { @@ -152,6 +153,28 @@ describe('useColumns', () => { }); }); + test("does not fetch alerts fields if they're overridden through the alertsFields prop", () => { + const localStorageAlertsTable = getStorageAlertsTableByDefaultColumns(defaultColumns); + const alertsFields = { + testField: { name: 'testField', type: 'string', searchable: true, aggregatable: true }, + }; + const { result } = renderHook( + () => + useColumns({ + alertsFields, + defaultColumns, + featureIds, + id, + storageAlertsTable: localStorageAlertsTable, + storage, + }), + { wrapper } + ); + + expect(mockFetchAlertsFields).not.toHaveBeenCalled(); + expect(result.current.browserFields).toEqual(alertsFields); + }); + describe('visibleColumns', () => { test('hide all columns with onChangeVisibleColumns', async () => { const localStorageAlertsTable = getStorageAlertsTableByDefaultColumns(defaultColumns); @@ -204,7 +227,7 @@ describe('useColumns', () => { expect(result.current.columns).toEqual(defaultColumns); }); - test('should populate visiblecolumns correctly', async () => { + test('should populate visibleColumns correctly', async () => { const localStorageAlertsTable = getStorageAlertsTableByDefaultColumns(defaultColumns); const { result } = renderHook( () => @@ -221,7 +244,7 @@ describe('useColumns', () => { expect(result.current.visibleColumns).toMatchObject(defaultColumns.map((col) => col.id)); }); - test('should change visiblecolumns if provided defaultColumns change', async () => { + test('should change visibleColumns if provided defaultColumns change', async () => { let localDefaultColumns = [...defaultColumns]; let localStorageAlertsTable = getStorageAlertsTableByDefaultColumns(localDefaultColumns); const { result, rerender } = renderHook( diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_columns/use_columns.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_columns/use_columns.ts index a78b92b6f7599..8846470a2d263 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_columns/use_columns.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_columns/use_columns.ts @@ -8,7 +8,7 @@ import { EuiDataGridColumn, EuiDataGridOnColumnResizeData } from '@elastic/eui'; import { IStorageWrapper } from '@kbn/kibana-utils-plugin/public'; import { BrowserField, BrowserFields } from '@kbn/alerting-types'; -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { MutableRefObject, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { AlertConsumers } from '@kbn/rule-data-utils'; import { isEmpty } from 'lodash'; import { useFetchAlertsFieldsQuery } from '@kbn/alerts-ui-shared/src/common/hooks/use_fetch_alerts_fields_query'; @@ -23,7 +23,11 @@ export interface UseColumnsArgs { storage: React.MutableRefObject; id: string; defaultColumns: EuiDataGridColumn[]; - browserFields?: BrowserFields; + /** + * If this is provided, it will be used to populate the columns instead of fetching the fields + * from the alerting APIs + */ + alertsFields?: BrowserFields; } export interface UseColumnsResp { @@ -137,8 +141,8 @@ const persist = ({ visibleColumns, }: { id: string; - storageAlertsTable: React.MutableRefObject; - storage: React.MutableRefObject; + storageAlertsTable: MutableRefObject; + storage: MutableRefObject; columns: EuiDataGridColumn[]; visibleColumns: string[]; }) => { @@ -156,25 +160,31 @@ export const useColumns = ({ storage, id, defaultColumns, - browserFields, + alertsFields, }: UseColumnsArgs): UseColumnsResp => { const { http } = useKibana().services; - const { isLoading: isBrowserFieldDataLoading, data } = useFetchAlertsFieldsQuery( + const fieldsQuery = useFetchAlertsFieldsQuery( { http, featureIds, }, { + enabled: !alertsFields, context: AlertsQueryContext, } ); + const selectedAlertsFields = useMemo( + () => alertsFields ?? fieldsQuery.data?.browserFields ?? {}, + [alertsFields, fieldsQuery.data?.browserFields] + ); + const [columns, setColumns] = useState(() => { let cols = storageAlertsTable.current.columns; // before restoring from storage, enrich the column data - if (browserFields && defaultColumns) { - cols = populateColumns(cols, browserFields, defaultColumns); + if (alertsFields && defaultColumns) { + cols = populateColumns(cols, alertsFields, defaultColumns); } else if (cols && cols.length === 0) { cols = defaultColumns; } @@ -206,7 +216,7 @@ export const useColumns = ({ ); useEffect(() => { - // if defaultColumns have changed, + // If defaultColumns have changed, // get the latest columns provided by client and if (didDefaultColumnChange && defaultColumnsRef.current) { defaultColumnsRef.current = defaultColumns; @@ -220,13 +230,19 @@ export const useColumns = ({ }, [didDefaultColumnChange, storageAlertsTable, defaultColumns, visibleColumns]); useEffect(() => { - if (isEmpty(data.browserFields) || isColumnsPopulated) return; + if (fieldsQuery.data) { + if (isEmpty(fieldsQuery.data.browserFields) || isColumnsPopulated) return; - const populatedColumns = populateColumns(columns, data.browserFields, defaultColumns); + const populatedColumns = populateColumns( + columns, + fieldsQuery.data.browserFields, + defaultColumns + ); - setColumnsPopulated(true); - setColumns(populatedColumns); - }, [data.browserFields, defaultColumns, isBrowserFieldDataLoading, isColumnsPopulated, columns]); + setColumnsPopulated(true); + setColumns(populatedColumns); + } + }, [defaultColumns, fieldsQuery.isLoading, isColumnsPopulated, columns, fieldsQuery.data]); const setColumnsAndSave = useCallback( (newColumns: EuiDataGridColumn[], newVisibleColumns: string[]) => { @@ -244,7 +260,7 @@ export const useColumns = ({ const onToggleColumn = useCallback( (columnId: string): void => { - const column = euiColumnFactory(columnId, data.browserFields, defaultColumns); + const column = euiColumnFactory(columnId, selectedAlertsFields, defaultColumns); const newColumns = toggleColumn({ column, @@ -260,19 +276,19 @@ export const useColumns = ({ setVisibleColumns(newVisibleColumns); setColumnsAndSave(newColumns, newVisibleColumns); }, - [data.browserFields, columns, defaultColumns, setColumnsAndSave, visibleColumns] + [selectedAlertsFields, columns, defaultColumns, setColumnsAndSave, visibleColumns] ); const onResetColumns = useCallback(() => { const populatedDefaultColumns = populateColumns( defaultColumns, - data.browserFields, + selectedAlertsFields, defaultColumns ); const newVisibleColumns = populatedDefaultColumns.map((pdc) => pdc.id); setVisibleColumns(newVisibleColumns); setColumnsAndSave(populatedDefaultColumns, newVisibleColumns); - }, [data.browserFields, defaultColumns, setColumnsAndSave]); + }, [selectedAlertsFields, defaultColumns, setColumnsAndSave]); const onColumnResize = useCallback( ({ columnId, width }: EuiDataGridOnColumnResizeData) => { @@ -294,8 +310,8 @@ export const useColumns = ({ () => ({ columns, visibleColumns, - isBrowserFieldDataLoading, - browserFields: browserFields ?? data.browserFields, + isBrowserFieldDataLoading: fieldsQuery.isLoading, + browserFields: selectedAlertsFields, onToggleColumn, onResetColumns, onChangeVisibleColumns: setColumnsByColumnIds, @@ -305,9 +321,8 @@ export const useColumns = ({ [ columns, visibleColumns, - isBrowserFieldDataLoading, - browserFields, - data.browserFields, + fieldsQuery.isLoading, + selectedAlertsFields, onToggleColumn, onResetColumns, setColumnsByColumnIds, diff --git a/x-pack/scripts/synthetics_private_location.js b/x-pack/scripts/synthetics_private_location.js new file mode 100644 index 0000000000000..2352c8238cc40 --- /dev/null +++ b/x-pack/scripts/synthetics_private_location.js @@ -0,0 +1,9 @@ +/* + * 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. + */ + +require('../../src/setup_node_env'); +require('@kbn/synthetics-private-location').cli(); diff --git a/x-pack/test/api_integration/apis/security/privileges.ts b/x-pack/test/api_integration/apis/security/privileges.ts index d78b33631c6e4..4cbaeca03373c 100644 --- a/x-pack/test/api_integration/apis/security/privileges.ts +++ b/x-pack/test/api_integration/apis/security/privileges.ts @@ -68,6 +68,7 @@ export default function ({ getService }: FtrProviderContext) { 'process_operations_all', 'file_operations_all', 'execute_operations_all', + 'scan_operations_all', ], uptime: ['all', 'read', 'minimal_all', 'minimal_read', 'elastic_managed_locations_enabled'], securitySolutionAssistant: [ diff --git a/x-pack/test/api_integration/apis/security/privileges_basic.ts b/x-pack/test/api_integration/apis/security/privileges_basic.ts index a4e21fed4d92d..5fb3c715805f1 100644 --- a/x-pack/test/api_integration/apis/security/privileges_basic.ts +++ b/x-pack/test/api_integration/apis/security/privileges_basic.ts @@ -145,6 +145,7 @@ export default function ({ getService }: FtrProviderContext) { 'trusted_applications_read', 'file_operations_all', 'execute_operations_all', + 'scan_operations_all', ], uptime: [ 'all', diff --git a/x-pack/test/cloud_security_posture_api/routes/csp_benchmark_rules_bulk_update.ts b/x-pack/test/cloud_security_posture_api/routes/csp_benchmark_rules_bulk_update.ts index 54ae003de8698..5b80b5c7bc99d 100644 --- a/x-pack/test/cloud_security_posture_api/routes/csp_benchmark_rules_bulk_update.ts +++ b/x-pack/test/cloud_security_posture_api/routes/csp_benchmark_rules_bulk_update.ts @@ -484,8 +484,8 @@ export default function (providerContext: FtrProviderContext) { }); expect(status).to.be(403); }); - // Blocked by https://github.com/elastic/kibana/issues/188059 - it.skip('users with read privileges on cloud security should be able to mute', async () => { + + it('users with all privileges on cloud security should be able to mute', async () => { const rule1 = await getRandomCspBenchmarkRule(); const rule2 = await getRandomCspBenchmarkRule(); @@ -494,7 +494,7 @@ export default function (providerContext: FtrProviderContext) { .set(ELASTIC_HTTP_VERSION_HEADER, '1') .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .set('kbn-xsrf', 'xxxx') - .auth('role_security_read_user', cspSecurity.getPasswordForUser('role_security_read_user')) + .auth('role_security_all_user', cspSecurity.getPasswordForUser('role_security_all_user')) .send({ action: 'mute', rules: [ diff --git a/x-pack/test/cloud_security_posture_api/routes/helper/user_roles_utilites.ts b/x-pack/test/cloud_security_posture_api/routes/helper/user_roles_utilites.ts index ef66b58d28311..6716cc859f278 100644 --- a/x-pack/test/cloud_security_posture_api/routes/helper/user_roles_utilites.ts +++ b/x-pack/test/cloud_security_posture_api/routes/helper/user_roles_utilites.ts @@ -6,7 +6,7 @@ */ import { - LATEST_FINDINGS_INDEX_PATTERN, + CDR_LATEST_NATIVE_MISCONFIGURATIONS_INDEX_PATTERN, BENCHMARK_SCORE_INDEX_PATTERN, LATEST_VULNERABILITIES_INDEX_PATTERN, ALERTS_INDEX_PATTERN, @@ -20,7 +20,7 @@ const alertsSecurityUserIndices = [ privileges: ['read'], }, { - names: [LATEST_FINDINGS_INDEX_PATTERN], + names: [CDR_LATEST_NATIVE_MISCONFIGURATIONS_INDEX_PATTERN], privileges: ['read'], }, { @@ -43,7 +43,7 @@ const securityUserIndinces = [ privileges: ['read'], }, { - names: [LATEST_FINDINGS_INDEX_PATTERN], + names: [CDR_LATEST_NATIVE_MISCONFIGURATIONS_INDEX_PATTERN], privileges: ['read'], }, { @@ -129,6 +129,24 @@ export function CspSecurityCommonProvider(providerContext: FtrProviderContext) { }, ], }, + { + name: 'role_security_all', + elasticsearch: { + indices: securityUserIndinces, + }, + kibana: [ + { + base: [], + feature: { + siem: ['all'], + fleet: ['all'], + fleetv2: ['all'], + savedObjectsManagement: ['all'], + }, + spaces: ['*'], + }, + ], + }, ]; const users = [ @@ -140,7 +158,7 @@ export function CspSecurityCommonProvider(providerContext: FtrProviderContext) { }, { name: 'role_security_read_user_alerts', - full_name: 'user with 0 security privilege for', + full_name: 'user with 0 security privilege', password: 'csp123', roles: ['role_security_read_alerts'], }, @@ -152,10 +170,16 @@ export function CspSecurityCommonProvider(providerContext: FtrProviderContext) { }, { name: 'role_security_no_read_user_alerts', - full_name: 'user with 0 security privilege for', + full_name: 'user with 0 security privilege', password: 'csp123', roles: ['role_security_no_read_alerts'], }, + { + name: 'role_security_all_user', + full_name: 'user with all security privilege', + password: 'csp123', + roles: ['role_security_all'], + }, ]; return { diff --git a/x-pack/test/cloud_security_posture_functional/agentless/create_agent.ts b/x-pack/test/cloud_security_posture_functional/agentless/create_agent.ts new file mode 100644 index 0000000000000..aa1a079262cba --- /dev/null +++ b/x-pack/test/cloud_security_posture_functional/agentless/create_agent.ts @@ -0,0 +1,98 @@ +/* + * 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 { CLOUD_CREDENTIALS_PACKAGE_VERSION } from '@kbn/cloud-security-posture-plugin/common/constants'; +import * as http from 'http'; +import expect from '@kbn/expect'; +import type { FtrProviderContext } from '../ftr_provider_context'; +import { setupMockServer } from './mock_agentless_api'; +// eslint-disable-next-line import/no-default-export +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const mockAgentlessApiService = setupMockServer(); + const pageObjects = getPageObjects([ + 'common', + 'cspSecurity', + 'security', + 'header', + 'cisAddIntegration', + ]); + + const CIS_AWS_OPTION_TEST_ID = 'cisAwsTestId'; + + const AWS_SINGLE_ACCOUNT_TEST_ID = 'awsSingleTestId'; + + describe('Agentless cloud', function () { + let cisIntegration: typeof pageObjects.cisAddIntegration; + let mockApiServer: http.Server; + + before(async () => { + cisIntegration = pageObjects.cisAddIntegration; + mockApiServer = await mockAgentlessApiService.listen(8089); // Start the usage api mock server on port 8081 + }); + + after(async () => { + await await pageObjects.cspSecurity.logout(); + mockApiServer.close(); + }); + + it(`should create agentless-agent`, async () => { + const integrationPolicyName = `cloud_security_posture-${new Date().toISOString()}`; + await cisIntegration.navigateToAddIntegrationCspmWithVersionPage( + CLOUD_CREDENTIALS_PACKAGE_VERSION + ); + + await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID); + await cisIntegration.clickOptionButton(AWS_SINGLE_ACCOUNT_TEST_ID); + + await cisIntegration.inputIntegrationName(integrationPolicyName); + + await cisIntegration.selectSetupTechnology('agentless'); + await cisIntegration.selectAwsCredentials('direct'); + + await pageObjects.header.waitUntilLoadingHasFinished(); + + await cisIntegration.clickSaveButton(); + await pageObjects.header.waitUntilLoadingHasFinished(); + + await cisIntegration.navigateToIntegrationCspList(); + await pageObjects.header.waitUntilLoadingHasFinished(); + + expect(await cisIntegration.getFirstCspmIntegrationPageIntegration()).to.be( + integrationPolicyName + ); + expect(await cisIntegration.getFirstCspmIntegrationPageAgent()).to.be( + `Agentless policy for ${integrationPolicyName}` + ); + }); + + it(`should create default agent-based agent`, async () => { + const integrationPolicyName = `cloud_security_posture-${new Date().toISOString()}`; + + await cisIntegration.navigateToAddIntegrationCspmWithVersionPage( + CLOUD_CREDENTIALS_PACKAGE_VERSION + ); + + await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID); + await cisIntegration.clickOptionButton(AWS_SINGLE_ACCOUNT_TEST_ID); + + await cisIntegration.inputIntegrationName(integrationPolicyName); + + await cisIntegration.clickSaveButton(); + await pageObjects.header.waitUntilLoadingHasFinished(); + + const agentPolicyName = await cisIntegration.getAgentBasedPolicyValue(); + + await cisIntegration.navigateToIntegrationCspList(); + await pageObjects.header.waitUntilLoadingHasFinished(); + + expect(await cisIntegration.getFirstCspmIntegrationPageIntegration()).to.be( + integrationPolicyName + ); + expect(await cisIntegration.getFirstCspmIntegrationPageAgent()).to.be(agentPolicyName); + }); + }); +} diff --git a/x-pack/test/cloud_security_posture_functional/agentless/mock_agentless_api.ts b/x-pack/test/cloud_security_posture_functional/agentless/mock_agentless_api.ts new file mode 100644 index 0000000000000..129adde9c0018 --- /dev/null +++ b/x-pack/test/cloud_security_posture_functional/agentless/mock_agentless_api.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 { createServer } from '@mswjs/http-middleware'; + +import { http, HttpResponse, StrictResponse } from 'msw'; + +export const setupMockServer = () => { + const server = createServer(deploymentHandler); + return server; +}; + +interface AgentlessApiResponse { + status: number; +} + +const deploymentHandler = http.post( + 'agentless-api/api/v1/ess/deployments', + async ({ request }): Promise> => { + return HttpResponse.json({ + status: 200, + }); + } +); diff --git a/x-pack/test/cloud_security_posture_functional/config.agentless.ts b/x-pack/test/cloud_security_posture_functional/config.agentless.ts new file mode 100644 index 0000000000000..459c814b6e08c --- /dev/null +++ b/x-pack/test/cloud_security_posture_functional/config.agentless.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 type { FtrConfigProviderContext } from '@kbn/test'; +import { CA_CERT_PATH, KBN_CERT_PATH, KBN_KEY_PATH } from '@kbn/dev-utils'; +import { pageObjects } from './page_objects'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const xpackFunctionalConfig = await readConfigFile(require.resolve('./config.cloud.ts')); + // FTR configuration for cloud testing + return { + ...xpackFunctionalConfig.getAll(), + pageObjects, + junit: { + reportName: 'ESS Security Cloud Security Agentless Creating Agent Functional Tests', + }, + kbnTestServer: { + ...xpackFunctionalConfig.get('kbnTestServer'), + serverArgs: [ + ...xpackFunctionalConfig.get('kbnTestServer.serverArgs'), + `--xpack.fleet.agents.fleet_server.hosts=["https://ftr.kibana:8220"]`, + `--xpack.fleet.internal.fleetServerStandalone=true`, + `--xpack.fleet.enableExperimental.0=agentless`, + `--xpack.fleet.agentless.api.url=http://localhost:8089/agentless-api/api/v1/ess`, + `--xpack.fleet.agentless.api.tls.certificate=${KBN_CERT_PATH}`, + `--xpack.fleet.agentless.api.tls.key=${KBN_KEY_PATH}`, + `--xpack.fleet.agentless.api.tls.ca=${CA_CERT_PATH}`, + `--xpack.cloud.id=something-anything`, + ], + }, + // load tests in the index file + testFiles: [require.resolve('./agentless/create_agent.ts')], + }; +} diff --git a/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts b/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts index 61b4c0d42a451..0c4581f21a829 100644 --- a/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts +++ b/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts @@ -354,11 +354,34 @@ export function AddCisIntegrationFormPageProvider({ await nameField[0].type(uuidv4()); }; + const inputIntegrationName = async (text: string) => { + const page = await testSubjects.find('createPackagePolicy_page'); + const nameField = await page.findAllByCssSelector('input[id="name"]'); + await nameField[0].clearValueWithKeyboard(); + await nameField[0].type(text); + }; + const getSecretComponentReplaceButton = async (secretButtonSelector: string) => { const secretComponentReplaceButton = await testSubjects.find(secretButtonSelector); return secretComponentReplaceButton; }; + const getFirstCspmIntegrationPageIntegration = async () => { + const integration = await testSubjects.find('integrationNameLink'); + return await integration.getVisibleText(); + }; + + const getFirstCspmIntegrationPageAgent = async () => { + const agent = await testSubjects.find('agentPolicyNameLink'); + // this is assuming that the agent was just created therefor should be the first element + return await agent.getVisibleText(); + }; + + const getAgentBasedPolicyValue = async () => { + const agentName = await testSubjects.find('createAgentPolicyNameField'); + return await agentName.getAttribute('value'); + }; + return { cisAzure, cisAws, @@ -397,5 +420,9 @@ export function AddCisIntegrationFormPageProvider({ getReplaceSecretButton, getSecretComponentReplaceButton, inputUniqueIntegrationName, + inputIntegrationName, + getFirstCspmIntegrationPageIntegration, + getFirstCspmIntegrationPageAgent, + getAgentBasedPolicyValue, }; } diff --git a/x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts b/x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts index e225b7aab9d1a..26e146338a6e8 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts @@ -123,7 +123,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const ruleName1 = data[0].rule.name; - describe('Findings Page - Alerts', function () { + // Failing: See https://github.com/elastic/kibana/issues/168991 + describe.skip('Findings Page - Alerts', function () { this.tags(['cloud_security_posture_findings_alerts']); let findings: typeof pageObjects.findings; let latestFindingsTable: typeof findings.latestFindingsTable; diff --git a/x-pack/test/defend_workflows_cypress/config.ts b/x-pack/test/defend_workflows_cypress/config.ts index 09c08fca6996c..a8502edcabe24 100644 --- a/x-pack/test/defend_workflows_cypress/config.ts +++ b/x-pack/test/defend_workflows_cypress/config.ts @@ -48,9 +48,6 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { `--xpack.fleet.agents.elasticsearch.host=http://${hostIp}:${kibanaCommonTestsConfig.get( 'servers.elasticsearch.port' )}`, - `--xpack.securitySolution.enableExperimental=${JSON.stringify([ - 'endpointResponseActionsEnabled', - ])}`, ], }, }; diff --git a/x-pack/test/fleet_api_integration/apis/epm/install_custom.ts b/x-pack/test/fleet_api_integration/apis/epm/install_custom.ts index bcd4421f493d7..9fbdfd6dfee60 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/install_custom.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/install_custom.ts @@ -26,12 +26,12 @@ export default function (providerContext: FtrProviderContext) { .send({ force: true }); }; - describe('TESTME Installing custom integrations', async () => { + describe('Installing custom integrations', async () => { afterEach(async () => { await uninstallPackage(); }); - it('Correcty installs a custom integration and all of its assets', async () => { + it('Correctly installs a custom integration and all of its assets', async () => { const response = await supertest .post(`/api/fleet/epm/custom_integrations`) .set('kbn-xsrf', 'xxxx') @@ -98,9 +98,17 @@ export default function (providerContext: FtrProviderContext) { expect(installation.attributes.version).to.be(INTEGRATION_VERSION); expect(installation.attributes.install_source).to.be('custom'); expect(installation.attributes.install_status).to.be('installed'); + + for (const indexTemplate of actualIndexTemplates) { + const templateResponse = await esClient.indices.getIndexTemplate({ name: indexTemplate }); + + expect(templateResponse.index_templates[0].index_template.composed_of).to.contain( + 'ecs@mappings' + ); + } }); - it('Correctly sets up index templates to create an ECS compliant mapping', async () => { + it('Includes custom integration metadata', async () => { await supertest .post(`/api/fleet/epm/custom_integrations`) .set('kbn-xsrf', 'xxxx') @@ -118,413 +126,16 @@ export default function (providerContext: FtrProviderContext) { await esClient.index({ index: indexName, document: { - 'cloud.account.id': 'xyz', - 'cloud.availability_zone': 'xyz', - 'cloud.instance.id': 'xyz', - 'cloud.instance.name': 'xyz', - 'cloud.machine.type': 'xyz', - 'cloud.provider': 'xyz', - 'cloud.region': 'xyz', - 'cloud.project.id': 'xyz', - 'cloud.image.id': 'xyz', - 'container.id': 'xyz', - 'container.image.name': 'xyz', - 'container.labels': { foo_id: 'beef42' }, - 'container.name': 'xyz', - 'host.architecture': 'xyz', - 'host.domain': 'xyz', - 'host.hostname': 'xyz', - 'host.id': 'xyz', - 'host.ip': '1.1.1.1', - 'host.mac': 'xyz', - 'host.name': 'xyz', - 'host.os.family': 'xyz', - 'host.os.kernel': 'xyz', - 'host.os.name': 'xyz', - 'host.os.platform': 'xyz', - 'host.os.version': 'xyz', - 'host.os.type': 'xyz', - 'host.os.containerized': true, - 'host.os.build': 'xyz', - 'host.os.codename': 'xyz', - 'input.type': 'xyz', - 'log.offset': 123, - 'data_stream.type': 'logs', + foo: 'bar', }, }); + const response = await esClient.indices.getMapping({ index: indexName }); - expect(Object.values(response)[0].mappings).to.eql({ - subobjects: false, - _meta: { - managed_by: 'fleet', - managed: true, - package: { - name: 'my_nginx', - }, - }, - _data_stream_timestamp: { - enabled: true, - }, - dynamic_templates: [ - { - ecs_timestamp: { - mapping: { - ignore_malformed: false, - type: 'date', - }, - match: '@timestamp', - }, - }, - { - ecs_message_match_only_text: { - mapping: { - type: 'match_only_text', - }, - path_match: ['message', '*.message'], - unmatch_mapping_type: 'object', - }, - }, - { - ecs_non_indexed_keyword: { - mapping: { - doc_values: false, - index: false, - type: 'keyword', - }, - path_match: 'event.original', - }, - }, - { - ecs_non_indexed_long: { - mapping: { - doc_values: false, - index: false, - type: 'long', - }, - path_match: '*.x509.public_key_exponent', - }, - }, - { - ecs_ip: { - path_match: ['ip', '*.ip', '*_ip'], - match_mapping_type: 'string', - mapping: { - type: 'ip', - }, - }, - }, - { - ecs_wildcard: { - path_match: ['*.io.text', '*.message_id', '*registry.data.strings', '*url.path'], - unmatch_mapping_type: 'object', - mapping: { - type: 'wildcard', - }, - }, - }, - { - ecs_path_match_wildcard_and_match_only_text: { - path_match: ['*.body.content', '*url.full', '*url.original'], - unmatch_mapping_type: 'object', - mapping: { - fields: { - text: { - type: 'match_only_text', - }, - }, - type: 'wildcard', - }, - }, - }, - { - ecs_match_wildcard_and_match_only_text: { - match: ['*command_line', '*stack_trace'], - unmatch_mapping_type: 'object', - mapping: { - fields: { - text: { - type: 'match_only_text', - }, - }, - type: 'wildcard', - }, - }, - }, - { - ecs_path_match_keyword_and_match_only_text: { - path_match: [ - '*.title', - '*.executable', - '*.name', - '*.working_directory', - '*.full_name', - '*file.path', - '*file.target_path', - '*os.full', - 'email.subject', - 'vulnerability.description', - 'user_agent.original', - ], - unmatch_mapping_type: 'object', - mapping: { - fields: { - text: { - type: 'match_only_text', - }, - }, - type: 'keyword', - }, - }, - }, - { - ecs_date: { - path_match: [ - '*.timestamp', - '*_timestamp', - '*.not_after', - '*.not_before', - '*.accessed', - 'created', - '*.created', - '*.installed', - '*.creation_date', - '*.ctime', - '*.mtime', - 'ingested', - '*.ingested', - '*.start', - '*.end', - ], - unmatch_mapping_type: 'object', - mapping: { - type: 'date', - }, - }, - }, - { - ecs_path_match_float: { - path_match: ['*.score.*', '*_score*'], - path_unmatch: '*.version', - unmatch_mapping_type: 'object', - mapping: { - type: 'float', - }, - }, - }, - { - ecs_usage_double_scaled_float: { - path_match: '*.usage', - match_mapping_type: ['double', 'long', 'string'], - mapping: { - scaling_factor: 1000, - type: 'scaled_float', - }, - }, - }, - { - ecs_geo_point: { - path_match: '*.geo.location', - mapping: { - type: 'geo_point', - }, - }, - }, - { - ecs_flattened: { - path_match: ['*structured_data', '*exports', '*imports'], - match_mapping_type: 'object', - mapping: { - type: 'flattened', - }, - }, - }, - { - all_strings_to_keywords: { - match_mapping_type: 'string', - mapping: { - ignore_above: 1024, - type: 'keyword', - }, - }, - }, - { - strings_as_keyword: { - match_mapping_type: 'string', - mapping: { - ignore_above: 1024, - type: 'keyword', - }, - }, - }, - ], - date_detection: false, - properties: { - '@timestamp': { - type: 'date', - ignore_malformed: false, - }, - 'cloud.account.id': { - type: 'keyword', - ignore_above: 1024, - }, - 'cloud.availability_zone': { - type: 'keyword', - ignore_above: 1024, - }, - 'cloud.image.id': { - type: 'keyword', - ignore_above: 1024, - }, - 'cloud.instance.id': { - type: 'keyword', - ignore_above: 1024, - }, - 'cloud.instance.name': { - type: 'keyword', - fields: { - text: { - type: 'match_only_text', - }, - }, - }, - 'cloud.machine.type': { - type: 'keyword', - ignore_above: 1024, - }, - 'cloud.project.id': { - type: 'keyword', - ignore_above: 1024, - }, - 'cloud.provider': { - type: 'keyword', - ignore_above: 1024, - }, - 'cloud.region': { - type: 'keyword', - ignore_above: 1024, - }, - 'container.id': { - type: 'keyword', - ignore_above: 1024, - }, - 'container.image.name': { - type: 'keyword', - fields: { - text: { - type: 'match_only_text', - }, - }, - }, - 'container.labels.foo_id': { - type: 'keyword', - ignore_above: 1024, - }, - 'container.name': { - type: 'keyword', - fields: { - text: { - type: 'match_only_text', - }, - }, - }, - 'data_stream.dataset': { - type: 'constant_keyword', - }, - 'data_stream.namespace': { - type: 'constant_keyword', - }, - 'data_stream.type': { - type: 'constant_keyword', - value: 'logs', - }, - 'event.agent_id_status': { - type: 'keyword', - ignore_above: 1024, - }, - 'event.ingested': { - type: 'date', - format: 'strict_date_time_no_millis||strict_date_optional_time||epoch_millis', - ignore_malformed: false, - }, - 'host.architecture': { - type: 'keyword', - ignore_above: 1024, - }, - 'host.domain': { - type: 'keyword', - ignore_above: 1024, - }, - 'host.hostname': { - type: 'keyword', - ignore_above: 1024, - }, - 'host.id': { - type: 'keyword', - ignore_above: 1024, - }, - 'host.ip': { - type: 'ip', - }, - 'host.mac': { - type: 'keyword', - ignore_above: 1024, - }, - 'host.name': { - type: 'keyword', - fields: { - text: { - type: 'match_only_text', - }, - }, - }, - 'host.os.build': { - type: 'keyword', - ignore_above: 1024, - }, - 'host.os.codename': { - type: 'keyword', - ignore_above: 1024, - }, - 'host.os.containerized': { - type: 'boolean', - }, - 'host.os.family': { - type: 'keyword', - ignore_above: 1024, - }, - 'host.os.kernel': { - type: 'keyword', - ignore_above: 1024, - }, - 'host.os.name': { - type: 'keyword', - fields: { - text: { - type: 'match_only_text', - }, - }, - }, - 'host.os.platform': { - type: 'keyword', - ignore_above: 1024, - }, - 'host.os.type': { - type: 'keyword', - ignore_above: 1024, - }, - 'host.os.version': { - type: 'keyword', - ignore_above: 1024, - }, - 'input.type': { - type: 'keyword', - ignore_above: 1024, - }, - 'log.offset': { - type: 'long', - }, - }, + expect(Object.values(response)[0].mappings._meta).to.eql({ + managed_by: 'fleet', + managed: true, + package: { name: INTEGRATION_NAME }, }); }); diff --git a/x-pack/test/functional/apps/managed_content/managed_content.ts b/x-pack/test/functional/apps/managed_content/managed_content.ts index 1bee3acd761bb..2b3b19af4da34 100644 --- a/x-pack/test/functional/apps/managed_content/managed_content.ts +++ b/x-pack/test/functional/apps/managed_content/managed_content.ts @@ -26,8 +26,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const listingTable = getService('listingTable'); const log = getService('log'); - // Failing: See https://github.com/elastic/kibana/issues/177551 - describe.skip('Managed Content', () => { + describe('Managed Content', () => { before(async () => { esArchiver.load('x-pack/test/functional/es_archives/logstash_functional'); kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/managed_content'); @@ -55,7 +54,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('lens', async () => { await PageObjects.common.navigateToActualUrl( 'lens', - 'edit/managed-36db-4a3b-a4ba-7a64ab8f130b' + '/edit/managed-36db-4a3b-a4ba-7a64ab8f130b' ); await PageObjects.lens.waitForVisualization('xyVisChart'); @@ -64,7 +63,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await PageObjects.common.navigateToActualUrl( 'lens', - 'edit/unmanaged-36db-4a3b-a4ba-7a64ab8f130b' + '/edit/unmanaged-36db-4a3b-a4ba-7a64ab8f130b' ); await PageObjects.lens.waitForVisualization('xyVisChart'); @@ -72,11 +71,10 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await expectManagedContentSignifiers(false, 'lnsApp_saveButton'); }); - // FLAKY: https://github.com/elastic/kibana/issues/178920 - it.skip('discover', async () => { + it('discover', async () => { await PageObjects.common.navigateToActualUrl( 'discover', - 'view/managed-3d62-4113-ac7c-de2e20a68fbc' + '/view/managed-3d62-4113-ac7c-de2e20a68fbc' ); await PageObjects.discover.waitForDiscoverAppOnScreen(); @@ -84,7 +82,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await PageObjects.common.navigateToActualUrl( 'discover', - 'view/unmanaged-3d62-4113-ac7c-de2e20a68fbc' + '/view/unmanaged-3d62-4113-ac7c-de2e20a68fbc' ); await PageObjects.discover.waitForDiscoverAppOnScreen(); @@ -94,7 +92,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('visualize', async () => { await PageObjects.common.navigateToActualUrl( 'visualize', - 'edit/managed-feb9-4ba6-9538-1b8f67fb4f57' + '/edit/managed-feb9-4ba6-9538-1b8f67fb4f57' ); await PageObjects.visChart.waitForVisualization(); @@ -102,7 +100,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await PageObjects.common.navigateToActualUrl( 'visualize', - 'edit/unmanaged-feb9-4ba6-9538-1b8f67fb4f57' + '/edit/unmanaged-feb9-4ba6-9538-1b8f67fb4f57' ); await PageObjects.visChart.waitForVisualization(); @@ -147,20 +145,17 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); }); - describe('managed panels in dashboards', () => { + // unskip with https://github.com/elastic/kibana/issues/190138 fix + describe.skip('managed panels in dashboards', () => { it('inlines panels when managed dashboard cloned', async () => { await PageObjects.common.navigateToActualUrl( 'dashboard', - 'view/c44c86f9-b105-4a9c-9a24-449a58a827f3', - // for some reason the URL didn't always match the expected, so I turned off this check - // URL doesn't matter as long as we get the dashboard app - { ensureCurrentUrl: false } + '/view/c44c86f9-b105-4a9c-9a24-449a58a827f3' ); await PageObjects.dashboard.waitForRenderComplete(); await PageObjects.dashboard.duplicateDashboard(); - await PageObjects.dashboard.waitForRenderComplete(); await testSubjects.missingOrFail('embeddablePanelNotification-ACTION_LIBRARY_NOTIFICATION'); @@ -177,7 +172,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { { name: 'Managed map', type: 'map' }, { name: 'Managed saved search', type: 'search' }, ]); - await testSubjects.missingOrFail('embeddablePanelNotification-ACTION_LIBRARY_NOTIFICATION'); await dashboardAddPanel.addEmbeddables([ diff --git a/x-pack/test/functional_with_es_ssl/apps/discover_ml_uptime/discover/search_source_alert.ts b/x-pack/test/functional_with_es_ssl/apps/discover_ml_uptime/discover/search_source_alert.ts index 314bc202a6268..ece232dae39a8 100644 --- a/x-pack/test/functional_with_es_ssl/apps/discover_ml_uptime/discover/search_source_alert.ts +++ b/x-pack/test/functional_with_es_ssl/apps/discover_ml_uptime/discover/search_source_alert.ts @@ -196,6 +196,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const getResultsLink = async () => { // getting the link await dataGrid.clickRowToggle(); + await testSubjects.click('toggleLongFieldValue-context_link'); const contextMessageElement = await testSubjects.find('tableDocViewRow-context_link-value'); const contextMessage = await contextMessageElement.getVisibleText(); diff --git a/x-pack/test/security_functional/tests/login_selector/basic_functionality.ts b/x-pack/test/security_functional/tests/login_selector/basic_functionality.ts index 5e55f216eb800..fc808b4c33cbd 100644 --- a/x-pack/test/security_functional/tests/login_selector/basic_functionality.ts +++ b/x-pack/test/security_functional/tests/login_selector/basic_functionality.ts @@ -132,11 +132,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { full_name: 'Guest', }); await PageObjects.security.loginSelector.login('anonymous', 'anonymous1'); - await security.user.delete('anonymous_user'); // We need to make sure that both path and hash are respected. const currentURL = parse(await browser.getCurrentUrl()); expect(currentURL.pathname).to.eql('/app/management/security/users'); + + await security.user.delete('anonymous_user'); }); it('can login after `Unauthorized` error after request authentication preserving original URL', async () => { diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/index.ts index 8266fba86a099..4c8efcfa751e0 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/index.ts @@ -21,6 +21,7 @@ export default ({ loadTestFile }: FtrProviderContext): void => { loadTestFile(require.resolve('./upgrade_review_prebuilt_rules.single_line_string_fields')); loadTestFile(require.resolve('./upgrade_review_prebuilt_rules.scalar_array_fields')); loadTestFile(require.resolve('./upgrade_review_prebuilt_rules.multi_line_string_fields')); + loadTestFile(require.resolve('./upgrade_review_prebuilt_rules.data_source_fields')); loadTestFile(require.resolve('./upgrade_review_prebuilt_rules.stats')); }); }; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.data_source_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.data_source_fields.ts new file mode 100644 index 0000000000000..f3b009a8ade47 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_review_prebuilt_rules.data_source_fields.ts @@ -0,0 +1,972 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import expect from 'expect'; +import { + AllFieldsDiff, + DataSourceType, + RuleUpdateProps, + ThreeWayDiffConflict, + ThreeWayDiffOutcome, + ThreeWayMergeOutcome, +} from '@kbn/security-solution-plugin/common/api/detection_engine'; +import { getPrebuiltRuleMock } from '@kbn/security-solution-plugin/server/lib/detection_engine/prebuilt_rules/mocks'; +import { FtrProviderContext } from '../../../../../../ftr_provider_context'; +import { + deleteAllTimelines, + deleteAllPrebuiltRuleAssets, + createRuleAssetSavedObject, + installPrebuiltRules, + createPrebuiltRuleAssetSavedObjects, + reviewPrebuiltRulesToUpgrade, + createHistoricalPrebuiltRuleAssetSavedObjects, + updateRule, + patchRule, +} from '../../../../utils'; +import { deleteAllRules } from '../../../../../../../common/utils/security_solution'; + +export default ({ getService }: FtrProviderContext): void => { + const es = getService('es'); + const supertest = getService('supertest'); + const log = getService('log'); + + describe('@ess @serverless @skipInServerlessMKI review prebuilt rules updates from package with mock rule assets', () => { + beforeEach(async () => { + await deleteAllRules(supertest, log); + await deleteAllTimelines(es, log); + await deleteAllPrebuiltRuleAssets(es, log); + }); + + describe(`data_source fields`, () => { + const getIndexRuleAssetSavedObjects = () => [ + createRuleAssetSavedObject({ + rule_id: 'rule-1', + version: 1, + index: ['one', 'two', 'three'], + }), + ]; + + const getDataViewIdRuleAssetSavedObjects = () => [ + createRuleAssetSavedObject({ + rule_id: 'rule-1', + version: 1, + data_view_id: 'A', + }), + ]; + + describe("when rule field doesn't have an update and has no custom value - scenario AAA", () => { + describe('when all versions are index patterns', () => { + it('should not show in the upgrade/_review API response', async () => { + // Install base prebuilt detection rule + await createHistoricalPrebuiltRuleAssetSavedObjects( + es, + getIndexRuleAssetSavedObjects() + ); + await installPrebuiltRules(es, supertest); + + // Increment the version of the installed rule, do NOT update the related data_source field, and create the new rule assets + const updatedRuleAssetSavedObjects = [ + createRuleAssetSavedObject({ + rule_id: 'rule-1', + index: ['one', 'three', 'two'], + version: 2, + }), + ]; + await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); + + // Call the upgrade review prebuilt rules endpoint and check that there is 1 rule eligable for update but data_source field is NOT returned + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + const fieldDiffObject = reviewResponse.rules[0].diff.fields as AllFieldsDiff; + expect(fieldDiffObject.data_source).toBeUndefined(); + + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); + }); + }); + + describe('when all versions are data view id', () => { + it('should not show in the upgrade/_review API response', async () => { + // Install base prebuilt detection rule + await createHistoricalPrebuiltRuleAssetSavedObjects( + es, + getDataViewIdRuleAssetSavedObjects() + ); + await installPrebuiltRules(es, supertest); + + // Increment the version of the installed rule, do NOT update the related data_source field, and create the new rule assets + const updatedRuleAssetSavedObjects = [ + createRuleAssetSavedObject({ + rule_id: 'rule-1', + data_view_id: 'A', + version: 2, + }), + ]; + await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); + + // Call the upgrade review prebuilt rules endpoint and check that there is 1 rule eligable for update but data_source field is NOT returned + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + const fieldDiffObject = reviewResponse.rules[0].diff.fields as AllFieldsDiff; + expect(fieldDiffObject.data_source).toBeUndefined(); + + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); + }); + }); + }); + + describe("when rule field doesn't have an update but has a custom value - scenario ABA", () => { + describe('when current version is index pattern type', () => { + it('should show in the upgrade/_review API response', async () => { + // Install base prebuilt detection rule + await createHistoricalPrebuiltRuleAssetSavedObjects( + es, + getDataViewIdRuleAssetSavedObjects() + ); + await installPrebuiltRules(es, supertest); + + // Customize a data_source field on the installed rule + await updateRule(supertest, { + ...getPrebuiltRuleMock(), + rule_id: 'rule-1', + index: ['one', 'two', 'four'], + data_view_id: undefined, + } as RuleUpdateProps); + + // Increment the version of the installed rule, do NOT update the related data_source field, and create the new rule assets + const updatedRuleAssetSavedObjects = [ + createRuleAssetSavedObject({ + rule_id: 'rule-1', + data_view_id: 'A', + version: 2, + }), + ]; + await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); + + // Call the upgrade review prebuilt rules endpoint and check that data_source diff field is returned but field does not have an update + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + const fieldDiffObject = reviewResponse.rules[0].diff.fields as AllFieldsDiff; + expect(fieldDiffObject.data_source).toEqual({ + base_version: { + data_view_id: 'A', + type: DataSourceType.data_view, + }, + current_version: { + index_patterns: ['one', 'two', 'four'], + type: DataSourceType.index_patterns, + }, + target_version: { + data_view_id: 'A', + type: DataSourceType.data_view, + }, + merged_version: { + index_patterns: ['one', 'two', 'four'], + type: DataSourceType.index_patterns, + }, + diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NONE, + has_update: false, + has_base_version: true, + }); + + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); + }); + }); + + describe('when current version is data view id type', () => { + it('should show in the upgrade/_review API response', async () => { + // Install base prebuilt detection rule + await createHistoricalPrebuiltRuleAssetSavedObjects( + es, + getIndexRuleAssetSavedObjects() + ); + await installPrebuiltRules(es, supertest); + + // Customize a data_source field on the installed rule + await updateRule(supertest, { + ...getPrebuiltRuleMock(), + rule_id: 'rule-1', + index: undefined, + data_view_id: 'B', + } as RuleUpdateProps); + + // Increment the version of the installed rule, do NOT update the related data_source field, and create the new rule assets + const updatedRuleAssetSavedObjects = [ + createRuleAssetSavedObject({ + rule_id: 'rule-1', + index: ['one', 'two', 'three'], + version: 2, + }), + ]; + await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); + + // Call the upgrade review prebuilt rules endpoint and check that data_source diff field is returned but field does not have an update + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + const fieldDiffObject = reviewResponse.rules[0].diff.fields as AllFieldsDiff; + expect(fieldDiffObject.data_source).toEqual({ + base_version: { + index_patterns: ['one', 'two', 'three'], + type: DataSourceType.index_patterns, + }, + current_version: { + data_view_id: 'B', + type: DataSourceType.data_view, + }, + target_version: { + index_patterns: ['one', 'two', 'three'], + type: DataSourceType.index_patterns, + }, + merged_version: { + data_view_id: 'B', + type: DataSourceType.data_view, + }, + diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NONE, + has_update: false, + has_base_version: true, + }); + + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); + }); + }); + + describe('when current version is undefined', () => { + it('should show in the upgrade/_review API response', async () => { + // Install base prebuilt detection rule + await createHistoricalPrebuiltRuleAssetSavedObjects( + es, + getIndexRuleAssetSavedObjects() + ); + await installPrebuiltRules(es, supertest); + + // Customize a data_source field on the installed rule + await updateRule(supertest, { + ...getPrebuiltRuleMock(), + rule_id: 'rule-1', + index: undefined, + } as RuleUpdateProps); + + // Increment the version of the installed rule, do NOT update the related data_source field, and create the new rule assets + const updatedRuleAssetSavedObjects = [ + createRuleAssetSavedObject({ + rule_id: 'rule-1', + index: ['one', 'two', 'three'], + version: 2, + }), + ]; + await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); + + // Call the upgrade review prebuilt rules endpoint and check that data_source diff field is returned but field does not have an update + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + const fieldDiffObject = reviewResponse.rules[0].diff.fields as AllFieldsDiff; + expect(fieldDiffObject.data_source).toEqual({ + base_version: { + index_patterns: ['one', 'two', 'three'], + type: DataSourceType.index_patterns, + }, + current_version: undefined, + target_version: { + index_patterns: ['one', 'two', 'three'], + type: DataSourceType.index_patterns, + }, + merged_version: undefined, + diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NONE, + has_update: false, + has_base_version: true, + }); + + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); + }); + }); + }); + + describe('when rule field has an update but does not have a custom value - scenario AAB', () => { + describe('when target version is index pattern type', () => { + it('should show in the upgrade/_review API response', async () => { + // Install base prebuilt detection rule + await createHistoricalPrebuiltRuleAssetSavedObjects( + es, + getDataViewIdRuleAssetSavedObjects() + ); + await installPrebuiltRules(es, supertest); + + // Increment the version of the installed rule, update a data_source field, and create the new rule assets + const updatedRuleAssetSavedObjects = [ + createRuleAssetSavedObject({ + rule_id: 'rule-1', + version: 2, + index: ['one', 'two', 'four'], + }), + ]; + await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); + + // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + const fieldDiffObject = reviewResponse.rules[0].diff.fields as AllFieldsDiff; + expect(fieldDiffObject.data_source).toEqual({ + base_version: { + data_view_id: 'A', + type: DataSourceType.data_view, + }, + current_version: { + data_view_id: 'A', + type: DataSourceType.data_view, + }, + target_version: { + index_patterns: ['one', 'two', 'four'], + type: DataSourceType.index_patterns, + }, + merged_version: { + index_patterns: ['one', 'two', 'four'], + type: DataSourceType.index_patterns, + }, + diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.NONE, + has_update: true, + has_base_version: true, + }); + + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); + }); + }); + + describe('when target version is data view id type', () => { + it('should show in the upgrade/_review API response', async () => { + // Install base prebuilt detection rule + await createHistoricalPrebuiltRuleAssetSavedObjects( + es, + getIndexRuleAssetSavedObjects() + ); + await installPrebuiltRules(es, supertest); + + // Increment the version of the installed rule, update a data_source field, and create the new rule assets + const updatedRuleAssetSavedObjects = [ + createRuleAssetSavedObject({ + rule_id: 'rule-1', + version: 2, + data_view_id: 'B', + }), + ]; + await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); + + // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + const fieldDiffObject = reviewResponse.rules[0].diff.fields as AllFieldsDiff; + expect(fieldDiffObject.data_source).toEqual({ + base_version: { + index_patterns: ['one', 'two', 'three'], + type: DataSourceType.index_patterns, + }, + current_version: { + index_patterns: ['one', 'two', 'three'], + type: DataSourceType.index_patterns, + }, + target_version: { + data_view_id: 'B', + type: DataSourceType.data_view, + }, + merged_version: { + data_view_id: 'B', + type: DataSourceType.data_view, + }, + diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.NONE, + has_update: true, + has_base_version: true, + }); + + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); + }); + }); + }); + + describe('when rule field has an update and a custom value that are the same - scenario ABB', () => { + describe('when current and target version are index pattern type', () => { + it('should show in the upgrade/_review API response', async () => { + // Install base prebuilt detection rule + await createHistoricalPrebuiltRuleAssetSavedObjects( + es, + getDataViewIdRuleAssetSavedObjects() + ); + await installPrebuiltRules(es, supertest); + + // Customize a data_source field on the installed rule + await updateRule(supertest, { + ...getPrebuiltRuleMock(), + rule_id: 'rule-1', + index: ['one', 'two', 'four'], + data_view_id: undefined, + } as RuleUpdateProps); + + // Increment the version of the installed rule, update a data_source field, and create the new rule assets + const updatedRuleAssetSavedObjects = [ + createRuleAssetSavedObject({ + rule_id: 'rule-1', + version: 2, + index: ['one', 'two', 'four'], + }), + ]; + await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); + + // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update and contains data_source field + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + const fieldDiffObject = reviewResponse.rules[0].diff.fields as AllFieldsDiff; + expect(fieldDiffObject.data_source).toEqual({ + base_version: { + data_view_id: 'A', + type: DataSourceType.data_view, + }, + current_version: { + index_patterns: ['one', 'two', 'four'], + type: DataSourceType.index_patterns, + }, + target_version: { + index_patterns: ['one', 'two', 'four'], + type: DataSourceType.index_patterns, + }, + merged_version: { + index_patterns: ['one', 'two', 'four'], + type: DataSourceType.index_patterns, + }, + diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NONE, + has_update: false, + has_base_version: true, + }); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); + }); + }); + + describe('when current and target version are data view id type', () => { + it('should show in the upgrade/_review API response', async () => { + // Install base prebuilt detection rule + await createHistoricalPrebuiltRuleAssetSavedObjects( + es, + getIndexRuleAssetSavedObjects() + ); + await installPrebuiltRules(es, supertest); + + // Customize a data_source field on the installed rule + await updateRule(supertest, { + ...getPrebuiltRuleMock(), + rule_id: 'rule-1', + index: undefined, + data_view_id: 'B', + } as RuleUpdateProps); + + // Increment the version of the installed rule, update a data_source field, and create the new rule assets + const updatedRuleAssetSavedObjects = [ + createRuleAssetSavedObject({ + rule_id: 'rule-1', + version: 2, + data_view_id: 'B', + }), + ]; + await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); + + // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update and contains data_source field + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + const fieldDiffObject = reviewResponse.rules[0].diff.fields as AllFieldsDiff; + expect(fieldDiffObject.data_source).toEqual({ + base_version: { + index_patterns: ['one', 'two', 'three'], + type: DataSourceType.index_patterns, + }, + current_version: { + data_view_id: 'B', + type: DataSourceType.data_view, + }, + target_version: { + data_view_id: 'B', + type: DataSourceType.data_view, + }, + merged_version: { + data_view_id: 'B', + type: DataSourceType.data_view, + }, + diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NONE, + has_update: false, + has_base_version: true, + }); + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(0); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(0); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); + }); + }); + }); + + describe('when rule field has an update and a custom value that are different - scenario ABC', () => { + describe('when just current and target versions are index patterns', () => { + it('should show a solvable conflict in the upgrade/_review API response', async () => { + // Install base prebuilt detection rule + await createHistoricalPrebuiltRuleAssetSavedObjects( + es, + getDataViewIdRuleAssetSavedObjects() + ); + await installPrebuiltRules(es, supertest); + + // Customize a data_source field on the installed rule + await updateRule(supertest, { + ...getPrebuiltRuleMock(), + rule_id: 'rule-1', + index: ['one', 'one', 'two', 'three'], + data_view_id: undefined, + } as RuleUpdateProps); + + // Increment the version of the installed rule, update a data_source field, and create the new rule assets + const updatedRuleAssetSavedObjects = [ + createRuleAssetSavedObject({ + rule_id: 'rule-1', + version: 2, + index: ['one', 'two', 'five'], + }), + ]; + await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); + + // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update + // and data_source field update has conflict + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + const fieldDiffObject = reviewResponse.rules[0].diff.fields as AllFieldsDiff; + expect(fieldDiffObject.data_source).toEqual({ + base_version: { + data_view_id: 'A', + type: DataSourceType.data_view, + }, + current_version: { + index_patterns: ['one', 'one', 'two', 'three'], + type: DataSourceType.index_patterns, + }, + target_version: { + index_patterns: ['one', 'two', 'five'], + type: DataSourceType.index_patterns, + }, + merged_version: { + index_patterns: ['one', 'two', 'three', 'five'], + type: DataSourceType.index_patterns, + }, + diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Merged, + conflict: ThreeWayDiffConflict.SOLVABLE, + has_update: true, + has_base_version: true, + }); + + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(1); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); + }); + }); + + describe('when all versions are index patterns', () => { + it('should show a solvable conflict in the upgrade/_review API response', async () => { + // Install base prebuilt detection rule + await createHistoricalPrebuiltRuleAssetSavedObjects( + es, + getIndexRuleAssetSavedObjects() + ); + await installPrebuiltRules(es, supertest); + + // Customize a multi line string field on the installed rule + await patchRule(supertest, log, { + rule_id: 'rule-1', + index: ['one', 'two', 'four'], + }); + + // Increment the version of the installed rule, update a data_source field, and create the new rule assets + const updatedRuleAssetSavedObjects = [ + createRuleAssetSavedObject({ + rule_id: 'rule-1', + version: 2, + index: ['one', 'two', 'five'], + }), + ]; + await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); + + // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update + // and data_source field update has conflict + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + const fieldDiffObject = reviewResponse.rules[0].diff.fields as AllFieldsDiff; + expect(fieldDiffObject.data_source).toEqual({ + base_version: { + index_patterns: ['one', 'two', 'three'], + type: DataSourceType.index_patterns, + }, + current_version: { + index_patterns: ['one', 'two', 'four'], + type: DataSourceType.index_patterns, + }, + target_version: { + index_patterns: ['one', 'two', 'five'], + type: DataSourceType.index_patterns, + }, + merged_version: { + index_patterns: ['one', 'two', 'four', 'five'], + type: DataSourceType.index_patterns, + }, + diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Merged, + conflict: ThreeWayDiffConflict.SOLVABLE, + has_update: true, + has_base_version: true, + }); + + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(1); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); + }); + }); + + describe('when all versions are data view id types', () => { + it('should show a non-solvable conflict in the upgrade/_review API response', async () => { + // Install base prebuilt detection rule + await createHistoricalPrebuiltRuleAssetSavedObjects( + es, + getDataViewIdRuleAssetSavedObjects() + ); + await installPrebuiltRules(es, supertest); + + // Customize a data_source field on the installed rule + await updateRule(supertest, { + ...getPrebuiltRuleMock(), + rule_id: 'rule-1', + index: undefined, + data_view_id: 'B', + } as RuleUpdateProps); + + // Increment the version of the installed rule, update a data_source field, and create the new rule assets + const updatedRuleAssetSavedObjects = [ + createRuleAssetSavedObject({ + rule_id: 'rule-1', + version: 2, + data_view_id: 'C', + }), + ]; + await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); + + // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update + // and data_source field update has conflict + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + const fieldDiffObject = reviewResponse.rules[0].diff.fields as AllFieldsDiff; + expect(fieldDiffObject.data_source).toEqual({ + base_version: { + data_view_id: 'A', + type: DataSourceType.data_view, + }, + current_version: { + data_view_id: 'B', + type: DataSourceType.data_view, + }, + target_version: { + data_view_id: 'C', + type: DataSourceType.data_view, + }, + merged_version: { + data_view_id: 'B', + type: DataSourceType.data_view, + }, + diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NON_SOLVABLE, + has_update: true, + has_base_version: true, + }); + + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(1); + + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(1); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(1); + }); + }); + + describe('when current and target versions are different data types', () => { + it('should show a non-solvable conflict in the upgrade/_review API response', async () => { + // Install base prebuilt detection rule + await createHistoricalPrebuiltRuleAssetSavedObjects( + es, + getDataViewIdRuleAssetSavedObjects() + ); + await installPrebuiltRules(es, supertest); + + // Customize a data_source field on the installed rule + await updateRule(supertest, { + ...getPrebuiltRuleMock(), + rule_id: 'rule-1', + index: ['one', 'two', 'four'], + data_view_id: undefined, + } as RuleUpdateProps); + + // Increment the version of the installed rule, update a data_source field, and create the new rule assets + const updatedRuleAssetSavedObjects = [ + createRuleAssetSavedObject({ + rule_id: 'rule-1', + version: 2, + data_view_id: 'C', + }), + ]; + await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); + + // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update + // and data_source field update has conflict + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + const fieldDiffObject = reviewResponse.rules[0].diff.fields as AllFieldsDiff; + expect(fieldDiffObject.data_source).toEqual({ + base_version: { + data_view_id: 'A', + type: DataSourceType.data_view, + }, + current_version: { + index_patterns: ['one', 'two', 'four'], + type: DataSourceType.index_patterns, + }, + target_version: { + data_view_id: 'C', + type: DataSourceType.data_view, + }, + merged_version: { + index_patterns: ['one', 'two', 'four'], + type: DataSourceType.index_patterns, + }, + diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NON_SOLVABLE, + has_update: true, + has_base_version: true, + }); + + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(1); + + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(1); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(1); + }); + }); + + describe('when current version is undefined', () => { + it('should show a non-solvable conflict in the upgrade/_review API response', async () => { + // Install base prebuilt detection rule + await createHistoricalPrebuiltRuleAssetSavedObjects( + es, + getDataViewIdRuleAssetSavedObjects() + ); + await installPrebuiltRules(es, supertest); + + // Customize a data_source field on the installed rule + await updateRule(supertest, { + ...getPrebuiltRuleMock(), + rule_id: 'rule-1', + data_view_id: undefined, + } as RuleUpdateProps); + + // Increment the version of the installed rule, update a data_source field, and create the new rule assets + const updatedRuleAssetSavedObjects = [ + createRuleAssetSavedObject({ + rule_id: 'rule-1', + version: 2, + data_view_id: 'C', + }), + ]; + await createHistoricalPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); + + // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update + // and data_source field update has conflict + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + const fieldDiffObject = reviewResponse.rules[0].diff.fields as AllFieldsDiff; + expect(fieldDiffObject.data_source).toEqual({ + base_version: { + data_view_id: 'A', + type: DataSourceType.data_view, + }, + current_version: undefined, + target_version: { + data_view_id: 'C', + type: DataSourceType.data_view, + }, + merged_version: undefined, + diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Current, + conflict: ThreeWayDiffConflict.NON_SOLVABLE, + has_update: true, + has_base_version: true, + }); + + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(1); + + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(1); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(1); + }); + }); + }); + + describe('when rule base version does not exist', () => { + describe('when rule field has an update and a custom value that are the same - scenario -AA', () => { + it('should not show in the upgrade/_review API response', async () => { + // Install base prebuilt detection rule + await createPrebuiltRuleAssetSavedObjects(es, getIndexRuleAssetSavedObjects()); + await installPrebuiltRules(es, supertest); + + // Clear previous rule assets + await deleteAllPrebuiltRuleAssets(es, log); + + // Increment the version of the installed rule, but keep data_source field unchanged + const updatedRuleAssetSavedObjects = [ + createRuleAssetSavedObject({ + rule_id: 'rule-1', + version: 2, + index: ['one', 'two', 'three'], // unchanged + }), + ]; + await createPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); + + // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update + // but does NOT contain data_source field (tags is not present, since scenario -AA is not included in response) + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + const fieldDiffObject = reviewResponse.rules[0].diff.fields as AllFieldsDiff; + expect(fieldDiffObject.data_source).toBeUndefined(); + + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(1); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(1); // version is considered conflict + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(1); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); + }); + }); + + describe('when rule field has an update and a custom value that are different - scenario -AB', () => { + it('should show in the upgrade/_review API response', async () => { + // Install base prebuilt detection rule + await createPrebuiltRuleAssetSavedObjects(es, getIndexRuleAssetSavedObjects()); + await installPrebuiltRules(es, supertest); + + // Clear previous rule assets + await deleteAllPrebuiltRuleAssets(es, log); + + // Customize a data_source field on the installed rule + await updateRule(supertest, { + ...getPrebuiltRuleMock(), + rule_id: 'rule-1', + index: ['one', 'two', 'four'], + data_view_id: undefined, + } as RuleUpdateProps); + + // Increment the version of the installed rule, update a data_source field, and create the new rule assets + const updatedRuleAssetSavedObjects = [ + createRuleAssetSavedObject({ + rule_id: 'rule-1', + version: 2, + index: ['one', 'two', 'five'], + }), + ]; + await createPrebuiltRuleAssetSavedObjects(es, updatedRuleAssetSavedObjects); + + // Call the upgrade review prebuilt rules endpoint and check that one rule is eligible for update + // and data_source field update does not have a conflict + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + const fieldDiffObject = reviewResponse.rules[0].diff.fields as AllFieldsDiff; + expect(fieldDiffObject.data_source).toEqual({ + current_version: { + index_patterns: ['one', 'two', 'four'], + type: DataSourceType.index_patterns, + }, + target_version: { + index_patterns: ['one', 'two', 'five'], + type: DataSourceType.index_patterns, + }, + merged_version: { + index_patterns: ['one', 'two', 'five'], + type: DataSourceType.index_patterns, + }, + diff_outcome: ThreeWayDiffOutcome.MissingBaseCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.SOLVABLE, + has_update: true, + has_base_version: false, + }); + + expect(reviewResponse.rules[0].diff.num_fields_with_updates).toBe(2); + expect(reviewResponse.rules[0].diff.num_fields_with_conflicts).toBe(2); // version + tags + expect(reviewResponse.rules[0].diff.num_fields_with_non_solvable_conflicts).toBe(0); + + expect(reviewResponse.stats.num_rules_to_upgrade_total).toBe(1); + expect(reviewResponse.stats.num_rules_with_conflicts).toBe(1); + expect(reviewResponse.stats.num_rules_with_non_solvable_conflicts).toBe(0); + }); + }); + }); + }); + }); +}; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_charts.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_charts.cy.ts index c1db8eb2b44d1..509ba40e57fc3 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_charts.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_charts.cy.ts @@ -6,13 +6,30 @@ */ import { getNewRule } from '../../../objects/rule'; -import { ALERTS_COUNT } from '../../../screens/alerts'; +import { + ALERT_SUMMARY_CHARTS, + SELECT_OVERVIEW_CHARTS, + SELECT_HISTOGRAM, + SELECT_COUNTS_TABLE, + SELECT_TREEMAP, + ALERT_SUMMARY_SEVERITY_DONUT_CHART, + ALERT_SUMMARY_RULES_TABLE, + ALERT_SUMMARY_PROGRESS_BAR_CHARTS, + ALERTS_HISTOGRAM, + ALERT_COUNT_TABLE, + ALERT_TREEMAP, + ALERTS_COUNT, + ALERT_SUMMARY_CHARTS_COLLAPSED, +} from '../../../screens/alerts'; import { clickAlertsHistogramLegend, clickAlertsHistogramLegendAddToTimeline, clickAlertsHistogramLegendFilterFor, clickAlertsHistogramLegendFilterOut, selectAlertsHistogram, + selectAlertsCountTable, + selectAlertsTreemap, + toggleKPICharts, } from '../../../tasks/alerts'; import { createRule } from '../../../tasks/api_calls/rules'; import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; @@ -25,45 +42,100 @@ import { } from '../../../screens/search_bar'; import { TOASTER } from '../../../screens/alerts_detection_rules'; -describe('Histogram legend hover actions', { tags: ['@ess', '@serverless'] }, () => { +describe('KPI visualizations in Alerts Page', { tags: ['@ess', '@serverless'] }, () => { const ruleConfigs = getNewRule(); - beforeEach(() => { deleteAlertsAndRules(); login(); createRule(getNewRule({ rule_id: 'new custom rule' })); visitWithTimeRange(ALERTS_URL); - selectAlertsHistogram(); }); - it('should should add a filter in to KQL bar', () => { - const expectedNumberOfAlerts = 1; - clickAlertsHistogramLegend(); - clickAlertsHistogramLegendFilterFor(ruleConfigs.name); - cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should( - 'have.text', - `kibana.alert.rule.name: ${ruleConfigs.name}` - ); - cy.get(ALERTS_COUNT).should('have.text', `${expectedNumberOfAlerts} alert`); - }); + context('KPI viz navigation', () => { + it('should navigate through clicking chart names', () => { + cy.log('should display summary charts by default'); + + cy.get(ALERT_SUMMARY_CHARTS).should('exist'); + cy.get(ALERT_SUMMARY_CHARTS_COLLAPSED).should('not.exist'); + cy.get(SELECT_OVERVIEW_CHARTS).should('have.class', 'euiButtonGroupButton-isSelected'); + + cy.get(ALERT_SUMMARY_SEVERITY_DONUT_CHART).should('exist'); + cy.get(ALERT_SUMMARY_RULES_TABLE).should('exist'); + cy.get(ALERT_SUMMARY_PROGRESS_BAR_CHARTS).should('exist'); + + cy.log('should display histogram charts when clicking trend button'); + + selectAlertsHistogram(); + cy.get(SELECT_HISTOGRAM).should('have.class', 'euiButtonGroupButton-isSelected'); + cy.get(ALERT_SUMMARY_CHARTS).should('not.exist'); + cy.get(ALERTS_HISTOGRAM).should('exist'); + + cy.log('should display table charts when clicking table button'); + + selectAlertsCountTable(); + cy.get(ALERT_COUNT_TABLE).should('exist'); + cy.get(SELECT_COUNTS_TABLE).should('have.class', 'euiButtonGroupButton-isSelected'); + + cy.log('should display treemap charts when clicking treemap button'); - it('should add a filter out to KQL bar', () => { - clickAlertsHistogramLegend(); - clickAlertsHistogramLegendFilterOut(ruleConfigs.name); - cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should( - 'have.text', - `NOT kibana.alert.rule.name: ${ruleConfigs.name}` - ); - cy.get(ALERTS_COUNT).should('not.exist'); - - cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM_DELETE).click(); - cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should('not.exist'); + selectAlertsTreemap(); + cy.get(ALERT_TREEMAP).should('exist'); + cy.get(SELECT_TREEMAP).should('have.class', 'euiButtonGroupButton-isSelected'); + }); + + it('should display/hide collapsed chart when clicking on the toggle', () => { + cy.log('should display summary charts by default'); + + cy.get(ALERT_SUMMARY_CHARTS_COLLAPSED).should('not.exist'); + cy.get(ALERT_SUMMARY_SEVERITY_DONUT_CHART).should('exist'); + + cy.log('should display collapsed summary when clicking toggle button'); + + toggleKPICharts(); + cy.get(ALERT_SUMMARY_CHARTS_COLLAPSED).should('exist'); + cy.get(ALERT_SUMMARY_SEVERITY_DONUT_CHART).should('not.exist'); + + cy.log('should display summary when clicking toggle button again'); + + toggleKPICharts(); + cy.get(ALERT_SUMMARY_CHARTS_COLLAPSED).should('not.exist'); + cy.get(ALERT_SUMMARY_SEVERITY_DONUT_CHART).should('exist'); + }); }); - it('should add To Timeline', () => { - clickAlertsHistogramLegend(); - clickAlertsHistogramLegendAddToTimeline(ruleConfigs.name); + context('Histogram legend hover actions', () => { + it('should should add a filter in to KQL bar', () => { + selectAlertsHistogram(); + const expectedNumberOfAlerts = 1; + clickAlertsHistogramLegend(); + clickAlertsHistogramLegendFilterFor(ruleConfigs.name); + cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should( + 'have.text', + `kibana.alert.rule.name: ${ruleConfigs.name}` + ); + cy.get(ALERTS_COUNT).should('have.text', `${expectedNumberOfAlerts} alert`); + }); + + it('should add a filter out to KQL bar', () => { + selectAlertsHistogram(); + clickAlertsHistogramLegend(); + clickAlertsHistogramLegendFilterOut(ruleConfigs.name); + cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should( + 'have.text', + `NOT kibana.alert.rule.name: ${ruleConfigs.name}` + ); + cy.get(ALERTS_COUNT).should('not.exist'); + + cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM_DELETE).click(); + cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should('not.exist'); + }); + + it('should add To Timeline', () => { + selectAlertsHistogram(); + clickAlertsHistogramLegend(); + clickAlertsHistogramLegendAddToTimeline(ruleConfigs.name); - cy.get(TOASTER).should('have.text', `Added ${ruleConfigs.name} to timeline`); + cy.get(TOASTER).should('have.text', `Added ${ruleConfigs.name} to timeline`); + }); }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/changing_alert_status.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/changing_alert_status.cy.ts index fe8a63efb1102..faf268f476652 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/changing_alert_status.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/changing_alert_status.cy.ts @@ -26,7 +26,7 @@ import { goToOpenedAlerts, openAlerts, openFirstAlert, - selectCountTable, + selectAlertsCountTable, waitForPageFilters, sumAlertCountFromAlertCountTable, parseAlertsCountToInt, @@ -61,7 +61,7 @@ describe.skip('Changing alert status', { tags: ['@ess', '@skipInServerless'] }, closeAlerts(); waitForAlerts(); waitForPageFilters(); - selectCountTable(); + selectAlertsCountTable(); }); it.skip('Open one alert when more than one closed alerts are selected', () => { @@ -103,7 +103,7 @@ describe.skip('Changing alert status', { tags: ['@ess', '@skipInServerless'] }, goToOpenedAlerts(); waitForAlerts(); - selectCountTable(); + selectAlertsCountTable(); cy.get(ALERTS_COUNT).should( 'have.text', @@ -126,7 +126,7 @@ describe.skip('Changing alert status', { tags: ['@ess', '@skipInServerless'] }, createRule(getNewRule()); visit(ALERTS_URL); waitForAlertsToPopulate(); - selectCountTable(); + selectAlertsCountTable(); }); it('Mark one alert as acknowledged when more than one open alerts are selected', () => { cy.get(ALERTS_COUNT) @@ -167,7 +167,7 @@ describe.skip('Changing alert status', { tags: ['@ess', '@skipInServerless'] }, createRule(getNewRule({ rule_id: '1', max_signals: 100 })); visit(ALERTS_URL); waitForAlertsToPopulate(); - selectCountTable(); + selectAlertsCountTable(); }); it.skip('Closes and opens alerts', () => { const numberOfAlertsToBeClosed = 3; @@ -319,7 +319,7 @@ describe.skip('Changing alert status', { tags: ['@ess', '@skipInServerless'] }, createRule(getNewRule()); visit(ALERTS_URL); waitForAlertsToPopulate(); - selectCountTable(); + selectAlertsCountTable(); }); it('Mark one alert as acknowledged when more than one open alerts are selected', () => { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/detection_page_filters.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/detection_page_filters.cy.ts index aeba2d5128e2f..051f7860c8dbe 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/detection_page_filters.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/detection_page_filters.cy.ts @@ -29,7 +29,6 @@ import { markAcknowledgedFirstAlert, openPageFilterPopover, resetFilters, - selectCountTable, selectPageFilterValue, togglePageFilterPopover, visitAlertsPageWithCustomFilters, @@ -236,7 +235,6 @@ describe.skip(`Detections : Page Filters`, { tags: ['@ess', '@serverless'] }, () }, () => { // mark status of one alert to be acknowledged - selectCountTable(); cy.get(ALERTS_COUNT) .invoke('text') .then((noOfAlerts) => { diff --git a/x-pack/test/security_solution_cypress/cypress/screens/alerts.ts b/x-pack/test/security_solution_cypress/cypress/screens/alerts.ts index 1f7e702873478..35c46e9f97557 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/alerts.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/alerts.ts @@ -72,8 +72,6 @@ export const MESSAGE = '[data-test-subj="formatted-field-message"]'; export const SELECTED_ALERTS = '[data-test-subj="selectedShowBulkActionsButton"]'; -export const SELECT_AGGREGATION_CHART = '[data-test-subj="chart-select-table"]'; - export const SEND_ALERT_TO_TIMELINE_BTN = '[data-test-subj="send-alert-to-timeline-button"]'; export const OPEN_ANALYZER_BTN = '[data-test-subj="view-in-analyzer"]'; @@ -131,6 +129,33 @@ export const ACTIONS_EXPAND_BUTTON = '[data-test-subj="euiDataGridCellExpandButt export const SHOW_TOP_N_HEADER = '[data-test-subj="topN-container"] [data-test-subj="header-section-title"]'; +export const SESSION_VIEWER_BUTTON = '[data-test-subj="session-view-button"]'; + +export const OVERLAY_CONTAINER = '[data-test-subj="overlayContainer"]'; + +/** + * Alerts KPIs + */ + +export const ALERT_CHARTS_TOGGLE_BUTTON = getDataTestSubjectSelector('query-toggle-header'); + +export const SELECT_OVERVIEW_CHARTS = getDataTestSubjectSelector('chart-select-charts'); + +export const ALERT_SUMMARY_CHARTS = getDataTestSubjectSelector('alerts-charts-panel'); + +export const ALERT_SUMMARY_SEVERITY_DONUT_CHART = + getDataTestSubjectSelector('severity-level-donut'); + +export const ALERT_SUMMARY_RULES_TABLE = getDataTestSubjectSelector('alerts-by-rule-panel'); + +export const ALERT_SUMMARY_PROGRESS_BAR_CHARTS = getDataTestSubjectSelector( + 'alerts-progress-bar-panel' +); + +export const ALERT_SUMMARY_CHARTS_COLLAPSED = getDataTestSubjectSelector('chart-collapse'); + +export const ALERTS_HISTOGRAM = getDataTestSubjectSelector('alerts-histogram-panel'); + export const ALERTS_HISTOGRAM_LEGEND = '[data-test-subj="alerts-histogram-panel"] .echLegendItem__action'; @@ -146,12 +171,13 @@ export const LEGEND_ACTIONS = { COPY: (ruleName: string) => `[data-test-subj="legend-${ruleName}-embeddable_copyToClipboard"]`, }; -export const SESSION_VIEWER_BUTTON = '[data-test-subj="session-view-button"]'; +export const ALERT_COUNT_TABLE = getDataTestSubjectSelector('alertsCountPanel'); -export const OVERLAY_CONTAINER = '[data-test-subj="overlayContainer"]'; +export const SELECT_COUNTS_TABLE = '[data-test-subj="chart-select-table"]'; -export const ALERT_SUMMARY_SEVERITY_DONUT_CHART = - getDataTestSubjectSelector('severity-level-donut'); +export const SELECT_TREEMAP = getDataTestSubjectSelector('chart-select-treemap'); + +export const ALERT_TREEMAP = getDataTestSubjectSelector('treemapPanel'); export const ALERT_TAGGING_CONTEXT_MENU_ITEM = '[data-test-subj="alert-tags-context-menu-item"]'; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/alerts.ts b/x-pack/test/security_solution_cypress/cypress/tasks/alerts.ts index abd405e1d6c73..6adcd97bd8c28 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/alerts.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/alerts.ts @@ -18,7 +18,9 @@ import { MARK_ALERT_ACKNOWLEDGED_BTN, OPEN_ALERT_BTN, SEND_ALERT_TO_TIMELINE_BTN, - SELECT_AGGREGATION_CHART, + ALERT_CHARTS_TOGGLE_BUTTON, + SELECT_COUNTS_TABLE, + SELECT_TREEMAP, TAKE_ACTION_POPOVER_BTN, TIMELINE_CONTEXT_MENU_BTN, CLOSE_FLYOUT, @@ -264,14 +266,22 @@ export const openAlerts = () => { cy.get(OPEN_ALERT_BTN).click(); }; -export const selectCountTable = () => { - cy.get(SELECT_AGGREGATION_CHART).click({ force: true }); +export const toggleKPICharts = () => { + cy.get(ALERT_CHARTS_TOGGLE_BUTTON).click(); +}; + +export const selectAlertsCountTable = () => { + cy.get(SELECT_COUNTS_TABLE).click(); }; export const selectAlertsHistogram = () => { cy.get(SELECT_HISTOGRAM).click(); }; +export const selectAlertsTreemap = () => { + cy.get(SELECT_TREEMAP).click(); +}; + export const goToAcknowledgedAlerts = () => { /* * below line commented because alertPageFiltersEnabled feature flag diff --git a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/health_route.ts b/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/health_route.ts index aa4f68e1fedd8..7b536025715f0 100644 --- a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/health_route.ts +++ b/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/health_route.ts @@ -129,7 +129,7 @@ export default function ({ getService }: FtrProviderContext) { const health = await getHealth(); expect(health.status).to.eql('OK'); expect(health.stats.configuration.value).to.eql({ - poll_interval: 3000, + poll_interval: 500, monitored_aggregated_stats_refresh_rate: monitoredAggregatedStatsRefreshRate, monitored_stats_running_average_window: 50, monitored_task_execution_thresholds: { diff --git a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/metrics_route.ts b/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/metrics_route.ts index 4fad194abf368..3e37c488e5190 100644 --- a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/metrics_route.ts +++ b/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/metrics_route.ts @@ -52,7 +52,10 @@ export default function ({ getService }: FtrProviderContext) { // counters are reset every 30 seconds, so wait until the start of a // fresh counter cycle to make sure values are incrementing const initialMetrics = ( - await getMetrics(false, (metrics) => metrics?.metrics?.task_claim?.value.total === 1) + await getMetrics( + false, + (metrics) => (metrics?.metrics?.task_claim?.value.total || 0) >= 1 + ) ).metrics; expect(initialMetrics).not.to.be(null); expect(initialMetrics?.task_claim).not.to.be(null); @@ -92,7 +95,7 @@ export default function ({ getService }: FtrProviderContext) { const initialMetrics = ( await getMetrics( false, - (metrics) => metrics?.metrics?.task_claim?.value.total === initialCounterValue + (metrics) => (metrics?.metrics?.task_claim?.value.total || 0) >= initialCounterValue ) ).metrics; expect(initialMetrics).not.to.be(null); @@ -101,7 +104,10 @@ export default function ({ getService }: FtrProviderContext) { // retry until counter value resets const resetMetrics = ( - await getMetrics(false, (m: NodeMetrics) => m?.metrics?.task_claim?.value.total === 1) + await getMetrics( + false, + (m: NodeMetrics) => (m?.metrics?.task_claim?.value.total || 0) >= 1 + ) ).metrics; expect(resetMetrics).not.to.be(null); expect(resetMetrics?.task_claim).not.to.be(null); @@ -113,7 +119,7 @@ export default function ({ getService }: FtrProviderContext) { const initialMetrics = ( await getMetrics( false, - (metrics) => metrics?.metrics?.task_claim?.value.total === initialCounterValue + (metrics) => (metrics?.metrics?.task_claim?.value.total || 0) >= initialCounterValue ) ).metrics; expect(initialMetrics).not.to.be(null); @@ -133,8 +139,8 @@ export default function ({ getService }: FtrProviderContext) { expect(metrics?.task_claim).not.to.be(null); expect(metrics?.task_claim?.value).not.to.be(null); - expect(metrics?.task_claim?.value.success).to.equal(1); - expect(metrics?.task_claim?.value.total).to.equal(1); + expect(metrics?.task_claim?.value.success).to.be.greaterThan(0); + expect(metrics?.task_claim?.value.total).to.be.greaterThan(0); previousTaskClaimTimestamp = metrics?.task_claim?.timestamp!; diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_default_app_state.ts b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_default_app_state.ts index 2808686ab0b09..c99f556b2f52d 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_default_app_state.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_default_app_state.ts @@ -127,7 +127,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); }); - describe('data view mode', () => { + // FLAKY: https://github.com/elastic/kibana/issues/189994 + describe.skip('data view mode', () => { it('should render default columns and row height', async () => { await PageObjects.common.navigateToActualUrl('discover', undefined, { ensureCurrentUrl: false, diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts index 0d1e2b3de6a02..cc28ff938572b 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts @@ -114,11 +114,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await testSubjects.exists('unifiedHistogramChart')).to.be(false); }); - it('should render the histogram for indices with no @timestamp field when the ?start, ?end params are in the query', async function () { + it('should render the histogram for indices with no @timestamp field when the ?t_start, ?t_end params are in the query', async function () { await PageObjects.discover.selectTextBaseLang(); await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); - const testQuery = `from kibana_sample_data_flights | limit 10 | where timestamp >= ?start and timestamp <= ?end`; + const testQuery = `from kibana_sample_data_flights | limit 10 | where timestamp >= ?t_start and timestamp <= ?t_end`; await monacoEditor.setCodeEditorValue(testQuery); await testSubjects.click('querySubmitButton'); diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover.ts index 8567b292b2407..531202481ba84 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover.ts @@ -216,15 +216,19 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/189943 - // FLAKY: https://github.com/elastic/kibana/issues/190058 - describe.skip('time zone switch', () => { + describe('time zone switch', () => { it('should show bars in the correct time zone after switching', async function () { await kibanaServer.uiSettings.update({ 'dateFormat:tz': 'America/Phoenix' }); await PageObjects.common.navigateToApp('discover'); await PageObjects.header.awaitKibanaChrome(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); await PageObjects.timePicker.setDefaultAbsoluteRange(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); await queryBar.clearQuery(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); log.debug( 'check that the newest doc timestamp is now -7 hours from the UTC time in the first test' diff --git a/x-pack/test_serverless/functional/test_suites/common/discover_ml_uptime/discover/search_source_alert.ts b/x-pack/test_serverless/functional/test_suites/common/discover_ml_uptime/discover/search_source_alert.ts index c0db1ecd0ff74..4708d1f453c31 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover_ml_uptime/discover/search_source_alert.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover_ml_uptime/discover/search_source_alert.ts @@ -235,6 +235,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const getResultsLink = async () => { // getting the link await dataGrid.clickRowToggle(); + await testSubjects.click('toggleLongFieldValue-context_link'); const contextMessageElement = await testSubjects.find('tableDocViewRow-context_link-value'); const contextMessage = await contextMessageElement.getVisibleText(); diff --git a/x-pack/test_serverless/functional/test_suites/common/saved_objects_management/hidden_from_http_apis.ts b/x-pack/test_serverless/functional/test_suites/common/saved_objects_management/hidden_from_http_apis.ts index d5edfb0e73bf2..6857dd73a2c4f 100644 --- a/x-pack/test_serverless/functional/test_suites/common/saved_objects_management/hidden_from_http_apis.ts +++ b/x-pack/test_serverless/functional/test_suites/common/saved_objects_management/hidden_from_http_apis.ts @@ -11,6 +11,11 @@ import type { Response } from 'supertest'; import { SavedObject } from '@kbn/core/types'; import { FtrProviderContext } from '../../../ftr_provider_context'; +interface MinimalSO { + id: string; + type: string; +} + function parseNdJson(input: string): Array> { return input.split('\n').map((str) => JSON.parse(str)); } @@ -118,10 +123,12 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { .expect(200) .then((resp) => { expect( - resp.body.saved_objects.map((so: { id: string; type: string }) => ({ - id: so.id, - type: so.type, - })) + resp.body.saved_objects + .map((so: MinimalSO) => ({ + id: so.id, + type: so.type, + })) + .sort((a: MinimalSO, b: MinimalSO) => (a.id > b.id ? 1 : -1)) ).to.eql([ { id: 'hidden-from-http-apis-1', diff --git a/yarn.lock b/yarn.lock index 275db4d57f16c..5f7cee38ed2a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6368,6 +6368,10 @@ version "0.0.0" uid "" +"@kbn/server-route-repository-client@link:packages/kbn-server-route-repository-client": + version "0.0.0" + uid "" + "@kbn/server-route-repository-utils@link:packages/kbn-server-route-repository-utils": version "0.0.0" uid "" @@ -6716,6 +6720,10 @@ version "0.0.0" uid "" +"@kbn/synthetics-private-location@link:x-pack/packages/kbn-synthetics-private-location": + version "0.0.0" + uid "" + "@kbn/task-manager-fixture-plugin@link:x-pack/test/alerting_api_integration/common/plugins/task_manager_fixture": version "0.0.0" uid "" @@ -8230,12 +8238,12 @@ require-from-string "^2.0.2" uri-js "^4.2.2" -"@redocly/cli@^1.18.1": - version "1.18.1" - resolved "https://registry.yarnpkg.com/@redocly/cli/-/cli-1.18.1.tgz#a811d33be83885cdae973bcdf30455b8bb2bffc1" - integrity sha512-+bRKj46R9wvTzMdnoYfMueJ9/ek0NprEsQNowV7XcHgOXifeFFikRtBFcpkwqCNxaQ/nWAJn4LHZaFcssbcHow== +"@redocly/cli@^1.19.0": + version "1.19.0" + resolved "https://registry.yarnpkg.com/@redocly/cli/-/cli-1.19.0.tgz#fa7ac88c50b8850c1358bb68a22a3330efe0e0b0" + integrity sha512-ev6J0eD+quprvW9PVCl9JmRFZbj6cuK+mnYPAjcrPvesy2RF752fflcpgQjGnyFaGb1Cj+DiwDi3dYr3EAp04A== dependencies: - "@redocly/openapi-core" "1.18.1" + "@redocly/openapi-core" "1.19.0" abort-controller "^3.0.0" chokidar "^3.5.1" colorette "^1.2.0" @@ -8260,10 +8268,10 @@ resolved "https://registry.yarnpkg.com/@redocly/config/-/config-0.7.0.tgz#e8d06dc1f2d9cb9a4b5c5ce09afbf8536b32161c" integrity sha512-6GKxTo/9df0654Mtivvr4lQnMOp+pRj9neVywmI5+BwfZLTtkJnj2qB3D6d8FHTr4apsNOf6zTa5FojX0Evh4g== -"@redocly/openapi-core@1.18.1", "@redocly/openapi-core@^1.4.0": - version "1.18.1" - resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.18.1.tgz#b23cdc647db3ecb787995e9f78b569c13c33fb0d" - integrity sha512-y2ZR3aaVF80XRVoFP0Dp2z5DeCOilPTuS7V4HnHIYZdBTfsqzjkO169h5JqAaifnaLsLBhe3YArdgLb7W7wW6Q== +"@redocly/openapi-core@1.19.0", "@redocly/openapi-core@^1.4.0": + version "1.19.0" + resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.19.0.tgz#8c6db2f0286b7776d79e392335f89f702ea19432" + integrity sha512-ezK6qr80sXvjDgHNrk/zmRs9vwpIAeHa0T/qmo96S+ib4ThQ5a8f3qjwEqxMeVxkxCTbkaY9sYSJKOxv4ejg5w== dependencies: "@redocly/ajv" "^8.11.0" "@redocly/config" "^0.7.0" @@ -17144,6 +17152,15 @@ eslint-plugin-cypress@^2.15.1: dependencies: globals "^13.20.0" +eslint-plugin-depend@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-depend/-/eslint-plugin-depend-0.9.0.tgz#966af1287abc6e73b3467b4c4472b1ed8ef950b3" + integrity sha512-LApHjbTFvzuZR2hpHt67ehawywGpmLAQV0Th65oiTssmXk2UcbXdsr0+hCQFdV+C30HMZHSwofL0BSzLveNACA== + dependencies: + fd-package-json "^1.2.0" + module-replacements "^2.1.0" + semver "^7.6.0" + eslint-plugin-es@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz#98cb1bc8ab0aa807977855e11ad9d1c9422d014b" @@ -17924,6 +17941,13 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" +fd-package-json@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fd-package-json/-/fd-package-json-1.2.0.tgz#4f218bb8ff65c21011d1f4f17cb3d0c9e72f8da7" + integrity sha512-45LSPmWf+gC5tdCQMNH4s9Sr00bIkiD9aN7dc5hqkrEw1geRYyDQS1v1oMHAW3ysfxfndqGsrDREHHjNNbKUfA== + dependencies: + walk-up-path "^3.0.1" + fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -23534,6 +23558,11 @@ module-lookup-amd@^8.0.5: requirejs "^2.3.6" requirejs-config-file "^4.0.0" +module-replacements@^2.1.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/module-replacements/-/module-replacements-2.3.2.tgz#285600e9ccf15c37d2a37c9a5690e4a6754a5941" + integrity sha512-dK8FQwOCU0rKuqtS2kWIU6It0XrE8qYZWtDT6fK4BQPtcspQ9EjWo2V0hob2d6G1wvQ21q+b1HFHOp3E/0cQTg== + moment-duration-format@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/moment-duration-format/-/moment-duration-format-2.3.2.tgz#5fa2b19b941b8d277122ff3f87a12895ec0d6212" @@ -26224,11 +26253,6 @@ pure-rand@^6.0.0: resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== -q@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - qs@6.10.4: version "6.10.4" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.4.tgz#6a3003755add91c0ec9eacdc5f878b034e73f9e7" @@ -28343,7 +28367,7 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.0, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.2, semver@^7.6.3: +semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.0, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.2, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -31903,6 +31927,11 @@ w3c-xmlserializer@^3.0.0: dependencies: xml-name-validator "^4.0.0" +walk-up-path@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-3.0.1.tgz#c8d78d5375b4966c717eb17ada73dbd41490e886" + integrity sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA== + walker@^1.0.7, walker@^1.0.8, walker@~1.0.5: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f"